commit e888d9dfb9b502ee3eab3970c4fe6144247d1f90 Author: Draqoken <67341000+audioses@users.noreply.github.com> Date: Tue Jul 1 23:28:00 2025 +0300 initial release diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7a9a55d --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +cosmic rage/worlds/plugins/state/*.xmlcosmic rage/worlds/plugins/state/* +!cosmic rage/worlds/plugins/state/.gitkeep \ No newline at end of file diff --git a/cleaner.bat b/cleaner.bat new file mode 100644 index 0000000..6c5600b --- /dev/null +++ b/cleaner.bat @@ -0,0 +1,35 @@ +@echo off +echo This script will rewrite git history, keeping only the last commit as the new root. +echo It will also force push to your remote. BACK UP FIRST! +pause + +REM Get the current branch name into a variable +FOR /F "delims=" %%i IN ('git rev-parse --abbrev-ref HEAD') DO set CURRENT_BRANCH=%%i + +echo Current branch is: %CURRENT_BRANCH% +pause + +REM Create a temporary branch from the last commit +git checkout --orphan temp_branch + +REM Reset temp_branch to the last commit (keeps files staged) +git reset --hard HEAD + +REM Delete old branch +git branch -D %CURRENT_BRANCH% + +REM Rename temp_branch to original branch name +git branch -m %CURRENT_BRANCH% + +REM Force garbage collection to remove old commits +git reflog expire --expire=now --all +git gc --prune=now --aggressive + +echo Will now force push to remote! +pause + +REM Force push to remote origin (replace with your remote if needed) +git push -f origin %CURRENT_BRANCH% + +echo Done! The repo now only contains the last commit as the initial release. +pause diff --git a/cosmic rage/Dina.fon b/cosmic rage/Dina.fon new file mode 100644 index 0000000..4a8734a Binary files /dev/null and b/cosmic rage/Dina.fon differ diff --git a/cosmic rage/Example_filters.lua b/cosmic rage/Example_filters.lua new file mode 100644 index 0000000..56a6185 --- /dev/null +++ b/cosmic rage/Example_filters.lua @@ -0,0 +1,188 @@ +-- --------------------------------------------------------------- +-- Example Trigger filters (paste into "filter by" script box +-- in the trigger list). +-- --------------------------------------------------------------- + + +function send_to_script (name, trigger) + return trigger.send_to == sendto.script and + trigger.enabled +end -- send_to_script + +function enabled (name, trigger) + return trigger.enabled +end -- enabled + +function disabled (name, trigger) + return not trigger.enabled +end -- disabled + +function keep_evaluating (name, trigger) + return trigger.keep_evaluating +end -- keep_evaluating + +function badscript (name, trigger) + return not trigger.script_valid and + trigger.script ~= "" +end -- badscript + +function temporary (name, trigger) + return trigger.temporary +end -- temporary + +function matched (name, trigger) + return trigger.times_matched > 0 +end -- matched + +function unmatched (name, trigger) + return trigger.times_matched == 0 +end -- unmatched + +-- if they cancel, show everything +function everything (name, trigger) + return true +end -- everything + +-- choose which function to use +result = utils.listbox ("Choose type of filtering", "Triggers", + { + send_to_script = "Send to script and enabled", + enabled = "Enabled items", + disabled = "Disabled items", + badscript = "Script name not found", + keep_evaluating = "Keep evaluating", + temporary = "Temporary triggers", + matched = "Ones that matched something", + unmatched = "Ones that never matched", + }, + "badscript") -- default + +-- use that function +filter = _G [result] or everything + + + +-- --------------------------------------------------------------- +-- Example Alias filters (paste into "filter by" script box +-- in the alias list). +-- --------------------------------------------------------------- + +function send_to_script (name, alias) + return alias.send_to == sendto.script and + alias.enabled +end -- send_to_script + +function enabled (name, alias) + return alias.enabled +end -- enabled + +function disabled (name, alias) + return not alias.enabled +end -- disabled + +function keep_evaluating (name, alias) + return alias.keep_evaluating +end -- keep_evaluating + +function badscript (name, alias) + return not alias.script_valid and + alias.script ~= "" +end -- badscript + +function temporary (name, alias) + return alias.temporary +end -- temporary + +function matched (name, alias) + return alias.times_matched > 0 +end -- matched + +function unmatched (name, alias) + return alias.times_matched == 0 +end -- unmatched + +-- if they cancel, show everything +function everything (name, alias) + return true +end -- everything + +-- choose which function to use +result = utils.listbox ("Choose type of filtering", "Aliases", + { + send_to_script = "Send to script and enabled", + enabled = "Enabled items", + disabled = "Disabled items", + badscript = "Script name not found", + keep_evaluating = "Keep evaluating", + temporary = "Temporary aliases", + matched = "Ones that matched something", + unmatched = "Ones that never matched", + }, + "badscript") -- default + +-- use that function +filter = _G [result] or everything + + +-- --------------------------------------------------------------- +-- Example Timer filters (paste into "filter by" script box +-- in the timer list). +-- --------------------------------------------------------------- + + +function send_to_script (name, timer) + return timer.send_to == sendto.script and + timer.enabled +end -- send_to_script + +function enabled (name, timer) + return timer.enabled +end -- enabled + +function disabled (name, timer) + return not timer.enabled +end -- disabled + +function one_shot (name, timer) + return timer.one_shot +end -- one_shot + +function badscript (name, timer) + return not timer.script_valid and + timer.script ~= "" +end -- badscript + +function temporary (name, timer) + return timer.temporary +end -- temporary + +function fired (name, timer) + return timer.times_fired > 0 +end -- fired + +function not_fired (name, timer) + return timer.times_fired == 0 +end -- not_fired + +-- if they cancel, show everything +function everything (name, timer) + return true +end -- everything + +-- choose which function to use +result = utils.listbox ("Choose type of filtering", "Timers", + { + send_to_script = "Send to script and enabled", + enabled = "Enabled items", + disabled = "Disabled items", + badscript = "Script name not found", + one_shot = "One-shot timers", + temporary = "Temporary timers", + fired = "Ones that fired", + not_fired = "Ones that never fired", + }, + "badscript") -- default + +-- use that function +filter = _G [result] or everything + diff --git a/cosmic rage/MUSHCLIENT.HLP b/cosmic rage/MUSHCLIENT.HLP new file mode 100644 index 0000000..46e503d Binary files /dev/null and b/cosmic rage/MUSHCLIENT.HLP differ diff --git a/cosmic rage/MUSHclient.exe b/cosmic rage/MUSHclient.exe new file mode 100644 index 0000000..045e1f2 Binary files /dev/null and b/cosmic rage/MUSHclient.exe differ diff --git a/cosmic rage/MUSHclient.ini b/cosmic rage/MUSHclient.ini new file mode 100644 index 0000000..3c79cda --- /dev/null +++ b/cosmic rage/MUSHclient.ini @@ -0,0 +1,78 @@ +[CtrlBars-Summary] +Bars=7 +ScreenCX=1280 +ScreenCY=720 +[CtrlBars-Bar0] +BarID=59392 +XPos=-2 +YPos=-2 +Docking=1 +MRUDockID=0 +MRUDockLeftPos=-2 +MRUDockTopPos=-2 +MRUDockRightPos=263 +MRUDockBottomPos=24 +MRUFloatStyle=8196 +MRUFloatXPos=-1 +MRUFloatYPos=688 +[CtrlBars-Bar1] +BarID=59393 +[CtrlBars-Bar2] +BarID=128 +XPos=-2 +YPos=22 +Docking=1 +MRUDockID=0 +MRUDockLeftPos=-2 +MRUDockTopPos=22 +MRUDockRightPos=476 +MRUDockBottomPos=48 +MRUFloatStyle=8196 +MRUFloatXPos=-1 +MRUFloatYPos=688 +[CtrlBars-Bar3] +BarID=32944 +XPos=-2 +YPos=46 +Docking=1 +MRUDockID=0 +MRUDockLeftPos=-2 +MRUDockTopPos=46 +MRUDockRightPos=239 +MRUDockBottomPos=72 +MRUFloatStyle=8196 +MRUFloatXPos=-1 +MRUFloatYPos=0 +[CtrlBars-Bar4] +BarID=32988 +XPos=-2 +YPos=-2 +Docking=1 +MRUDockID=0 +MRUDockLeftPos=-2 +MRUDockTopPos=-2 +MRUDockRightPos=1005 +MRUDockBottomPos=19 +MRUFloatStyle=4 +MRUFloatXPos=-1 +MRUFloatYPos=0 +[CtrlBars-Bar5] +BarID=59419 +Bars=7 +Bar#0=0 +Bar#1=59392 +Bar#2=0 +Bar#3=128 +Bar#4=0 +Bar#5=32944 +Bar#6=0 +[CtrlBars-Bar6] +BarID=59422 +Bars=3 +Bar#0=0 +Bar#1=32988 +Bar#2=0 +[Recent File List] +File1=C:\Users\mario\Cosmic Rage Soundpack GIT\Mush Repo\Mush-Soundpack\cosmic rage\worlds\Cosmic Rage\cosmic rage.MCL +File2=D:\my files\repos\Mush-Soundpack\cosmic rage\worlds\Cosmic Rage\cosmic rage.MCL +File3=C:\Users\user\Documents\Mush\MUSHclient\worlds\Cosmic Rage\cosmic rage.MCL diff --git a/cosmic rage/audio.dll b/cosmic rage/audio.dll new file mode 100644 index 0000000..e74912a Binary files /dev/null and b/cosmic rage/audio.dll differ diff --git a/cosmic rage/bass.dll b/cosmic rage/bass.dll new file mode 100644 index 0000000..87cd831 Binary files /dev/null and b/cosmic rage/bass.dll differ diff --git a/cosmic rage/docs/JSON License.txt b/cosmic rage/docs/JSON License.txt new file mode 100644 index 0000000..8e42fbf --- /dev/null +++ b/cosmic rage/docs/JSON License.txt @@ -0,0 +1,28 @@ +The following license is applied to all documents in this project with the +exception of the 'tests' directory at the root. +The 'tests' directory is dual-licenses Public Domain / MIT, whichever is +least restrictive in your legal jurisdiction. + +The MIT License + +Copyright (c) 2008 Thomas Harning Jr. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +-- diff --git a/cosmic rage/docs/Lua Colors LICENSE.txt b/cosmic rage/docs/Lua Colors LICENSE.txt new file mode 100644 index 0000000..402af73 --- /dev/null +++ b/cosmic rage/docs/Lua Colors LICENSE.txt @@ -0,0 +1,24 @@ +Copyright (c) 2007, 2008 Yuri Takhteyev + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +-- diff --git a/cosmic rage/docs/LuaJSON.txt b/cosmic rage/docs/LuaJSON.txt new file mode 100644 index 0000000..c18e2e4 --- /dev/null +++ b/cosmic rage/docs/LuaJSON.txt @@ -0,0 +1,206 @@ +LuaJSON(3) +========== +:Author: Thomas Harning +:Email: harningt@gmail.com +:Date: 2009/04/29 + +NAME +---- +luajson - JSON encoder/decoder for Lua + +SYNOPSIS +-------- +require("json") + +json.decode("json-string" [, parameters]) + +json.decode.getDecoder(parameters) + +json.encode(lua_value [, parameters]) + +json.encode.getEncoder(parameters) + +DESCRIPTION +----------- +json.decode("json-string" [, parameters]):: + Obtains a JSON decoder using `getDecoder` with the parameters specified, + then performs the decoding operation. + +json.encode(lua_value [, parameters]):: + Obtains a JSON encoder using `getEncoder` with the parameters specified, + then performs the encoding operation. + +json.decode.getDecoder(parameters):: + Obtains a JSON decoder configured with the given parameters or defaults. + +json.encode.getEncoder(parameters):: + Obtains a JSON encoder configured with the given parameters or defaults. + +json.encode.strict:: + A default parameter specification containing 'strict' rules for encoding + +json.decode.strict:: + A default parameter specification containing 'strict' rules for decoding + +=== COMMON PARAMETERS + +initialObject : boolean:: + Specifies if the outermost element be an array or object + +allowUndefined : boolean:: + Specifies if 'undefined' is an allowed value + +null : any:: + Placeholder object for null values + +undefined : any:: + Placeholder for undefined values + +number.nan : boolean:: + Specifies if NaN is an allowed value + +number.inf : boolean:: + Specifies if +/-Infinity is an allowed value + +=== ENCODER-SPECIFIC PARAMETERS + +preProcess : `function(object)`:: + Called for every value to be encoded, optionally altering. + If returns `nil` then no value change occurs. + +output : function:: + Function that returns an encoder specification (TBD), if null + default used that returns a string. + +array.isArray : `function(object)`:: + If `true`/`false` returned, then the value is authoritatively + an array or not + +strings.xEncode : boolean:: + Specifies if binary values are to be encoded with \xNN rather than \uNNNN + +strings.encodeSet : string:: + http://www.lua.org/manual/5.1/manual.html#5.4.1[gmatch-style] set of + characters that need to be escaped (to be contained in `[]`) + +strings.encodeSetAppend : string:: + Set of characters that need to be escaped (to be contained in `[]`). + Appended to the current encodeSet. + +==== Default Configuration +[source,lua] +---- +array.isArray == json-util's isArray implementation +allowUndefined = true +number.nan = true +number.inf = true +strings.xEncode = false +strings.encodeSet = '\\"/%z\1-\031' +---- + +==== Strict Configuration +[source,lua] +---- +initialObject = true +allowUndefined = false +number.nan = false +number.inf = false +---- + +=== DECODER-SPECIFIC PARAMETERS + +unicodeWhitespace : boolean:: + Specifies if unicode whitespace characters are counted + +array.trailingComma / object.trailingComma : boolean:: + Specifies if extraneous trailing commas are ignored in declaration + +calls.defs : map:: + Defines set of specifically permitted function definitions. + If boolean value, determines if allowed or not, decoded as a call object. + Function return-value is the decoded result. + Function definition: `function(name, [arguments])` : output-value + +calls.allowUndefined : boolean:: + Specifies if undefined call definitions are decoded as call objects. + +number.frac : boolean:: + Specifies if numbers can have a decimal component (ex: `.01`) + +number.exp : boolean:: + Specifies if exponents are allowed (ex: `1e2`) + +number.hex : boolean:: + Specifies if hexadecimal numbers are allowed (ex: `0xDEADBEEF`) + +object.number : boolean:: + Specifies if numbers can be object keys + +object.identifier : boolean:: + Specifies if unquoted 'identifiers' can be object keys (matching `[A-Za-z_][A-Za-z0-9_]*`) + +strings.badChars : string:: + Set of characters that should not be present in a string + +strings.additionalEscapes : LPeg expression:: + LPeg expression to handle output (ex: `lpeg.C(1)` would take `\k` and spit out `k`) + +strings.escapeCheck : non-consuming LPeg expression:: + LPeg expression to check if a given character is allowed to be an escape value + +strings.decodeUnicode:: + `function (XX, YY)` handling \uXXYY situation to output decoded unicode sequence + +strings.strict_quotes : boolean:: + Specifies if the `'` character is considered a quoting specifier + +==== Default configuration + +[source,lua] +---- +unicodeWhitespace = true +initialObject = false +allowUndefined = true +array.trailingComma = true +number.frac = true +number.exp = true +number.hex = false +object.number = true +object.identifier = true +object.trailingComma = true +strings.badChars = '' -- No characters considered bad in a string +strings.additionalEscapes = false, -- disallow untranslated escapes +strings.escapeCheck = #lpeg.S('bfnrtv/\\"xu\'z'), +strings.decodeUnicode = utf8DecodeUnicode, +strings.strict_quotes = false +---- + +==== Strict configuration + +[source,lua] +---- +initialObject = true +allowUndefined = false +array.trailingComma = false +object.identifier = false +object.trailingComma = false +strings.badChars = '\b\f\n\r\t\v' +strings.additionalEscapes = false -- no additional escapes +strings.escapeCheck = #lpeg.S('bfnrtv/\\"u') --only these are allowed to be escaped +strings.strict_quotes = true +---- + +AUTHOR +------ +Written by Thomas Harning Jr., + +REFERENCES +---------- +http://www.inf.puc-rio.br/~roberto/lpeg[LPeg] + +http://json.org[JSON] + +COPYING +------- +Copyright (C) 2008-2009 Thomas Harning Jr. Free use of this software is granted +under the terms of the MIT license. diff --git a/cosmic rage/docs/LuaSocket_documentation/dns.html b/cosmic rage/docs/LuaSocket_documentation/dns.html new file mode 100644 index 0000000..f4c3b07 --- /dev/null +++ b/cosmic rage/docs/LuaSocket_documentation/dns.html @@ -0,0 +1,132 @@ + + + + + + +LuaSocket: DNS support + + + + + + + +
+
+
+ + + +
+LuaSocket +
Network support for the Lua language +
+

+home · +download · +installation · +introduction · +reference +

+
+
+
+ + + +

DNS

+ +

+Name resolution functions return all information obtained from the +resolver in a table of the form: +

+ +
+resolved = {
+  name = canonic-name,
+  alias = alias-list,
+  ip = ip-address-list
+} +
+ +

+Note that the alias list can be empty. +

+ + + +

+socket.dns.gethostname() +

+ +

+Returns the standard host name for the machine as a string. +

+ + + +

+socket.dns.tohostname(address) +

+ +

+Converts from IP address to host name. +

+ +

+Address can be an IP address or host name. +

+ +

+The function returns a string with the canonic host name of the given +address, followed by a table with all information returned by +the resolver. In case of error, the function returns nil +followed by an error message. +

+ + + +

+socket.dns.toip(address) +

+ +

+Converts from host name to IP address. +

+ +

+Address can be an IP address or host name. +

+ +

+Returns a string with the first IP address found for address, +followed by a table with all information returned by the resolver. +In case of error, the function returns nil followed by an error +message. +

+ + + + + + + diff --git a/cosmic rage/docs/LuaSocket_documentation/ftp.html b/cosmic rage/docs/LuaSocket_documentation/ftp.html new file mode 100644 index 0000000..9884f31 --- /dev/null +++ b/cosmic rage/docs/LuaSocket_documentation/ftp.html @@ -0,0 +1,289 @@ + + + + + + +LuaSocket: FTP support + + + + + + + +
+
+
+ + + +
+LuaSocket +
Network support for the Lua language +
+

+home · +download · +installation · +introduction · +reference +

+
+
+
+ + + +

FTP

+ +

+FTP (File Transfer Protocol) is a protocol used to transfer files +between hosts. The ftp namespace offers thorough support +to FTP, under a simple interface. The implementation conforms to +RFC 959. +

+ +

+High level functions are provided supporting the most common operations. +These high level functions are implemented on top of a lower level +interface. Using the low-level interface, users can easily create their +own functions to access any operation supported by the FTP +protocol. For that, check the implementation. +

+ +

+To really benefit from this module, a good understanding of + +LTN012, Filters sources and sinks is necessary. +

+ +

+To obtain the ftp namespace, run: +

+ +
+-- loads the FTP module and any libraries it requires
+local ftp = require("socket.ftp")
+
+ +

+URLs MUST conform to +RFC +1738, that is, an URL is a string in the form: +

+ +
+ +[ftp://][<user>[:<password>]@]<host>[:<port>][/<path>][type=a|i] +
+ +

+The following constants in the namespace can be set to control the default behavior of +the FTP module: +

+ +
    +
  • PASSWORD: default anonymous password. +
  • PORT: default port used for the control connection; +
  • TIMEOUT: sets the timeout for all I/O operations; +
  • USER: default anonymous user; +
+ + + + +

+ftp.get(url)
+ftp.get{
+  host = string,
+  sink = LTN12 sink,
+  argument or path = string,
+  [user = string,]
+  [password = string]
+  [command = string,]
+  [port = number,]
+  [type = string,]
+  [step = LTN12 pump step,]
+  [create = function]
+} +

+ +

+The get function has two forms. The simple form has fixed +functionality: it downloads the contents of a URL and returns it as a +string. The generic form allows a lot more control, as explained +below. +

+ +

+If the argument of the get function is a table, the function +expects at least the fields host, sink, and one of +argument or path (argument takes +precedence). Host is the server to connect to. Sink is +the simple +LTN12 +sink that will receive the downloaded data. Argument or +path give the target path to the resource in the server. The +optional arguments are the following: +

+
    +
  • user, password: User name and password used for +authentication. Defaults to "ftp:anonymous@anonymous.org"; +
  • command: The FTP command used to obtain data. Defaults to +"retr", but see example below; +
  • port: The port to used for the control connection. Defaults to 21; +
  • type: The transfer mode. Can take values "i" or +"a". Defaults to whatever is the server default; +
  • step: +LTN12 +pump step function used to pass data from the +server to the sink. Defaults to the LTN12 pump.step function; +
  • create: An optional function to be used instead of +socket.tcp when the communications socket is created. +
+ +

+If successful, the simple version returns the URL contents as a +string, and the generic function returns 1. In case of error, both +functions return nil and an error message describing the +error. +

+ +
+-- load the ftp support
+local ftp = require("socket.ftp")
+
+-- Log as user "anonymous" on server "ftp.tecgraf.puc-rio.br",
+-- and get file "lua.tar.gz" from directory "pub/lua" as binary.
+f, e = ftp.get("ftp://ftp.tecgraf.puc-rio.br/pub/lua/lua.tar.gz;type=i")
+
+ +
+-- load needed modules
+local ftp = require("socket.ftp")
+local ltn12 = require("ltn12")
+local url = require("socket.url")
+
+-- a function that returns a directory listing
+function nlst(u)
+    local t = {}
+    local p = url.parse(u)
+    p.command = "nlst"
+    p.sink = ltn12.sink.table(t)
+    local r, e = ftp.get(p)
+    return r and table.concat(t), e
+end
+
+ + + +

+ftp.put(url, content)
+ftp.put{
+  host = string,
+  source = LTN12 sink,
+  argument or path = string,
+  [user = string,]
+  [password = string]
+  [command = string,]
+  [port = number,]
+  [type = string,]
+  [step = LTN12 pump step,]
+  [create = function]
+} +

+ +

+The put function has two forms. The simple form has fixed +functionality: it uploads a string of content into a URL. The generic form +allows a lot more control, as explained below. +

+ +

+If the argument of the put function is a table, the function +expects at least the fields host, source, and one of +argument or path (argument takes +precedence). Host is the server to connect to. Source is +the simple +LTN12 +source that will provide the contents to be uploaded. +Argument or +path give the target path to the resource in the server. The +optional arguments are the following: +

+
    +
  • user, password: User name and password used for +authentication. Defaults to "ftp:anonymous@anonymous.org"; +
  • command: The FTP command used to send data. Defaults to +"stor", but see example below; +
  • port: The port to used for the control connection. Defaults to 21; +
  • type: The transfer mode. Can take values "i" or +"a". Defaults to whatever is the server default; +
  • step: +LTN12 +pump step function used to pass data from the +server to the sink. Defaults to the LTN12 pump.step function; +
  • create: An optional function to be used instead of +socket.tcp when the communications socket is created. +
+ +

+Both functions return 1 if successful, or nil and an error +message describing the reason for failure. +

+ +
+-- load the ftp support
+local ftp = require("socket.ftp")
+
+-- Log as user "fulano" on server "ftp.example.com",
+-- using password "silva", and store a file "README" with contents 
+-- "wrong password, of course"
+f, e = ftp.put("ftp://fulano:silva@ftp.example.com/README", 
+    "wrong password, of course")
+
+ +
+-- load the ftp support
+local ftp = require("socket.ftp")
+local ltn12 = require("ltn12")
+
+-- Log as user "fulano" on server "ftp.example.com",
+-- using password "silva", and append to the remote file "LOG", sending the
+-- contents of the local file "LOCAL-LOG"
+f, e = ftp.put{
+  host = "ftp.example.com", 
+  user = "fulano",
+  password = "silva",
+  command = "appe",
+  argument = "LOG",
+  source = ltn12.source.file(io.open("LOCAL-LOG", "r"))
+}
+
+ + + + + + + + diff --git a/cosmic rage/docs/LuaSocket_documentation/http.html b/cosmic rage/docs/LuaSocket_documentation/http.html new file mode 100644 index 0000000..0acac13 --- /dev/null +++ b/cosmic rage/docs/LuaSocket_documentation/http.html @@ -0,0 +1,333 @@ + + + + + + +LuaSocket: HTTP support + + + + + + + +
+
+
+ + + +
+LuaSocket +
Network support for the Lua language +
+

+home · +download · +introduction · +introduction · +reference +

+
+
+
+ + + +

HTTP

+ +

+HTTP (Hyper Text Transfer Protocol) is the protocol used to exchange +information between web-browsers and servers. The http +namespace offers full support for the client side of the HTTP +protocol (i.e., +the facilities that would be used by a web-browser implementation). The +implementation conforms to the HTTP/1.1 standard, +RFC +2616. +

+ +

+The module exports functions that provide HTTP functionality in different +levels of abstraction. From the simple +string oriented requests, through generic +LTN12 based, down to even lower-level if you bother to look through the source code. +

+ +

+To obtain the http namespace, run: +

+ +
+-- loads the HTTP module and any libraries it requires
+local http = require("socket.http")
+
+ +

+URLs must conform to +RFC +1738, +that is, an URL is a string in the form: +

+ +
+
+[http://][<user>[:<password>]@]<host>[:<port>][/<path>] 
+
+
+ +

+MIME headers are represented as a Lua table in the form: +

+ +
+ + +
+headers = {
+  field-1-name = field-1-value,
+  field-2-name = field-2-value,
+  field-3-name = field-3-value,
+  ...
+  field-n-name = field-n-value
+} +
+
+ +

+Field names are case insensitive (as specified by the standard) and all +functions work with lowercase field names. +Field values are left unmodified. +

+ +

+Note: MIME headers are independent of order. Therefore, there is no problem +in representing them in a Lua table. +

+ +

+The following constants can be set to control the default behavior of +the HTTP module: +

+ +
    +
  • PORT: default port used for connections; +
  • PROXY: default proxy used for connections; +
  • TIMEOUT: sets the timeout for all I/O operations; +
  • USERAGENT: default user agent reported to server. +
+ + + +

+http.request(url [, body])
+http.request{
+  url = string,
+  [sink = LTN12 sink,]
+  [method = string,]
+  [headers = header-table,]
+  [source = LTN12 source],
+  [step = LTN12 pump step,]
+  [proxy = string,]
+  [redirect = boolean,]
+  [create = function]
+} +

+ +

+The request function has two forms. The simple form downloads +a URL using the GET or POST method and is based +on strings. The generic form performs any HTTP method and is +LTN12 based. +

+ +

+If the first argument of the request function is a string, it +should be an url. In that case, if a body +is provided as a string, the function will perform a POST method +in the url. Otherwise, it performs a GET in the +url +

+ +

+If the first argument is instead a table, the most important fields are +the url and the simple +LTN12 +sink that will receive the downloaded content. +Any part of the url can be overridden by including +the appropriate field in the request table. +If authentication information is provided, the function +uses the Basic Authentication Scheme (see note) +to retrieve the document. If sink is nil, the +function discards the downloaded data. The optional parameters are the +following: +

+
    +
  • method: The HTTP request method. Defaults to "GET"; +
  • headers: Any additional HTTP headers to send with the request; +
  • source: simple +LTN12 +source to provide the request body. If there +is a body, you need to provide an appropriate "content-length" +request header field, or the function will attempt to send the body as +"chunked" (something few servers support). Defaults to the empty source; +
  • step: +LTN12 +pump step function used to move data. +Defaults to the LTN12 pump.step function. +
  • proxy: The URL of a proxy server to use. Defaults to no proxy; +
  • redirect: Set to false to prevent the +function from automatically following 301 or 302 server redirect messages; +
  • create: An optional function to be used instead of +socket.tcp when the communications socket is created. +
+ +

+In case of failure, the function returns nil followed by an +error message. If successful, the simple form returns the response +body as a string, followed by the response status code, the response +headers and the response status line. The generic function returns the same +information, except the first return value is just the number 1 (the body +goes to the sink). +

+ +

+Even when the server fails to provide the contents of the requested URL (URL not found, for example), +it usually returns a message body (a web page informing the +URL was not found or some other useless page). To make sure the +operation was successful, check the returned status code. For +a list of the possible values and their meanings, refer to RFC +2616. +

+ +

+Here are a few examples with the simple interface: +

+ +
+-- load the http module
+local io = require("io")
+local http = require("socket.http")
+local ltn12 = require("ltn12")
+
+-- connect to server "www.cs.princeton.edu" and retrieves this manual
+-- file from "~diego/professional/luasocket/http.html" and print it to stdout
+http.request{ 
+    url = "http://www.cs.princeton.edu/~diego/professional/luasocket/http.html", 
+    sink = ltn12.sink.file(io.stdout)
+}
+
+-- connect to server "www.example.com" and tries to retrieve
+-- "/private/index.html". Fails because authentication is needed.
+b, c, h = http.request("http://www.example.com/private/index.html")
+-- b returns some useless page telling about the denied access, 
+-- h returns authentication information
+-- and c returns with value 401 (Authentication Required)
+
+-- tries to connect to server "wrong.host" to retrieve "/"
+-- and fails because the host does not exist.
+r, e = http.request("http://wrong.host/")
+-- r is nil, and e returns with value "host not found"
+
+ +

+And here is an example using the generic interface: +

+ +
+-- load the http module
+http = require("socket.http")
+
+-- Requests information about a document, without downloading it.
+-- Useful, for example, if you want to display a download gauge and need
+-- to know the size of the document in advance
+r, c, h = http.request {
+  method = "HEAD",
+  url = "http://www.tecgraf.puc-rio.br/~diego"
+}
+-- r is 1, c is 200, and h would return the following headers:
+-- h = {
+--   date = "Tue, 18 Sep 2001 20:42:21 GMT",
+--   server = "Apache/1.3.12 (Unix)  (Red Hat/Linux)",
+--   ["last-modified"] = "Wed, 05 Sep 2001 06:11:20 GMT",
+--   ["content-length"] = 15652,
+--   ["connection"] = "close",
+--   ["content-Type"] = "text/html"
+-- }
+
+ +

+Note: When sending a POST request, simple interface adds a +"Content-type: application/x-www-form-urlencoded" +header to the request. This is the type used by +HTML forms. If you need another type, use the generic +interface. +

+ +

+Note: Some URLs are protected by their +servers from anonymous download. For those URLs, the server must receive +some sort of authentication along with the request or it will deny +download and return status "401 Authentication Required". +

+ +

+The HTTP/1.1 standard defines two authentication methods: the Basic +Authentication Scheme and the Digest Authentication Scheme, both +explained in detail in +RFC 2068. +

+ +

The Basic Authentication Scheme sends +<user> and +<password> unencrypted to the server and is therefore +considered unsafe. Unfortunately, by the time of this implementation, +the wide majority of servers and browsers support the Basic Scheme only. +Therefore, this is the method used by the toolkit whenever +authentication is required. +

+ +
+-- load required modules
+http = require("socket.http")
+mime = require("mime")
+
+-- Connect to server "www.example.com" and tries to retrieve
+-- "/private/index.html", using the provided name and password to
+-- authenticate the request
+b, c, h = http.request("http://fulano:silva@www.example.com/private/index.html")
+
+-- Alternatively, one could fill the appropriate header and authenticate
+-- the request directly.
+r, c = http.request {
+  url = "http://www.example.com/private/index.html",
+  headers = { authentication = "Basic " .. (mime.b64("fulano:silva")) }
+}
+
+ + + + + + + diff --git a/cosmic rage/docs/LuaSocket_documentation/index.html b/cosmic rage/docs/LuaSocket_documentation/index.html new file mode 100644 index 0000000..57a7907 --- /dev/null +++ b/cosmic rage/docs/LuaSocket_documentation/index.html @@ -0,0 +1,208 @@ + + + + + + +LuaSocket: Network support for the Lua language + + + + + + + +
+
+
+ + + +
+LuaSocket +
Network support for the Lua language +
+

+home · +download · +installation · +introduction · +reference +

+
+
+
+ + + +

What is LuaSocket?

+ +

+LuaSocket is a Lua extension library +that is composed by two parts: a C core that provides support for the TCP +and UDP transport layers, and a set of Lua modules that add support for +functionality commonly needed by applications that deal with the Internet. +

+ +

+The core support has been implemented so that it is both efficient and +simple to use. It is available to any Lua application once it has been +properly initialized by the interpreter in use. The code has been tested +and runs well on several Windows and Unix platforms.

+ +

+Among the support modules, the most commonly used implement the +SMTP +(sending e-mails), +HTTP +(WWW access) and +FTP +(uploading and downloading files) client +protocols. These provide a very natural and generic interface to the +functionality defined by each protocol. +In addition, you will find that the +MIME (common encodings), +URL +(anything you could possible want to do with one) and +LTN12 +(filters, sinks, sources and pumps) modules can be very handy. +

+ +

+The library is available under the same + +terms and conditions as the Lua language, the MIT license. The idea is +that if you can use Lua in a project, you should also be able to use +LuaSocket. +

+ +

+Copyright © 2004-2007 Diego Nehab. All rights reserved.
+Author: Diego Nehab +

+ + + +

Download

+ +

+LuaSocket version 2.0.2 is now available for download! It is +compatible with Lua 5.1, and has +been tested on Windows XP, Linux, and Mac OS X. Chances +are it works well on most UNIX distributions and Windows flavors. +

+ +

+The library can be downloaded in source code from the +LuaSocket +project page at LuaForge. +Besides the full C and Lua source code for the library, the distribution +contains several examples, this user's manual and basic test procedures. +

+ +

+Danilo Tuler is maintaining Win32 binaries for LuaSocket, which are also +available from LuaForge. These are compatible with the +LuaBinaries, +also available from LuaForge. +

+ +

Take a look at the installation section of the +manual to find out how to properly install the library. +

+ + + +

Special thanks

+ +

+Throughout LuaSocket's history, many people gave suggestions that helped +improve it. For that, I thank the Lua community. +Special thanks go to +David Burgess, who has helped push the library to a new level of quality and +from whom I have learned a lot of stuff that doesn't show up in RFCs. +Special thanks also to Carlos Cassino, who played a big part in the +extensible design seen in the C core of LuaSocket 2.0. Mike Pall +has been helping a lot too! Thanks to you all! +

+ + + +

What's New

+ +

+2.0.2 is just a bug-fix/update release. +

+ +
    +
  • Improved: http.request() now supports deprecated +HTTP/0.9 servers (Florian Berger); +
  • Fixed: could return "timedout" instead of "timeout" (Leo Leo); +
  • Fixed: crash when reading '*a' on closed socket (Paul Ducklin); +
  • Fixed: return values are consistent when reading from closed sockets; +
  • Fixed: case sensitivity in headers of multipart +messages in smtp.message() (Graham Henstridge); +
  • Fixed a couple instances of error() being called instead of +base.error(). These would cause an error when an error was +reported :) (Ketmar Dark); +
  • Fixed: test script now uses pairs() iterator instead +of the old Lua syntax (Robert Dodier). +
+ +

+2.0.1 is just a bug-fix/update release. +

+ +
    +
  • Updated: now using compat-5.1r5; +
  • Improved: http.request is more robust to +malformed URLs (Adrian Sietsma); +
  • Improved: the simple http.request interface sends a +"Content-type: application/x-www-form-urlencoded" +header (William Trenker); +
  • Improved: http.request is robust to evil +servers that send inappropriate 100-continue messages +(David Burgess); +
  • Fixed: http.request was using the old host header during +redirects (Florian Berger); +
  • Fixed: sample unix.c had fallen through the +cracks during development (Matthew Percival); +
  • Fixed: error code was not being propagated correctly in +ftp.lua (David Burgess). +
+ + + +

Old Versions

+ +

+All previous versions of the LuaSocket library can be downloaded +here. Although these versions are no longer supported, they are +still available for those that have compatibility issues. +

+ + + + + + + diff --git a/cosmic rage/docs/LuaSocket_documentation/installation.html b/cosmic rage/docs/LuaSocket_documentation/installation.html new file mode 100644 index 0000000..0288f4a --- /dev/null +++ b/cosmic rage/docs/LuaSocket_documentation/installation.html @@ -0,0 +1,163 @@ + + + + + + +LuaSocket: Installation + + + + + + + +
+
+
+ + + +
+LuaSocket +
Network support for the Lua language +
+

+home · +download · +installation · +introduction · +reference +

+
+
+
+ + + +

Installation

+ +

LuaSocket 2.0.2 uses the new package system for Lua 5.1. +All Lua library developers are encouraged to update their libraries so that +all libraries can coexist peacefully and users can benefit from the +standardization and flexibility of the standard. +

+ +

+Those stuck with Lua 5.0 will need the +compat-5.1 +module. It is maintained by +The Kepler +Project's team, and implements the Lua 5.1 package proposal +on top of Lua 5.0.

+ +

Here we will only describe the standard distribution. +If the standard doesn't meet your needs, we refer you to the +Lua discussion list, where any question about the package +scheme will likely already have been answered.

+ +

Directory structure

+ +

On Unix systems, the standard distribution uses two base +directories, one for system dependent files, and another for system +independent files. Let's call these directories <CDIR> +and <LDIR>, respectively. +For instance, in my laptop, I use '/usr/local/lib/lua/5.0' for +<CDIR> and '/usr/local/share/lua/5.0' for +<LDIR>. On Windows, sometimes only one directory is used, say +'c:\program files\lua\5.0'. Here is the standard LuaSocket +distribution directory structure:

+ +
+<LDIR>/compat-5.1.lua
+<LDIR>/ltn12.lua
+<LDIR>/socket.lua
+<CDIR>/socket/core.dll
+<LDIR>/socket/http.lua
+<LDIR>/socket/tp.lua
+<LDIR>/socket/ftp.lua
+<LDIR>/socket/smtp.lua
+<LDIR>/socket/url.lua
+<LDIR>/mime.lua
+<CDIR>/mime/core.dll
+
+ +

Naturally, on Unix systems, core.dll +would be replaced by core.so. +

+ +

In order for the interpreter to find all LuaSocket components, three +environment variables need to be set. The first environment variable tells +the interpreter to load the compat-5.1.lua module at startup:

+ +
+LUA_INIT=@<LDIR>/compat-5.1.lua
+
+ +

+This is only need for Lua 5.0! Lua 5.1 comes with +the package system built in, of course. +

+ +

+The other two environment variables instruct the compatibility module to +look for dynamic libraries and extension modules in the appropriate +directories and with the appropriate filename extensions. +

+ +
+LUA_PATH=<LDIR>/?.lua;?.lua
+LUA_CPATH=<CDIR>/?.dll;?.dll
+
+ +

Again, naturally, on Unix systems the shared library extension would be +.so instead of .dll.

+ +

Using LuaSocket

+ +

With the above setup, and an interpreter with shared library support, +it should be easy to use LuaSocket. Just fire the interpreter and use the +require function to gain access to whatever module you need:

+ +
+Lua 5.1.2  Copyright (C) 1994-2007 Lua.org, PUC-Rio
+> socket = require("socket")
+> print(socket._VERSION)
+--> LuaSocket 2.0.2
+
+ +

Each module loads their dependencies automatically, so you only need to +load the modules you directly depend upon:

+ +
+Lua 5.1.2  Copyright (C) 1994-2007 Lua.org, PUC-Rio
+> http = require("socket.http")
+> print(http.request("http://www.cs.princeton.edu/~diego/professional/luasocket"))
+--> homepage gets dumped to terminal
+
+ + + + + + + diff --git a/cosmic rage/docs/LuaSocket_documentation/introduction.html b/cosmic rage/docs/LuaSocket_documentation/introduction.html new file mode 100644 index 0000000..eff6367 --- /dev/null +++ b/cosmic rage/docs/LuaSocket_documentation/introduction.html @@ -0,0 +1,333 @@ + + + + + + +LuaSocket: Introduction to the core + + + + + + + +
+
+
+ + + +
+LuaSocket +
Network support for the Lua language +
+

+home · +download · +installation · +introduction · +reference +

+
+
+
+ + + +

Introduction

+ +

+LuaSocket is a Lua extension library +that is composed by two parts: a C core that provides support for the TCP +and UDP transport layers, and a set of Lua modules that add support for +the SMTP (sending e-mails), HTTP (WWW access) and FTP (uploading and +downloading files) protocols and other functionality commonly needed by +applications that deal with the Internet. This introduction is about the C +core. +

+ +

+Communication in LuaSocket is performed via I/O objects. These can +represent different network domains. Currently, support is provided for TCP +and UDP, but nothing prevents other developers from implementing SSL, Local +Domain, Pipes, File Descriptors etc. I/O objects provide a standard +interface to I/O across different domains and operating systems. +

+ +

+The API design had two goals in mind. First, users +experienced with the C API to sockets should feel comfortable using LuaSocket. +Second, the simplicity and the feel of the Lua language should be +preserved. To achieve these goals, the LuaSocket API keeps the function names and semantics the C API whenever possible, but their usage in Lua has been greatly simplified. +

+ + +

+One of the simplifications is the receive pattern capability. +Applications can read data from stream domains (such as TCP) +line by line, block by block, or until the connection is closed. +All I/O reads are buffered and the performance differences between +different receive patterns are negligible. +

+ +

+Another advantage is the flexible timeout control +mechanism. As in C, all I/O operations are blocking by default. For +example, the send, +receive and +accept methods +of the TCP domain will block the caller application until +the operation is completed (if ever!). However, with a call to the +settimeout +method, an application can specify upper limits on +the time it can be blocked by LuaSocket (the "total" timeout), on +the time LuaSocket can internally be blocked by any OS call (the +"block" timeout) or a combination of the two. Each LuaSocket +call might perform several OS calls, so that the two timeout values are +not equivalent. +

+ +

+Finally, the host name resolution is transparent, meaning that most +functions and methods accept both IP addresses and host names. In case a +host name is given, the library queries the system's resolver and +tries the main IP address returned. Note that direct use of IP addresses +is more efficient, of course. The +toip +and tohostname +functions from the DNS module are provided to convert between host names and IP addresses. +

+ +

+Together, these changes make network programming in LuaSocket much simpler +than it is in C, as the following sections will show. +

+ + + +

TCP

+ +

+TCP (Transfer Control Protocol) is reliable stream protocol. In other +words, applications communicating through TCP can send and receive data as +an error free stream of bytes. Data is split in one end and +reassembled transparently on the other end. There are no boundaries in +the data transfers. The library allows users to read data from the +sockets in several different granularities: patterns are available for +lines, arbitrary sized blocks or "read up to connection closed", all with +good performance. +

+ +

+The library distinguishes three types of TCP sockets: master, +client and server sockets. +

+ +

+Master sockets are newly created TCP sockets returned by the function +socket.tcp. A master socket is +transformed into a server socket +after it is associated with a local address by a call to the +bind method followed by a call to the +listen. Conversely, a master socket +can be changed into a client socket with the method +connect, +which associates it with a remote address. +

+ +

+On server sockets, applications can use the +accept method +to wait for a client connection. Once a connection is established, a +client socket object is returned representing this connection. The +other methods available for server socket objects are +getsockname, +setoption, +settimeout, and +close. +

+ +

+Client sockets are used to exchange data between two applications over +the Internet. Applications can call the methods +send and +receive +to send and receive data. The other methods +available for client socket objects are +getsockname, +getpeername, +setoption, +settimeout, +shutdown, and +close. +

+ +

+Example: +

+
+

+A simple echo server, using LuaSocket. The program binds to an ephemeral +port (one that is chosen by the operating system) on the local host and +awaits client connections on that port. When a connection is established, +the program reads a line from the remote end and sends it back, closing +the connection immediately. You can test it using the telnet +program. +

+ +
+-- load namespace
+local socket = require("socket")
+-- create a TCP socket and bind it to the local host, at any port
+local server = assert(socket.bind("*", 0))
+-- find out which port the OS chose for us
+local ip, port = server:getsockname()
+-- print a message informing what's up
+print("Please telnet to localhost on port " .. port)
+print("After connecting, you have 10s to enter a line to be echoed")
+-- loop forever waiting for clients
+while 1 do
+  -- wait for a connection from any client
+  local client = server:accept()
+  -- make sure we don't block waiting for this client's line
+  client:settimeout(10)
+  -- receive the line
+  local line, err = client:receive()
+  -- if there was no error, send it back to the client
+  if not err then client:send(line .. "\n") end
+  -- done with client, close the object
+  client:close()
+end
+
+
+ + + +

UDP

+ +

+UDP (User Datagram Protocol) is a non-reliable datagram protocol. In +other words, applications communicating through UDP send and receive +data as independent blocks, which are not guaranteed to reach the other +end. Even when they do reach the other end, they are not guaranteed to be +error free. Data transfers are atomic, one datagram at a time. Reading +only part of a datagram discards the rest, so that the following read +operation will act on the next datagram. The advantages are in +simplicity (no connection setup) and performance (no error checking or +error correction). +

+ +

+Note that although no guarantees are made, these days +networks are so good that, under normal circumstances, few errors +happen in practice. +

+ +

+An UDP socket object is created by the +socket.udp function. UDP +sockets do not need to be connected before use. The method +sendto +can be used immediately after creation to +send a datagram to IP address and port. Host names are not allowed +because performing name resolution for each packet would be forbiddingly +slow. Methods +receive and +receivefrom +can be used to retrieve datagrams, the latter returning the IP and port of +the sender as extra return values (thus being slightly less +efficient). +

+ +

+When communication is performed repeatedly with a single peer, an +application should call the +setpeername method to specify a +permanent partner. Methods +sendto and +receivefrom +can no longer be used, but the method +send can be used to send data +directly to the peer, and the method +receive +will only return datagrams originating +from that peer. There is about 30% performance gain due to this practice. +

+ +

+To associate an UDP socket with a local address, an application calls the +setsockname +method before sending any datagrams. Otherwise, the socket is +automatically bound to an ephemeral address before the first data +transmission and once bound the local address cannot be changed. +The other methods available for UDP sockets are +getpeername, +getsockname, +settimeout, +setoption and +close. +

+ +

+Example: +

+
+

+A simple daytime client, using LuaSocket. The program connects to a remote +server and tries to retrieve the daytime, printing the answer it got or an +error message. +

+ +
+-- change here to the host an port you want to contact
+local host, port = "localhost", 13
+-- load namespace
+local socket = require("socket")
+-- convert host name to ip address
+local ip = assert(socket.dns.toip(host))
+-- create a new UDP object
+local udp = assert(socket.udp())
+-- contact daytime host
+assert(udp:sendto("anything", ip, port))
+-- retrieve the answer and print results
+io.write(assert(udp:receive()))
+
+
+ + + +

Support modules

+ +

Although not covered in the introduction, LuaSocket offers +much more than TCP and UDP functionality. As the library +evolved, support for HTTP, FTP, +and SMTP were built on top of these. These modules +and many others are covered by the reference manual. +

+ + + + + + + diff --git a/cosmic rage/docs/LuaSocket_documentation/ltn12.html b/cosmic rage/docs/LuaSocket_documentation/ltn12.html new file mode 100644 index 0000000..0013950 --- /dev/null +++ b/cosmic rage/docs/LuaSocket_documentation/ltn12.html @@ -0,0 +1,430 @@ + + + + + + +LuaSocket: LTN12 module + + + + + + + +
+
+
+ + + +
+LuaSocket +
Network support for the Lua language +
+

+home · +download · +installation · +introduction · +reference +

+
+
+
+ + + +

LTN12

+ +

The ltn12 namespace implements the ideas described in + +LTN012, Filters sources and sinks. This manual simply describes the +functions. Please refer to the LTN for a deeper explanation of the +functionality provided by this module. +

+ +

+To obtain the ltn12 namespace, run: +

+ +
+-- loads the LTN21 module
+local ltn12 = require("ltn12")
+
+ + + +

Filters

+ + + +

+ltn12.filter.chain(filter1, filter2 +[, ... filterN]) +

+ +

+Returns a filter that passes all data it receives through each of a +series of given filters. +

+ +

+Filter1 to filterN are simple +filters. +

+ +

+The function returns the chained filter. +

+ +

+The nesting of filters can be arbitrary. For instance, the useless filter +below doesn't do anything but return the data that was passed to it, +unaltered. +

+ +
+-- load required modules
+local ltn12 = require("ltn12")
+local mime = require("mime")
+
+-- create a silly identity filter
+id = ltn12.filter.chain(
+  mime.encode("quoted-printable"),
+  mime.encode("base64"),
+  mime.decode("base64"),
+  mime.decode("quoted-printable")
+)
+
+ + + +

+ltn12.filter.cycle(low [, ctx, extra]) +

+ +

+Returns a high-level filter that cycles though a low-level filter by +passing it each chunk and updating a context between calls. +

+ +

+Low is the low-level filter to be cycled, +ctx is the initial context and extra is any extra +argument the low-level filter might take. +

+ +

+The function returns the high-level filter. +

+ +
+-- load the ltn12 module
+local ltn12 = require("ltn12")
+
+-- the base64 mime filter factory
+encodet['base64'] = function()
+    return ltn12.filter.cycle(b64, "")
+end
+
+ + + +

Pumps

+ + + +

+ltn12.pump.all(source, sink) +

+ +

+Pumps all data from a source to a sink. +

+ +

+If successful, the function returns a value that evaluates to +true. In case +of error, the function returns a false value, followed by an error message. +

+ + + +

+ltn12.pump.step(source, sink) +

+ +

+Pumps one chunk of data from a source to a sink. +

+ +

+If successful, the function returns a value that evaluates to +true. In case +of error, the function returns a false value, followed by an error message. +

+ + + +

Sinks

+ + + +

+ltn12.sink.chain(filter, sink) +

+ +

+Creates and returns a new sink that passes data through a filter before sending it to a given sink. +

+ + + +

+ltn12.sink.error(message) +

+ +

+Creates and returns a sink that aborts transmission with the error +message. +

+ + + +

+ltn12.sink.file(handle, message) +

+ +

+Creates a sink that sends data to a file. +

+ +

+Handle is a file handle. If handle is nil, +message should give the reason for failure. +

+ +

+The function returns a sink that sends all data to the given handle +and closes the file when done, or a sink that aborts the transmission with +the error message +

+ +

+In the following example, notice how the prototype is designed to +fit nicely with the io.open function. +

+ +
+-- load the ltn12 module
+local ltn12 = require("ltn12")
+
+-- copy a file
+ltn12.pump.all(
+  ltn12.source.file(io.open("original.png")),
+  ltn12.sink.file(io.open("copy.png"))
+)
+
+ + + +

+ltn12.sink.null() +

+ +

+Returns a sink that ignores all data it receives. +

+ + + +

+ltn12.sink.simplify(sink) +

+ +

+Creates and returns a simple sink given a fancy sink. +

+ + + +

+ltn12.sink.table([table]) +

+ +

+Creates a sink that stores all chunks in a table. The chunks can later be +efficiently concatenated into a single string. +

+ +

+Table is used to hold the chunks. If +nil, the function creates its own table. +

+ +

+The function returns the sink and the table used to store the chunks. +

+ +
+-- load needed modules
+local http = require("socket.http")
+local ltn12 = require("ltn12")
+
+-- a simplified http.get function
+function http.get(u)
+  local t = {}
+  local respt = request{
+    url = u,
+    sink = ltn12.sink.table(t)
+  }
+  return table.concat(t), respt.headers, respt.code
+end
+
+ + + +

Sources

+ + + +

+ltn12.source.cat(source1 [, source2, ..., +sourceN]) +

+ +

+Creates a new source that produces the concatenation of the data produced +by a number of sources. +

+ +

+Source1 to sourceN are the original +sources. +

+ +

+The function returns the new source. +

+ + + +

+ltn12.source.chain(source, filter) +

+ +

+Creates a new source that passes data through a filter +before returning it. +

+ +

+The function returns the new source. +

+ + + +

+ltn12.source.empty() +

+ +

+Creates and returns an empty source. +

+ + + +

+ltn12.source.error(message) +

+ +

+Creates and returns a source that aborts transmission with the error +message. +

+ + + +

+ltn12.source.file(handle, message) +

+ +

+Creates a source that produces the contents of a file. +

+ +

+Handle is a file handle. If handle is nil, +message should give the reason for failure. +

+ +

+The function returns a source that reads chunks of data from +given handle and returns it to the user, +closing the file when done, or a source that aborts the transmission with +the error message +

+ +

+In the following example, notice how the prototype is designed to +fit nicely with the io.open function. +

+ +
+-- load the ltn12 module
+local ltn12 = require("ltn12")
+
+-- copy a file
+ltn12.pump.all(
+  ltn12.source.file(io.open("original.png")),
+  ltn12.sink.file(io.open("copy.png"))
+)
+
+ + + +

+ltn12.source.simplify(source) +

+ +

+Creates and returns a simple source given a fancy source. +

+ + + +

+ltn12.source.string(string) +

+ +

+Creates and returns a source that produces the contents of a +string, chunk by chunk. +

+ + + + + + + diff --git a/cosmic rage/docs/LuaSocket_documentation/luasocket.png b/cosmic rage/docs/LuaSocket_documentation/luasocket.png new file mode 100644 index 0000000..d24a954 Binary files /dev/null and b/cosmic rage/docs/LuaSocket_documentation/luasocket.png differ diff --git a/cosmic rage/docs/LuaSocket_documentation/mime.html b/cosmic rage/docs/LuaSocket_documentation/mime.html new file mode 100644 index 0000000..d7faf52 --- /dev/null +++ b/cosmic rage/docs/LuaSocket_documentation/mime.html @@ -0,0 +1,476 @@ + + + + + + +LuaSocket: MIME module + + + + + + + +
+
+
+ + + +
+LuaSocket +
Network support for the Lua language +
+

+home · +download · +installation · +introduction · +reference +

+
+
+
+ + + +

MIME

+ +

+The mime namespace offers filters that apply and remove common +content transfer encodings, such as Base64 and Quoted-Printable. +It also provides functions to break text into lines and change +the end-of-line convention. +MIME is described mainly in +RFC 2045, +2046, +2047, +2048, and +2049. +

+ +

+All functionality provided by the MIME module +follows the ideas presented in + +LTN012, Filters sources and sinks. +

+ +

+To obtain the mime namespace, run: +

+ +
+-- loads the MIME module and everything it requires
+local mime = require("mime")
+
+ + + + +

High-level filters

+ + + +

+mime.normalize([marker]) +

+ +

+Converts most common end-of-line markers to a specific given marker. +

+ +

+Marker is the new marker. It defaults to CRLF, the canonic +end-of-line marker defined by the MIME standard. +

+ +

+The function returns a filter that performs the conversion. +

+ +

+Note: There is no perfect solution to this problem. Different end-of-line +markers are an evil that will probably plague developers forever. +This function, however, will work perfectly for text created with any of +the most common end-of-line markers, i.e. the Mac OS (CR), the Unix (LF), +or the DOS (CRLF) conventions. Even if the data has mixed end-of-line +markers, the function will still work well, although it doesn't +guarantee that the number of empty lines will be correct. +

+ + + +

+mime.decode("base64")
+mime.decode("quoted-printable") +

+ +

+Returns a filter that decodes data from a given transfer content +encoding. +

+ + + +

+mime.encode("base64")
+mime.encode("quoted-printable" [, mode]) +

+ +

+Returns a filter that encodes data according to a given transfer content +encoding. +

+ +

+In the Quoted-Printable case, the user can specify whether the data is +textual or binary, by passing the mode strings "text" or +"binary". Mode defaults to "text". +

+ +

+Although both transfer content encodings specify a limit for the line +length, the encoding filters do not break text into lines (for +added flexibility). +Below is a filter that converts binary data to the Base64 transfer content +encoding and breaks it into lines of the correct size. +

+ +
+base64 = ltn12.filter.chain(
+  mime.encode("base64"),
+  mime.wrap("base64")
+)
+
+ +

+Note: Text data has to be converted to canonic form +before being encoded. +

+ +
+base64 = ltn12.filter.chain(
+  mime.normalize(),
+  mime.encode("base64"),
+  mime.wrap("base64")
+)
+
+ + + +

+mime.stuff()
+

+ +

+Creates and returns a filter that performs stuffing of SMTP messages. +

+ +

+Note: The smtp.send function +uses this filter automatically. You don't need to chain it with your +source, or apply it to your message body. +

+ + + +

+mime.wrap("text" [, length])
+mime.wrap("base64")
+mime.wrap("quoted-printable") +

+ +

+Returns a filter that breaks data into lines. +

+ +

+The "text" line-wrap filter simply breaks text into lines by +inserting CRLF end-of-line markers at appropriate positions. +Length defaults 76. +The "base64" line-wrap filter works just like the default +"text" line-wrap filter with default length. +The function can also wrap "quoted-printable" lines, taking care +not to break lines in the middle of an escaped character. In that case, the +line length is fixed at 76. +

+ +

+For example, to create an encoding filter for the Quoted-Printable transfer content encoding of text data, do the following: +

+ +
+qp = ltn12.filter.chain(
+  mime.normalize(),
+  mime.encode("quoted-printable"),
+  mime.wrap("quoted-printable")
+)
+
+ +

+Note: To break into lines with a different end-of-line convention, apply +a normalization filter after the line break filter. +

+ + + +

Low-level filters

+ + + +

+A, B = mime.b64(C [, D]) +

+ +

+Low-level filter to perform Base64 encoding. +

+ +

+A is the encoded version of the largest prefix of +C..D +that can be encoded unambiguously. B has the remaining bytes of +C..D, before encoding. +If D is nil, A is padded with +the encoding of the remaining bytes of C. +

+ +

+Note: The simplest use of this function is to encode a string into it's +Base64 transfer content encoding. Notice the extra parenthesis around the +call to mime.b64, to discard the second return value. +

+ +
+print((mime.b64("diego:password")))
+--> ZGllZ286cGFzc3dvcmQ=
+
+ + +

+A, n = mime.dot(m [, B]) +

+ +

+Low-level filter to perform SMTP stuffing and enable transmission of +messages containing the sequence "CRLF.CRLF". +

+ +

+A is the stuffed version of B. 'n' gives the +number of characters from the sequence CRLF seen in the end of B. +'m' should tell the same, but for the previous chunk. +

+ +

Note: The message body is defined to begin with +an implicit CRLF. Therefore, to stuff a message correctly, the +first m should have the value 2. +

+ +
+print((string.gsub(mime.dot(2, ".\r\nStuffing the message.\r\n.\r\n."), "\r\n", "\\n")))
+--> ..\nStuffing the message.\n..\n..
+
+ +

+Note: The smtp.send function +uses this filter automatically. You don't need to +apply it again. +

+ + + +

+A, B = mime.eol(C [, D, marker]) +

+ +

+Low-level filter to perform end-of-line marker translation. +For each chunk, the function needs to know if the last character of the +previous chunk could be part of an end-of-line marker or not. This is the +context the function receives besides the chunk. An updated version of +the context is returned after each new chunk. +

+ +

+A is the translated version of D. C is the +ASCII value of the last character of the previous chunk, if it was a +candidate for line break, or 0 otherwise. +B is the same as C, but for the current +chunk. Marker gives the new end-of-line marker and defaults to CRLF. +

+ +
+-- translates the end-of-line marker to UNIX
+unix = mime.eol(0, dos, "\n") 
+
+ + + +

+A, B = mime.qp(C [, D, marker]) +

+ +

+Low-level filter to perform Quoted-Printable encoding. +

+ +

+A is the encoded version of the largest prefix of +C..D +that can be encoded unambiguously. B has the remaining bytes of +C..D, before encoding. +If D is nil, A is padded with +the encoding of the remaining bytes of C. +Throughout encoding, occurrences of CRLF are replaced by the +marker, which itself defaults to CRLF. +

+ +

+Note: The simplest use of this function is to encode a string into it's +Quoted-Printable transfer content encoding. +Notice the extra parenthesis around the call to mime.qp, to discard the second return value. +

+ +
+print((mime.qp("ma")))
+--> ma=E7=E3=
+
+ + + +

+A, m = mime.qpwrp(n [, B, length]) +

+ +

+Low-level filter to break Quoted-Printable text into lines. +

+ +

+A is a copy of B, broken into lines of at most +length bytes (defaults to 76). +'n' should tell how many bytes are left for the first +line of B and 'm' returns the number of bytes +left in the last line of A. +

+ +

+Note: Besides breaking text into lines, this function makes sure the line +breaks don't fall in the middle of an escaped character combination. Also, +this function only breaks lines that are bigger than length bytes. +

+ + + +

+A, B = mime.unb64(C [, D]) +

+ +

+Low-level filter to perform Base64 decoding. +

+ +

+A is the decoded version of the largest prefix of +C..D +that can be decoded unambiguously. B has the remaining bytes of +C..D, before decoding. +If D is nil, A is the empty string +and B returns whatever couldn't be decoded. +

+ +

+Note: The simplest use of this function is to decode a string from it's +Base64 transfer content encoding. +Notice the extra parenthesis around the call to mime.unqp, to discard the second return value. +

+ +
+print((mime.unb64("ZGllZ286cGFzc3dvcmQ=")))
+--> diego:password
+
+ + + +

+A, B = mime.unqp(C [, D]) +

+ +

+Low-level filter to remove the Quoted-Printable transfer content encoding +from data. +

+ +

+A is the decoded version of the largest prefix of +C..D +that can be decoded unambiguously. B has the remaining bytes of +C..D, before decoding. +If D is nil, A is augmented with +the encoding of the remaining bytes of C. +

+ +

+Note: The simplest use of this function is to decode a string from it's +Quoted-Printable transfer content encoding. +Notice the extra parenthesis around the call to mime.unqp, to discard the second return value. +

+ +
+print((mime.qp("ma=E7=E3=")))
+--> ma
+
+ + + +

+A, m = mime.wrp(n [, B, length]) +

+ +

+Low-level filter to break text into lines with CRLF marker. +Text is assumed to be in the normalize form. +

+ +

+A is a copy of B, broken into lines of at most +length bytes (defaults to 76). +'n' should tell how many bytes are left for the first +line of B and 'm' returns the number of bytes +left in the last line of A. +

+ +

+Note: This function only breaks lines that are bigger than +length bytes. The resulting line length does not include the CRLF +marker. +

+ + + + + + + + diff --git a/cosmic rage/docs/LuaSocket_documentation/reference.css b/cosmic rage/docs/LuaSocket_documentation/reference.css new file mode 100644 index 0000000..b1dd25d --- /dev/null +++ b/cosmic rage/docs/LuaSocket_documentation/reference.css @@ -0,0 +1,54 @@ +body { + margin-left: 1em; + margin-right: 1em; + font-family: "Verdana", sans-serif; +} + +tt { + font-family: "Andale Mono", monospace; +} + +h1, h2, h3, h4 { margin-left: 0em; } + + +h3 { padding-top: 1em; } + +p { margin-left: 1em; } + +p.name { + font-family: "Andale Mono", monospace; + padding-top: 1em; + margin-left: 0em; +} + +a[href] { color: #00007f; } + +blockquote { margin-left: 3em; } + +pre.example { + background: #ccc; + padding: 1em; + margin-left: 1em; + font-family: "Andale Mono", monospace; + font-size: small; +} + +hr { + margin-left: 0em; + background: #00007f; + border: 0px; + height: 1px; +} + +ul { list-style-type: disc; } + +table.index { border: 1px #00007f; } +table.index td { text-align: left; vertical-align: top; } +table.index ul { padding-top: 0em; margin-top: 0em; } + +h1:first-letter, +h2:first-letter, +h2:first-letter, +h3:first-letter { color: #00007f; } + +div.header, div.footer { margin-left: 0em; } diff --git a/cosmic rage/docs/LuaSocket_documentation/reference.html b/cosmic rage/docs/LuaSocket_documentation/reference.html new file mode 100644 index 0000000..b329f57 --- /dev/null +++ b/cosmic rage/docs/LuaSocket_documentation/reference.html @@ -0,0 +1,239 @@ + + + + + + +LuaSocket: Index to reference manual + + + + + + + +
+
+
+ + + +
+LuaSocket +
Network support for the Lua language +
+

+home · +download · +installation · +introduction · +reference +

+
+
+
+ + + +

Reference

+ +
+DNS (in socket) +
+toip, +tohostname, +gethostname. +
+
+ + + +
+FTP +
+get, +put. +
+
+ + + +
+HTTP +
+request. +
+
+ + + +
+LTN12 +
+filter: +chain, +cycle. +
+
+pump: +all, +step. +
+
+sink: +chain, +error, +file, +null, +simplify, +table. +
+
+source: +cat, +chain, +empty, +error, +file, +simplify, +string. +
+
+ + + +
+MIME +
+high-level: +normalize, +decode, +encode, +stuff, +wrap. +
+
+low-level: +b64, +dot, +eol, +qp, +wrp, +qpwrp. +unb64, +unqp, +
+
+ + + +
+SMTP +
+message, +send. +
+
+ + + +
+Socket +
+_DEBUG, +dns, +gettime, +newtry, +protect, +select, +sink, +skip, +sleep, +source, +tcp, +try, +udp, +_VERSION. +
+
+ + + +
+TCP (in socket) +
+accept, +bind, +close, +connect, +getpeername, +getsockname, +getstats, +receive, +send, +setoption, +setstats, +settimeout, +shutdown. +
+
+ + + +
+UDP (in socket) +
+close, +getpeername, +getsockname, +receive, +receivefrom, +send, +sendto, +setpeername, +setsockname, +setoption, +settimeout. +
+
+ + + +
+URL +
+absolute, +build, +build_path, +escape, +parse, +parse_path, +unescape. +
+
+ + + + + + + diff --git a/cosmic rage/docs/LuaSocket_documentation/smtp.html b/cosmic rage/docs/LuaSocket_documentation/smtp.html new file mode 100644 index 0000000..27dd473 --- /dev/null +++ b/cosmic rage/docs/LuaSocket_documentation/smtp.html @@ -0,0 +1,417 @@ + + + + + + +LuaSocket: SMTP support + + + + + + + +
+
+
+ + + +
+LuaSocket +
Network support for the Lua language +
+

+home · +download · +installation · +introduction · +reference +

+
+
+
+ + + +

SMTP

+ +

The smtp namespace provides functionality to send e-mail +messages. The high-level API consists of two functions: one to +define an e-mail message, and another to actually send the message. +Although almost all users will find that these functions provide more than +enough functionality, the underlying implementation allows for even more +control (if you bother to read the code). +

+ +

The implementation conforms to the Simple Mail Transfer Protocol, +RFC 2821. +Another RFC of interest is RFC 2822, +which governs the Internet Message Format. +Multipart messages (those that contain attachments) are part +of the MIME standard, but described mainly +in RFC +2046 + +

In the description below, good understanding of LTN012, Filters +sources and sinks and the MIME module is +assumed. In fact, the SMTP module was the main reason for their +creation.

+ +

+To obtain the smtp namespace, run: +

+ +
+-- loads the SMTP module and everything it requires
+local smtp = require("socket.smtp")
+
+ +

+MIME headers are represented as a Lua table in the form: +

+ +
+ + +
+headers = {
+  field-1-name = field-1-value,
+  field-2-name = field-2-value,
+  field-3-name = field-3-value,
+  ...
+  field-n-name = field-n-value
+} +
+
+ +

+Field names are case insensitive (as specified by the standard) and all +functions work with lowercase field names. +Field values are left unmodified. +

+ +

+Note: MIME headers are independent of order. Therefore, there is no problem +in representing them in a Lua table. +

+ +

+The following constants can be set to control the default behavior of +the SMTP module: +

+ +
    +
  • DOMAIN: domain used to greet the server; +
  • PORT: default port used for the connection; +
  • SERVER: default server used for the connection; +
  • TIMEOUT: default timeout for all I/O operations; +
  • ZONE: default time zone. +
+ + + +

+smtp.send{
+  from = string,
+  rcpt = string or string-table,
+  source = LTN12 source,
+  [user = string,]
+  [password = string,]
+  [server = string,]
+  [port = number,]
+  [domain = string,]
+  [step = LTN12 pump step,]
+  [create = function]
+} +

+ +

+Sends a message to a recipient list. Since sending messages is not as +simple as downloading an URL from a FTP or HTTP server, this function +doesn't have a simple interface. However, see the +message source factory for +a very powerful way to define the message contents. +

+ + +

+The sender is given by the e-mail address in the from field. +Rcpt is a Lua table with one entry for each recipient e-mail +address, or a string +in case there is just one recipient. +The contents of the message are given by a simple +LTN12 +source. Several arguments are optional: +

+
    +
  • user, password: User and password for +authentication. The function will attempt LOGIN and PLAIN authentication +methods if supported by the server (both are unsafe); +
  • server: Server to connect to. Defaults to "localhost"; +
  • port: Port to connect to. Defaults to 25; +
  • domain: Domain name used to greet the server; Defaults to the +local machine host name; +
  • step: +LTN12 +pump step function used to pass data from the +source to the server. Defaults to the LTN12 pump.step function; +
  • create: An optional function to be used instead of +socket.tcp when the communications socket is created. +
+ +

+If successful, the function returns 1. Otherwise, the function returns +nil followed by an error message. +

+ +

+Note: SMTP servers can be very picky with the format of e-mail +addresses. To be safe, use only addresses of the form +"<fulano@example.com>" in the from and +rcpt arguments to the send function. In headers, e-mail +addresses can take whatever form you like.

+ +

+Big note: There is a good deal of misconception with the use of the +destination address field headers, i.e., the 'To', 'Cc', +and, more importantly, the 'Bcc' headers. Do not add a +'Bcc' header to your messages because it will probably do the +exact opposite of what you expect. +

+ +

+Only recipients specified in the rcpt list will receive a copy of the +message. Each recipient of an SMTP mail message receives a copy of the +message body along with the headers, and nothing more. The headers +are part of the message and should be produced by the +LTN12 +source function. The rcpt list is not +part of the message and will not be sent to anyone. +

+ +

+RFC 2822 +has two important and short sections, "3.6.3. Destination address +fields" and "5. Security considerations", explaining the proper +use of these headers. Here is a summary of what it says: +

+ +
    +
  • To: contains the address(es) of the primary recipient(s) +of the message; +
  • Cc: (where the "Cc" means "Carbon Copy" in the sense of +making a copy on a typewriter using carbon paper) contains the +addresses of others who are to receive the message, though the +content of the message may not be directed at them; +
  • Bcc: (where the "Bcc" means "Blind Carbon +Copy") contains addresses of recipients of the message whose addresses are not to be revealed to other recipients of the message. +
+ +

+The LuaSocket send function does not care or interpret the +headers you send, but it gives you full control over what is sent and +to whom it is sent: +

+
    +
  • If someone is to receive the message, the e-mail address has +to be in the recipient list. This is the only parameter that controls who +gets a copy of the message; +
  • If there are multiple recipients, none of them will automatically +know that someone else got that message. That is, the default behavior is +similar to the Bcc field of popular e-mail clients; +
  • It is up to you to add the To header with the list of primary +recipients so that other recipients can see it; +
  • It is also up to you to add the Cc header with the +list of additional recipients so that everyone else sees it; +
  • Adding a header Bcc is nonsense, unless it is +empty. Otherwise, everyone receiving the message will see it and that is +exactly what you don't want to happen! +
+ +

+I hope this clarifies the issue. Otherwise, please refer to +RFC 2821 +and +RFC 2822. +

+ +
+-- load the smtp support
+local smtp = require("socket.smtp")
+
+-- Connects to server "localhost" and sends a message to users
+-- "fulano@example.com",  "beltrano@example.com", 
+-- and "sicrano@example.com".
+-- Note that "fulano" is the primary recipient, "beltrano" receives a
+-- carbon copy and neither of them knows that "sicrano" received a blind
+-- carbon copy of the message.
+from = "<luasocket@example.com>"
+
+rcpt = {
+  "<fulano@example.com>",
+  "<beltrano@example.com>",
+  "<sicrano@example.com>"
+}
+
+mesgt = {
+  headers = {
+    to = "Fulano da Silva <fulano@example.com>",
+    cc = '"Beltrano F. Nunes" <beltrano@example.com>',
+    subject = "My first message"
+  },
+  body = "I hope this works. If it does, I can send you another 1000 copies."
+}
+
+r, e = smtp.send{
+  from = from,
+  rcpt = rcpt, 
+  source = smtp.message(mesgt)
+}
+
+ + + +

+smtp.message(mesgt) +

+ +

+Returns a simple +LTN12 source that sends an SMTP message body, possibly multipart (arbitrarily deep). +

+ +

+The only parameter of the function is a table describing the message. +Mesgt has the following form (notice the recursive structure): +

+ +
+ + +
+mesgt = {
+  headers = header-table,
+  body = LTN12 source or string or +multipart-mesgt
+}

+multipart-mesgt = {
+  [preamble = string,]
+  [1] = mesgt,
+  [2] = mesgt,
+  ...
+  [n] = mesgt,
+  [epilogue = string,]
+}
+
+
+ +

+For a simple message, all that is needed is a set of headers +and the body. The message body can be given as a string +or as a simple +LTN12 +source. For multipart messages, the body is a table that +recursively defines each part as an independent message, plus an optional +preamble and epilogue. +

+ +

+The function returns a simple +LTN12 +source that produces the +message contents as defined by mesgt, chunk by chunk. +Hopefully, the following +example will make things clear. When in doubt, refer to the appropriate RFC +as listed in the introduction.

+ +
+-- load the smtp support and its friends
+local smtp = require("socket.smtp")
+local mime = require("mime")
+local ltn12 = require("ltn12")
+
+-- creates a source to send a message with two parts. The first part is 
+-- plain text, the second part is a PNG image, encoded as base64.
+source = smtp.message{
+  headers = {
+     -- Remember that headers are *ignored* by smtp.send. 
+     from = "Sicrano de Oliveira <sicrano@example.com>",
+     to = "Fulano da Silva <fulano@example.com>",
+     subject = "Here is a message with attachments"
+  },
+  body = {
+    preamble = "If your client doesn't understand attachments, \r\n" ..
+               "it will still display the preamble and the epilogue.\r\n" ..
+               "Preamble will probably appear even in a MIME enabled client.",
+    -- first part: no headers means plain text, us-ascii.
+    -- The mime.eol low-level filter normalizes end-of-line markers.
+    [1] = { 
+      body = mime.eol(0, [[
+        Lines in a message body should always end with CRLF. 
+        The smtp module will *NOT* perform translation. However, the 
+        send function *DOES* perform SMTP stuffing, whereas the message
+        function does *NOT*.
+      ]])
+    },
+    -- second part: headers describe content to be a png image, 
+    -- sent under the base64 transfer content encoding.
+    -- notice that nothing happens until the message is actually sent. 
+    -- small chunks are loaded into memory right before transmission and 
+    -- translation happens on the fly.
+    [2] = { 
+      headers = {
+        ["content-type"] = 'image/png; name="image.png"',
+        ["content-disposition"] = 'attachment; filename="image.png"',
+        ["content-description"] = 'a beautiful image',
+        ["content-transfer-encoding"] = "BASE64"
+      },
+      body = ltn12.source.chain(
+        ltn12.source.file(io.open("image.png", "rb")),
+        ltn12.filter.chain(
+          mime.encode("base64"),
+          mime.wrap()
+        )
+      )
+    },
+    epilogue = "This might also show up, but after the attachments"
+  }
+}
+
+-- finally send it
+r, e = smtp.send{
+    from = "<sicrano@example.com>",
+    rcpt = "<fulano@example.com>",
+    source = source,
+}
+
+ + + + + + + diff --git a/cosmic rage/docs/LuaSocket_documentation/socket.html b/cosmic rage/docs/LuaSocket_documentation/socket.html new file mode 100644 index 0000000..ba4b730 --- /dev/null +++ b/cosmic rage/docs/LuaSocket_documentation/socket.html @@ -0,0 +1,404 @@ + + + + + + +LuaSocket: The socket namespace + + + + + + + +
+
+
+ + + +
+LuaSocket +
Network support for the Lua language +
+

+home · +download · +installation · +introduction · +reference +

+
+
+
+ + + +

The socket namespace

+ +

+The socket namespace contains the core functionality of LuaSocket. +

+ +

+To obtain the socket namespace, run: +

+ +
+-- loads the socket module 
+local socket = require("socket")
+
+ + + +

+socket.bind(address, port [, backlog]) +

+ +

+This function is a shortcut that creates and returns a TCP server object +bound to a local address and port, ready to +accept client connections. Optionally, +user can also specify the backlog argument to the +listen method (defaults to 32). +

+ +

+Note: The server object returned will have the option "reuseaddr" +set to true. +

+ + + +

+socket.connect(address, port [, locaddr, locport]) +

+ +

+This function is a shortcut that creates and returns a TCP client object +connected to a remote host at a given port. Optionally, +the user can also specify the local address and port to bind +(locaddr and locport). +

+ + + +

+socket._DEBUG +

+ +

+This constant is set to true if the library was compiled +with debug support. +

+ + + +

+socket.newtry(finalizer) +

+ +

+Creates and returns a clean +try +function that allows for cleanup before the exception +is raised. +

+ +

+Finalizer is a function that will be called before +try throws the exception. It will be called +in protected mode. +

+ +

+The function returns your customized try function. +

+ +

+Note: This idea saved a lot of work with the +implementation of protocols in LuaSocket: +

+ +
+foo = socket.protect(function()
+    -- connect somewhere
+    local c = socket.try(socket.connect("somewhere", 42))
+    -- create a try function that closes 'c' on error
+    local try = socket.newtry(function() c:close() end)
+    -- do everything reassured c will be closed 
+    try(c:send("hello there?\r\n"))
+    local answer = try(c:receive())
+    ...
+    try(c:send("good bye\r\n"))
+    c:close()
+end)
+
+ + + + +

+socket.protect(func) +

+ +

+Converts a function that throws exceptions into a safe function. This +function only catches exceptions thrown by the try +and newtry functions. It does not catch normal +Lua errors. +

+ +

+Func is a function that calls +try (or assert, or error) +to throw exceptions. +

+ +

+Returns an equivalent function that instead of throwing exceptions, +returns nil followed by an error message. +

+ +

+Note: Beware that if your function performs some illegal operation that +raises an error, the protected function will catch the error and return it +as a string. This is because the try function +uses errors as the mechanism to throw exceptions. +

+ + + +

+socket.select(recvt, sendt [, timeout]) +

+ +

+Waits for a number of sockets to change status. +

+ +

+Recvt is an array with the sockets to test for characters +available for reading. Sockets in the sendt array are watched to +see if it is OK to immediately write on them. Timeout is the +maximum amount of time (in seconds) to wait for a change in status. A +nil, negative or omitted timeout value allows the +function to block indefinitely. Recvt and sendt can also +be empty tables or nil. Non-socket values (or values with +non-numeric indices) in the arrays will be silently ignored. +

+ +

The function returns a list with the sockets ready for +reading, a list with the sockets ready for writing and an error message. +The error message is "timeout" if a timeout condition was met and +nil otherwise. The returned tables are +doubly keyed both by integers and also by the sockets +themselves, to simplify the test if a specific socket has +changed status. +

+ +

+Important note: a known bug in WinSock causes select to fail +on non-blocking TCP sockets. The function may return a socket as +writable even though the socket is not ready for sending. +

+ +

+Another important note: calling select with a server socket in the receive parameter before a call to accept does not guarantee +accept will return immediately. +Use the settimeout +method or accept might block forever. +

+ +

+Yet another note: If you close a socket and pass +it to select, it will be ignored. +

+ + + +

+socket.sink(mode, socket) +

+ +

+Creates an +LTN12 +sink from a stream socket object. +

+ +

+Mode defines the behavior of the sink. The following +options are available: +

+
    +
  • "http-chunked": sends data through socket after applying the +chunked transfer coding, closing the socket when done; +
  • "close-when-done": sends all received data through the +socket, closing the socket when done; +
  • "keep-open": sends all received data through the +socket, leaving it open when done. +
+

+Socket is the stream socket object used to send the data. +

+ +

+The function returns a sink with the appropriate behavior. +

+ + + +

+socket.skip(d [, ret1, ret2 ... retN]) +

+ +

+Drops a number of arguments and returns the remaining. +

+ +

+D is the number of arguments to drop. Ret1 to +retN are the arguments. +

+ +

+The function returns retd+1 to retN. +

+ +

+Note: This function is useful to avoid creation of dummy variables: +

+ +
+-- get the status code and separator from SMTP server reply 
+local code, sep = socket.skip(2, string.find(line, "^(%d%d%d)(.?)"))
+
+ + + +

+socket.sleep(time) +

+ +

+Freezes the program execution during a given amount of time. +

+ +

+Time is the number of seconds to sleep for. +

+ + + +

+socket.source(mode, socket [, length]) +

+ +

+Creates an +LTN12 +source from a stream socket object. +

+ +

+Mode defines the behavior of the source. The following +options are available: +

+
    +
  • "http-chunked": receives data from socket and removes the +chunked transfer coding before returning the data; +
  • "by-length": receives a fixed number of bytes from the +socket. This mode requires the extra argument length; +
  • "until-closed": receives data from a socket until the other +side closes the connection. +
+

+Socket is the stream socket object used to receive the data. +

+ +

+The function returns a source with the appropriate behavior. +

+ + + +

+socket.gettime() +

+ +

+Returns the time in seconds, relative to the origin of the +universe. You should subtract the values returned by this function +to get meaningful values. +

+ +
+t = socket.gettime()
+-- do stuff
+print(socket.gettime() - t .. " seconds elapsed")
+
+ + + +

+socket.try(ret1 [, ret2 ... retN]) +

+ +

+Throws an exception in case of error. The exception can only be caught +by the protect function. It does not explode +into an error message. +

+ +

+Ret1 to retN can be arbitrary +arguments, but are usually the return values of a function call +nested with try. +

+ +

+The function returns ret1 to retN if +ret1 is not nil. Otherwise, it calls error passing ret2. +

+ +
+-- connects or throws an exception with the appropriate error message
+c = socket.try(socket.connect("localhost", 80))
+
+ + + +

+socket._VERSION +

+ +

+This constant has a string describing the current LuaSocket version. +

+ + + + + + + diff --git a/cosmic rage/docs/LuaSocket_documentation/tcp.html b/cosmic rage/docs/LuaSocket_documentation/tcp.html new file mode 100644 index 0000000..a16a09e --- /dev/null +++ b/cosmic rage/docs/LuaSocket_documentation/tcp.html @@ -0,0 +1,533 @@ + + + + + + +LuaSocket: TCP/IP support + + + + + + + +
+
+
+ + + +
+LuaSocket +
Network support for the Lua language +
+

+home · +download · +installation · +introduction · +reference +

+
+
+
+ + + +

TCP

+ + + +

+socket.tcp() +

+ +

+Creates and returns a TCP master object. A master object can +be transformed into a server object with the method +listen (after a call to bind) or into a client object with +the method connect. The only other +method supported by a master object is the +close method.

+ +

+In case of success, a new master object is returned. In case of error, +nil is returned, followed by an error message. +

+ + + +

+server:accept() +

+ +

+Waits for a remote connection on the server +object and returns a client object representing that connection. +

+ +

+If a connection is successfully initiated, a client object is returned. +If a timeout condition is met, the method returns nil +followed by the error string 'timeout'. Other errors are +reported by nil followed by a message describing the error. +

+ +

+Note: calling socket.select +with a server object in +the recvt parameter before a call to accept does +not guarantee accept will return immediately. Use the settimeout method or accept +might block until another client shows up. +

+ + + +

+master:bind(address, port) +

+ +

+Binds a master object to address and port on the +local host. + +

+Address can be an IP address or a host name. +Port must be an integer number in the range [0..64K). +If address +is '*', the system binds to all local interfaces +using the INADDR_ANY constant. If port is 0, the system automatically +chooses an ephemeral port. +

+ +

+In case of success, the method returns 1. In case of error, the +method returns nil followed by an error message. +

+ +

+Note: The function socket.bind +is available and is a shortcut for the creation of server sockets. +

+ + + +

+master:close()
+client:close()
+server:close() +

+ +

+Closes a TCP object. The internal socket used by the object is closed +and the local address to which the object was +bound is made available to other applications. No further operations +(except for further calls to the close method) are allowed on +a closed socket. +

+ +

+Note: It is important to close all used sockets once they are not +needed, since, in many systems, each socket uses a file descriptor, +which are limited system resources. Garbage-collected objects are +automatically closed before destruction, though. +

+ + + +

+master:connect(address, port) +

+ +

+Attempts to connect a master object to a remote host, transforming it into a +client object. +Client objects support methods +send, +receive, +getsockname, +getpeername, +settimeout, +and close. +

+ +

+Address can be an IP address or a host name. +Port must be an integer number in the range [1..64K). +

+ +

+In case of error, the method returns nil followed by a string +describing the error. In case of success, the method returns 1. +

+ +

+Note: The function socket.connect +is available and is a shortcut for the creation of client sockets. +

+ +

+Note: Starting with LuaSocket 2.0, +the settimeout +method affects the behavior of connect, causing it to return +with an error in case of a timeout. If that happens, you can still call socket.select with the socket in the +sendt table. The socket will be writable when the connection is +established. +

+ + + +

+client:getpeername() +

+ +

+Returns information about the remote side of a connected client object. +

+ +

+Returns a string with the IP address of the peer, followed by the +port number that peer is using for the connection. +In case of error, the method returns nil. +

+ +

+Note: It makes no sense to call this method on server objects. +

+ + + +

+master:getsockname()
+client:getsockname()
+server:getsockname() +

+ +

+Returns the local address information associated to the object. +

+ +

+The method returns a string with local IP address and a number with +the port. In case of error, the method returns nil. +

+ + + +

+master:getstats()
+client:getstats()
+server:getstats()
+

+ +

+Returns accounting information on the socket, useful for throttling +of bandwidth. +

+ +

+The method returns the number of bytes received, the number of bytes sent, +and the age of the socket object in seconds. +

+ + + +

+master:listen(backlog) +

+ +

+Specifies the socket is willing to receive connections, transforming the +object into a server object. Server objects support the +accept, +getsockname, +setoption, +settimeout, +and close methods. +

+ +

+The parameter backlog specifies the number of client +connections that can +be queued waiting for service. If the queue is full and another client +attempts connection, the connection is refused. +

+ +

+In case of success, the method returns 1. In case of error, the +method returns nil followed by an error message. +

+ + + +

+client:receive([pattern [, prefix]]) +

+ +

+Reads data from a client object, according to the specified read +pattern. Patterns follow the Lua file I/O format, and the difference in performance between all patterns is negligible. +

+ +

+Pattern can be any of the following: +

+ +
    +
  • '*a': reads from the socket until the connection is +closed. No end-of-line translation is performed; +
  • '*l': reads a line of text from the socket. The line is +terminated by a LF character (ASCII 10), optionally preceded by a +CR character (ASCII 13). The CR and LF characters are not included in +the returned line. In fact, all CR characters are +ignored by the pattern. This is the default pattern; +
  • number: causes the method to read a specified number +of bytes from the socket. +
+ +

+Prefix is an optional string to be concatenated to the beginning +of any received data before return. +

+ +

+If successful, the method returns the received pattern. In case of error, +the method returns nil followed by an error message which +can be the string 'closed' in case the connection was +closed before the transmission was completed or the string +'timeout' in case there was a timeout during the operation. +Also, after the error message, the function returns the partial result of +the transmission. +

+ +

+Important note: This function was changed severely. It used +to support multiple patterns (but I have never seen this feature used) and +now it doesn't anymore. Partial results used to be returned in the same +way as successful results. This last feature violated the idea that all +functions should return nil on error. Thus it was changed +too. +

+ + + +

+client:send(data [, i [, j]]) +

+ +

+Sends data through client object. +

+ +

+Data is the string to be sent. The optional arguments +i and j work exactly like the standard +string.sub Lua function to allow the selection of a +substring to be sent. +

+ +

+If successful, the method returns the index of the last byte +within [i, j] that has been sent. Notice that, if +i is 1 or absent, this is effectively the total +number of bytes sent. In case of error, the method returns +nil, followed by an error message, followed +by the index of the last byte within [i, j] that +has been sent. You might want to try again from the byte +following that. The error message can be 'closed' +in case the connection was closed before the transmission +was completed or the string 'timeout' in case +there was a timeout during the operation. +

+ +

+Note: Output is not buffered. For small strings, +it is always better to concatenate them in Lua +(with the '..' operator) and send the result in one call +instead of calling the method several times. +

+ + + +

+client:setoption(option [, value])
+server:setoption(option [, value]) +

+ +

+Sets options for the TCP object. Options are only needed by low-level or +time-critical applications. You should only modify an option if you +are sure you need it. +

+ +

+Option is a string with the option name, and value +depends on the option being set: + +

    + +
  • 'keepalive': Setting this option to true enables +the periodic transmission of messages on a connected socket. Should the +connected party fail to respond to these messages, the connection is +considered broken and processes using the socket are notified; + +
  • 'linger': Controls the action taken when unsent data are +queued on a socket and a close is performed. The value is a table with a +boolean entry 'on' and a numeric entry for the time interval +'timeout' in seconds. If the 'on' field is set to +true, the system will block the process on the close attempt until +it is able to transmit the data or until 'timeout' has passed. If +'on' is false and a close is issued, the system will +process the close in a manner that allows the process to continue as +quickly as possible. I do not advise you to set this to anything other than +zero; + +
  • 'reuseaddr': Setting this option indicates that the rules +used in validating addresses supplied in a call to +bind should allow reuse of local addresses; + +
  • 'tcp-nodelay': Setting this option to true +disables the Nagle's algorithm for the connection. + +
+ +

+The method returns 1 in case of success, or nil otherwise. +

+ +

+Note: The descriptions above come from the man pages. +

+ + + +

+master:setstats(received, sent, age)
+client:setstats(received, sent, age)
+server:setstats(received, sent, age)
+

+ +

+Resets accounting information on the socket, useful for throttling +of bandwidth. +

+ +

+Received is a number with the new number of bytes received. +Sent is a number with the new number of bytes sent. +Age is the new age in seconds. +

+ +

+The method returns 1 in case of success and nil otherwise. +

+ + + +

+master:settimeout(value [, mode])
+client:settimeout(value [, mode])
+server:settimeout(value [, mode]) +

+ +

+Changes the timeout values for the object. By default, +all I/O operations are blocking. That is, any call to the methods +send, +receive, and +accept +will block indefinitely, until the operation completes. The +settimeout method defines a limit on the amount of time the +I/O methods can block. When a timeout is set and the specified amount of +time has elapsed, the affected methods give up and fail with an error code. +

+ +

+The amount of time to wait is specified as the +value parameter, in seconds. There are two timeout modes and +both can be used together for fine tuning: +

+ +
    +
  • 'b': block timeout. Specifies the upper limit on +the amount of time LuaSocket can be blocked by the operating system +while waiting for completion of any single I/O operation. This is the +default mode;
  • + +
  • 't': total timeout. Specifies the upper limit on +the amount of time LuaSocket can block a Lua script before returning from +a call.
  • +
+ +

+The nil timeout value allows operations to block +indefinitely. Negative timeout values have the same effect. +

+ +

+Note: although timeout values have millisecond precision in LuaSocket, +large blocks can cause I/O functions not to respect timeout values due +to the time the library takes to transfer blocks to and from the OS +and to and from the Lua interpreter. Also, function that accept host names +and perform automatic name resolution might be blocked by the resolver for +longer than the specified timeout value. +

+ +

+Note: The old timeout method is deprecated. The name has been +changed for sake of uniformity, since all other method names already +contained verbs making their imperative nature obvious. +

+ + + +

+client:shutdown(mode)
+

+ +

+Shuts down part of a full-duplex connection. +

+ +

+Mode tells which way of the connection should be shut down and can +take the value: +

    +
  • "both": disallow further sends and receives on the object. +This is the default mode; +
  • "send": disallow further sends on the object; +
  • "receive": disallow further receives on the object. +
+ +

+This function returns 1. +

+ + + + + + + diff --git a/cosmic rage/docs/LuaSocket_documentation/udp.html b/cosmic rage/docs/LuaSocket_documentation/udp.html new file mode 100644 index 0000000..688649d --- /dev/null +++ b/cosmic rage/docs/LuaSocket_documentation/udp.html @@ -0,0 +1,416 @@ + + + + + + +LuaSocket: UDP support + + + + + + + +
+
+
+ + + +
+LuaSocket +
Network support for the Lua language +
+

+home · +download · +installation · +introduction · +reference +

+
+
+
+ + + + +

UDP

+ + + +

+socket.udp() +

+ +

+Creates and returns an unconnected UDP object. Unconnected objects support the +sendto, +receive, +receivefrom, +getsockname, +setoption, +settimeout, +setpeername, +setsockname, and +close. +The setpeername +is used to connect the object. +

+ +

+In case of success, a new unconnected UDP object +returned. In case of error, nil is returned, followed by +an error message. +

+ + + +

+connected:close()
+unconnected:close() +

+ +

+Closes a UDP object. The internal socket +used by the object is closed and the local address to which the +object was bound is made available to other applications. No +further operations (except for further calls to the close +method) are allowed on a closed socket. +

+ +

+Note: It is important to close all used sockets +once they are not needed, since, in many systems, each socket uses +a file descriptor, which are limited system resources. +Garbage-collected objects are automatically closed before +destruction, though. +

+ + + +

+connected:getpeername() +

+ +

+Retrieves information about the peer +associated with a connected UDP object. +

+ +

+Returns the IP address and port number of the peer. +

+ +

+Note: It makes no sense to call this method on unconnected objects. +

+ + + +

+connected:getsockname()
+unconnected:getsockname() +

+ +

+Returns the local address information associated to the object. +

+ +

+The method returns a string with local IP +address and a number with the port. In case of error, the method +returns nil. +

+ +

+Note: UDP sockets are not bound to any address +until the setsockname or the +sendto method is called for the +first time (in which case it is bound to an ephemeral port and the +wild-card address). +

+ + + +

+connected:receive([size])
+unconnected:receive([size]) +

+ +

+Receives a datagram from the UDP object. If +the UDP object is connected, only datagrams coming from the peer +are accepted. Otherwise, the returned datagram can come from any +host. +

+ +

+The optional size parameter +specifies the maximum size of the datagram to be retrieved. If +there are more than size bytes available in the datagram, +the excess bytes are discarded. If there are less then +size bytes available in the current datagram, the +available bytes are returned. If size is omitted, the +maximum datagram size is used (which is currently limited by the +implementation to 8192 bytes). +

+ +

+In case of success, the method returns the +received datagram. In case of timeout, the method returns +nil followed by the string 'timeout'. +

+ + + +

+unconnected:receivefrom([size]) +

+ +

+Works exactly as the receive +method, except it returns the IP +address and port as extra return values (and is therefore slightly less +efficient). +

+ + + +

+connected:send(datagram) +

+ +

+Sends a datagram to the UDP peer of a connected object. +

+ +

+Datagram is a string with the datagram contents. +The maximum datagram size for UDP is 64K minus IP layer overhead. +However datagrams larger than the link layer packet size will be +fragmented, which may deteriorate performance and/or reliability. +

+ +

+If successful, the method returns 1. In case of +error, the method returns nil followed by an error message. +

+ +

+Note: In UDP, the send method never blocks +and the only way it can fail is if the underlying transport layer +refuses to send a message to the specified address (i.e. no +interface accepts the address). +

+ + + +

+unconnected:sendto(datagram, ip, port) +

+ +

+Sends a datagram to the specified IP address and port number. +

+ +

+Datagram is a string with the +datagram contents. +The maximum datagram size for UDP is 64K minus IP layer overhead. +However datagrams larger than the link layer packet size will be +fragmented, which may deteriorate performance and/or reliability. +Ip is the IP address of the recipient. +Host names are not allowed for performance reasons. + +Port is the port number at the recipient. +

+ +

+If successful, the method returns 1. In case of +error, the method returns nil followed by an error message. +

+ +

+Note: In UDP, the send method never blocks +and the only way it can fail is if the underlying transport layer +refuses to send a message to the specified address (i.e. no +interface accepts the address). +

+ + + +

+connected:setpeername('*')
+unconnected:setpeername(address, port) +

+ +

+Changes the peer of a UDP object. This +method turns an unconnected UDP object into a connected UDP +object or vice versa. +

+ +

+For connected objects, outgoing datagrams +will be sent to the specified peer, and datagrams received from +other peers will be discarded by the OS. Connected UDP objects must +use the send and +receive methods instead of +sendto and +receivefrom. +

+ +

+Address can be an IP address or a +host name. Port is the port number. If address is +'*' and the object is connected, the peer association is +removed and the object becomes an unconnected object again. In that +case, the port argument is ignored. +

+ +

+In case of error the method returns +nil followed by an error message. In case of success, the +method returns 1. +

+ +

+Note: Since the address of the peer does not have +to be passed to and from the OS, the use of connected UDP objects +is recommended when the same peer is used for several transmissions +and can result in up to 30% performance gains. +

+ + + +

+unconnected:setsockname(address, port) +

+ +

+Binds the UDP object to a local address. +

+ +

+Address can be an IP address or a +host name. If address is '*' the system binds to +all local interfaces using the constant INADDR_ANY. If +port is 0, the system chooses an ephemeral port. +

+ +

+If successful, the method returns 1. In case of +error, the method returns nil followed by an error +message. +

+ +

+Note: This method can only be called before any +datagram is sent through the UDP object, and only once. Otherwise, +the system automatically binds the object to all local interfaces +and chooses an ephemeral port as soon as the first datagram is +sent. After the local address is set, either automatically by the +system or explicitly by setsockname, it cannot be +changed. +

+ + + +

+connected:setoption(option [, value])
+unconnected:setoption(option [, value]) +

+ +

+Sets options for the UDP object. Options are +only needed by low-level or time-critical applications. You should +only modify an option if you are sure you need it.

+

Option is a string with the option +name, and value depends on the option being set: +

+ +
    +
  • 'dontroute': Setting this option to true +indicates that outgoing messages should bypass the standard routing +facilities;
  • +
  • 'broadcast': Setting this option to true +requests permission to send broadcast datagrams on the +socket.
  • +
+ +

+The method returns 1 in case of success, or +nil followed by an error message otherwise. +

+ +

+Note: The descriptions above come from the man +pages. +

+ + + +

+connected:settimeout(value)
+unconnected:settimeout(value) +

+ +

+Changes the timeout values for the object. By default, the +receive and +receivefrom +operations are blocking. That is, any call to the methods will block +indefinitely, until data arrives. The settimeout function defines +a limit on the amount of time the functions can block. When a timeout is +set and the specified amount of time has elapsed, the affected methods +give up and fail with an error code. +

+ +

+The amount of time to wait is specified as +the value parameter, in seconds. The nil timeout +value allows operations to block indefinitely. Negative +timeout values have the same effect. +

+ +

+Note: In UDP, the send +and sendto methods never block (the +datagram is just passed to the OS and the call returns +immediately). Therefore, the settimeout method has no +effect on them. +

+ +

+Note: The old timeout method is +deprecated. The name has been changed for sake of uniformity, since +all other method names already contained verbs making their +imperative nature obvious. +

+ + + + + + + diff --git a/cosmic rage/docs/LuaSocket_documentation/url.html b/cosmic rage/docs/LuaSocket_documentation/url.html new file mode 100644 index 0000000..e87126f --- /dev/null +++ b/cosmic rage/docs/LuaSocket_documentation/url.html @@ -0,0 +1,329 @@ + + + + + + +LuaSocket: URL support + + + + + + + +
+
+
+ + + +
+LuaSocket +
Network support for the Lua language +
+

+home · +download · +installation · +introduction · +reference +

+
+
+
+ + + +

URL

+ +

+The url namespace provides functions to parse, protect, +and build URLs, as well as functions to compose absolute URLs +from base and relative URLs, according to +RFC +2396. +

+ +

+To obtain the url namespace, run: +

+ +
+-- loads the URL module 
+local url = require("socket.url")
+
+ +

+An URL is defined by the following grammar: +

+ +
+ +<url> ::= [<scheme>:][//<authority>][/<path>][;<params>][?<query>][#<fragment>]
+<authority> ::= [<userinfo>@]<host>[:<port>]
+<userinfo> ::= <user>[:<password>]
+<path> ::= {<segment>/}<segment>
+
+
+ + + +

+url.absolute(base, relative) +

+ +

+Builds an absolute URL from a base URL and a relative URL. +

+ +

+Base is a string with the base URL or +a parsed URL table. Relative is a +string with the relative URL. +

+ +

+The function returns a string with the absolute URL. +

+ +

+Note: The rules that +govern the composition are fairly complex, and are described in detail in +RFC 2396. +The example bellow should give an idea of what the rules are. +

+ +
+http://a/b/c/d;p?q
+
++
+
+g:h      =  g:h
+g        =  http://a/b/c/g
+./g      =  http://a/b/c/g
+g/       =  http://a/b/c/g/
+/g       =  http://a/g
+//g      =  http://g
+?y       =  http://a/b/c/?y
+g?y      =  http://a/b/c/g?y
+#s       =  http://a/b/c/d;p?q#s
+g#s      =  http://a/b/c/g#s
+g?y#s    =  http://a/b/c/g?y#s
+;x       =  http://a/b/c/;x
+g;x      =  http://a/b/c/g;x
+g;x?y#s  =  http://a/b/c/g;x?y#s
+.        =  http://a/b/c/
+./       =  http://a/b/c/
+..       =  http://a/b/
+../      =  http://a/b/
+../g     =  http://a/b/g
+../..    =  http://a/
+../../   =  http://a/
+../../g  =  http://a/g
+
+ + + +

+url.build(parsed_url) +

+ +

+Rebuilds an URL from its parts. +

+ +

+Parsed_url is a table with same components returned by +parse. +Lower level components, if specified, +take precedence over high level components of the URL grammar. +

+ +

+The function returns a string with the built URL. +

+ + + +

+url.build_path(segments, unsafe) +

+ +

+Builds a <path> component from a list of +<segment> parts. +Before composition, any reserved characters found in a segment are escaped into +their protected form, so that the resulting path is a valid URL path +component. +

+ +

+Segments is a list of strings with the <segment> +parts. If unsafe is anything but nil, reserved +characters are left untouched. +

+ +

+The function returns a string with the +built <path> component. +

+ + + +

+url.escape(content) +

+ +

+Applies the URL escaping content coding to a string +Each byte is encoded as a percent character followed +by the two byte hexadecimal representation of its integer +value. +

+ +

+Content is the string to be encoded. +

+ +

+The function returns the encoded string. +

+ +
+-- load url module
+url = require("socket.url")
+
+code = url.escape("/#?;")
+-- code = "%2f%23%3f%3b"
+
+ + + +

+url.parse(url, default) +

+ +

+Parses an URL given as a string into a Lua table with its components. +

+ +

+Url is the URL to be parsed. If the default table is +present, it is used to store the parsed fields. Only fields present in the +URL are overwritten. Therefore, this table can be used to pass default +values for each field. +

+ +

+The function returns a table with all the URL components: +

+ +
+parsed_url = {
+  url = string,
+  scheme = string,
+  authority = string,
+  path = string,
+  params = string,
+  query = string,
+  fragment = string,
+  userinfo = string,
+  host = string,
+  port = string,
+  user = string,
+  password = string
+} +
+ +
+-- load url module
+url = require("socket.url")
+
+parsed_url = url.parse("http://www.example.com/cgilua/index.lua?a=2#there")
+-- parsed_url = {
+--   scheme = "http",
+--   authority = "www.example.com",
+--   path = "/cgilua/index.lua"
+--   query = "a=2",
+--   fragment = "there",
+--   host = "www.puc-rio.br",
+-- }
+
+parsed_url = url.parse("ftp://root:passwd@unsafe.org/pub/virus.exe;type=i")
+-- parsed_url = {
+--   scheme = "ftp",
+--   authority = "root:passwd@unsafe.org",
+--   path = "/pub/virus.exe",
+--   params = "type=i",
+--   userinfo = "root:passwd",
+--   host = "unsafe.org",
+--   user = "root",
+--   password = "passwd",
+-- }
+
+ + + +

+url.parse_path(path) +

+ +

+Breaks a <path> URL component into all its +<segment> parts. +

+ +

+Path is a string with the path to be parsed. +

+ +

+Since some characters are reserved in URLs, they must be escaped +whenever present in a <path> component. Therefore, before +returning a list with all the parsed segments, the function removes +escaping from all of them. +

+ + + +

+url.unescape(content) +

+ +

+Removes the URL escaping content coding from a string. +

+ +

+Content is the string to be decoded. +

+ +

+The function returns the decoded string. +

+ + + + + + + diff --git a/cosmic rage/docs/LuaSocket_license.txt b/cosmic rage/docs/LuaSocket_license.txt new file mode 100644 index 0000000..7dbd1de --- /dev/null +++ b/cosmic rage/docs/LuaSocket_license.txt @@ -0,0 +1,21 @@ +LuaSocket 2.0.2 license +Copyright 2004-2007 Diego Nehab + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + diff --git a/cosmic rage/docs/PCRE_ChangeLog.txt b/cosmic rage/docs/PCRE_ChangeLog.txt new file mode 100644 index 0000000..7d32804 --- /dev/null +++ b/cosmic rage/docs/PCRE_ChangeLog.txt @@ -0,0 +1,2552 @@ +ChangeLog for PCRE +------------------ + +Version 7.0 19-Dec-06 +--------------------- + + 1. Fixed a signed/unsigned compiler warning in pcre_compile.c, shown up by + moving to gcc 4.1.1. + + 2. The -S option for pcretest uses setrlimit(); I had omitted to #include + sys/time.h, which is documented as needed for this function. It doesn't + seem to matter on Linux, but it showed up on some releases of OS X. + + 3. It seems that there are systems where bytes whose values are greater than + 127 match isprint() in the "C" locale. The "C" locale should be the + default when a C program starts up. In most systems, only ASCII printing + characters match isprint(). This difference caused the output from pcretest + to vary, making some of the tests fail. I have changed pcretest so that: + + (a) When it is outputting text in the compiled version of a pattern, bytes + other than 32-126 are always shown as hex escapes. + + (b) When it is outputting text that is a matched part of a subject string, + it does the same, unless a different locale has been set for the match + (using the /L modifier). In this case, it uses isprint() to decide. + + 4. Fixed a major bug that caused incorrect computation of the amount of memory + required for a compiled pattern when options that changed within the + pattern affected the logic of the preliminary scan that determines the + length. The relevant options are -x, and -i in UTF-8 mode. The result was + that the computed length was too small. The symptoms of this bug were + either the PCRE error "internal error: code overflow" from pcre_compile(), + or a glibc crash with a message such as "pcretest: free(): invalid next + size (fast)". Examples of patterns that provoked this bug (shown in + pcretest format) are: + + /(?-x: )/x + /(?x)(?-x: \s*#\s*)/ + /((?i)[\x{c0}])/8 + /(?i:[\x{c0}])/8 + + HOWEVER: Change 17 below makes this fix obsolete as the memory computation + is now done differently. + + 5. Applied patches from Google to: (a) add a QuoteMeta function to the C++ + wrapper classes; (b) implement a new function in the C++ scanner that is + more efficient than the old way of doing things because it avoids levels of + recursion in the regex matching; (c) add a paragraph to the documentation + for the FullMatch() function. + + 6. The escape sequence \n was being treated as whatever was defined as + "newline". Not only was this contrary to the documentation, which states + that \n is character 10 (hex 0A), but it also went horribly wrong when + "newline" was defined as CRLF. This has been fixed. + + 7. In pcre_dfa_exec.c the value of an unsigned integer (the variable called c) + was being set to -1 for the "end of line" case (supposedly a value that no + character can have). Though this value is never used (the check for end of + line is "zero bytes in current character"), it caused compiler complaints. + I've changed it to 0xffffffff. + + 8. In pcre_version.c, the version string was being built by a sequence of + C macros that, in the event of PCRE_PRERELEASE being defined as an empty + string (as it is for production releases) called a macro with an empty + argument. The C standard says the result of this is undefined. The gcc + compiler treats it as an empty string (which was what was wanted) but it is + reported that Visual C gives an error. The source has been hacked around to + avoid this problem. + + 9. On the advice of a Windows user, included and in Windows + builds of pcretest, and changed the call to _setmode() to use _O_BINARY + instead of 0x8000. Made all the #ifdefs test both _WIN32 and WIN32 (not all + of them did). + +10. Originally, pcretest opened its input and output without "b"; then I was + told that "b" was needed in some environments, so it was added for release + 5.0 to both the input and output. (It makes no difference on Unix-like + systems.) Later I was told that it is wrong for the input on Windows. I've + now abstracted the modes into two macros, to make it easier to fiddle with + them, and removed "b" from the input mode under Windows. + +11. Added pkgconfig support for the C++ wrapper library, libpcrecpp. + +12. Added -help and --help to pcretest as an official way of being reminded + of the options. + +13. Removed some redundant semicolons after macro calls in pcrecpparg.h.in + and pcrecpp.cc because they annoy compilers at high warning levels. + +14. A bit of tidying/refactoring in pcre_exec.c in the main bumpalong loop. + +15. Fixed an occurrence of == in configure.ac that should have been = (shell + scripts are not C programs :-) and which was not noticed because it works + on Linux. + +16. pcretest is supposed to handle any length of pattern and data line (as one + line or as a continued sequence of lines) by extending its input buffer if + necessary. This feature was broken for very long pattern lines, leading to + a string of junk being passed to pcre_compile() if the pattern was longer + than about 50K. + +17. I have done a major re-factoring of the way pcre_compile() computes the + amount of memory needed for a compiled pattern. Previously, there was code + that made a preliminary scan of the pattern in order to do this. That was + OK when PCRE was new, but as the facilities have expanded, it has become + harder and harder to keep it in step with the real compile phase, and there + have been a number of bugs (see for example, 4 above). I have now found a + cunning way of running the real compile function in a "fake" mode that + enables it to compute how much memory it would need, while actually only + ever using a few hundred bytes of working memory and without too many + tests of the mode. This should make future maintenance and development + easier. A side effect of this work is that the limit of 200 on the nesting + depth of parentheses has been removed (though this was never a serious + limitation, I suspect). However, there is a downside: pcre_compile() now + runs more slowly than before (30% or more, depending on the pattern). I + hope this isn't a big issue. There is no effect on runtime performance. + +18. Fixed a minor bug in pcretest: if a pattern line was not terminated by a + newline (only possible for the last line of a file) and it was a + pattern that set a locale (followed by /Lsomething), pcretest crashed. + +19. Added additional timing features to pcretest. (1) The -tm option now times + matching only, not compiling. (2) Both -t and -tm can be followed, as a + separate command line item, by a number that specifies the number of + repeats to use when timing. The default is 50000; this gives better + precision, but takes uncomfortably long for very large patterns. + +20. Extended pcre_study() to be more clever in cases where a branch of a + subpattern has no definite first character. For example, (a*|b*)[cd] would + previously give no result from pcre_study(). Now it recognizes that the + first character must be a, b, c, or d. + +21. There was an incorrect error "recursive call could loop indefinitely" if + a subpattern (or the entire pattern) that was being tested for matching an + empty string contained only one non-empty item after a nested subpattern. + For example, the pattern (?>\x{100}*)\d(?R) provoked this error + incorrectly, because the \d was being skipped in the check. + +22. The pcretest program now has a new pattern option /B and a command line + option -b, which is equivalent to adding /B to every pattern. This causes + it to show the compiled bytecode, without the additional information that + -d shows. The effect of -d is now the same as -b with -i (and similarly, /D + is the same as /B/I). + +23. A new optimization is now able automatically to treat some sequences such + as a*b as a*+b. More specifically, if something simple (such as a character + or a simple class like \d) has an unlimited quantifier, and is followed by + something that cannot possibly match the quantified thing, the quantifier + is automatically "possessified". + +24. A recursive reference to a subpattern whose number was greater than 39 + went wrong under certain circumstances in UTF-8 mode. This bug could also + have affected the operation of pcre_study(). + +25. Realized that a little bit of performance could be had by replacing + (c & 0xc0) == 0xc0 with c >= 0xc0 when processing UTF-8 characters. + +26. Timing data from pcretest is now shown to 4 decimal places instead of 3. + +27. Possessive quantifiers such as a++ were previously implemented by turning + them into atomic groups such as ($>a+). Now they have their own opcodes, + which improves performance. This includes the automatically created ones + from 23 above. + +28. A pattern such as (?=(\w+))\1: which simulates an atomic group using a + lookahead was broken if it was not anchored. PCRE was mistakenly expecting + the first matched character to be a colon. This applied both to named and + numbered groups. + +29. The ucpinternal.h header file was missing its idempotency #ifdef. + +30. I was sent a "project" file called libpcre.a.dev which I understand makes + building PCRE on Windows easier, so I have included it in the distribution. + +31. There is now a check in pcretest against a ridiculously large number being + returned by pcre_exec() or pcre_dfa_exec(). If this happens in a /g or /G + loop, the loop is abandoned. + +32. Forward references to subpatterns in conditions such as (?(2)...) where + subpattern 2 is defined later cause pcre_compile() to search forwards in + the pattern for the relevant set of parentheses. This search went wrong + when there were unescaped parentheses in a character class, parentheses + escaped with \Q...\E, or parentheses in a #-comment in /x mode. + +33. "Subroutine" calls and backreferences were previously restricted to + referencing subpatterns earlier in the regex. This restriction has now + been removed. + +34. Added a number of extra features that are going to be in Perl 5.10. On the + whole, these are just syntactic alternatives for features that PCRE had + previously implemented using the Python syntax or my own invention. The + other formats are all retained for compatibility. + + (a) Named groups can now be defined as (?...) or (?'name'...) as well + as (?P...). The new forms, as well as being in Perl 5.10, are + also .NET compatible. + + (b) A recursion or subroutine call to a named group can now be defined as + (?&name) as well as (?P>name). + + (c) A backreference to a named group can now be defined as \k or + \k'name' as well as (?P=name). The new forms, as well as being in Perl + 5.10, are also .NET compatible. + + (d) A conditional reference to a named group can now use the syntax + (?() or (?('name') as well as (?(name). + + (e) A "conditional group" of the form (?(DEFINE)...) can be used to define + groups (named and numbered) that are never evaluated inline, but can be + called as "subroutines" from elsewhere. In effect, the DEFINE condition + is always false. There may be only one alternative in such a group. + + (f) A test for recursion can be given as (?(R1).. or (?(R&name)... as well + as the simple (?(R). The condition is true only if the most recent + recursion is that of the given number or name. It does not search out + through the entire recursion stack. + + (g) The escape \gN or \g{N} has been added, where N is a positive or + negative number, specifying an absolute or relative reference. + +35. Tidied to get rid of some further signed/unsigned compiler warnings and + some "unreachable code" warnings. + +36. Updated the Unicode property tables to Unicode version 5.0.0. Amongst other + things, this adds five new scripts. + +37. Perl ignores orphaned \E escapes completely. PCRE now does the same. + There were also incompatibilities regarding the handling of \Q..\E inside + character classes, for example with patterns like [\Qa\E-\Qz\E] where the + hyphen was adjacent to \Q or \E. I hope I've cleared all this up now. + +38. Like Perl, PCRE detects when an indefinitely repeated parenthesized group + matches an empty string, and forcibly breaks the loop. There were bugs in + this code in non-simple cases. For a pattern such as ^(a()*)* matched + against aaaa the result was just "a" rather than "aaaa", for example. Two + separate and independent bugs (that affected different cases) have been + fixed. + +39. Refactored the code to abolish the use of different opcodes for small + capturing bracket numbers. This is a tidy that I avoided doing when I + removed the limit on the number of capturing brackets for 3.5 back in 2001. + The new approach is not only tidier, it makes it possible to reduce the + memory needed to fix the previous bug (38). + +40. Implemented PCRE_NEWLINE_ANY to recognize any of the Unicode newline + sequences (http://unicode.org/unicode/reports/tr18/) as "newline" when + processing dot, circumflex, or dollar metacharacters, or #-comments in /x + mode. + +41. Add \R to match any Unicode newline sequence, as suggested in the Unicode + report. + +42. Applied patch, originally from Ari Pollak, modified by Google, to allow + copy construction and assignment in the C++ wrapper. + +43. Updated pcregrep to support "--newline=any". In the process, I fixed a + couple of bugs that could have given wrong results in the "--newline=crlf" + case. + +44. Added a number of casts and did some reorganization of signed/unsigned int + variables following suggestions from Dair Grant. Also renamed the variable + "this" as "item" because it is a C++ keyword. + +45. Arranged for dftables to add + + #include "pcre_internal.h" + + to pcre_chartables.c because without it, gcc 4.x may remove the array + definition from the final binary if PCRE is built into a static library and + dead code stripping is activated. + +46. For an unanchored pattern, if a match attempt fails at the start of a + newline sequence, and the newline setting is CRLF or ANY, and the next two + characters are CRLF, advance by two characters instead of one. + + +Version 6.7 04-Jul-06 +--------------------- + + 1. In order to handle tests when input lines are enormously long, pcretest has + been re-factored so that it automatically extends its buffers when + necessary. The code is crude, but this _is_ just a test program. The + default size has been increased from 32K to 50K. + + 2. The code in pcre_study() was using the value of the re argument before + testing it for NULL. (Of course, in any sensible call of the function, it + won't be NULL.) + + 3. The memmove() emulation function in pcre_internal.h, which is used on + systems that lack both memmove() and bcopy() - that is, hardly ever - + was missing a "static" storage class specifier. + + 4. When UTF-8 mode was not set, PCRE looped when compiling certain patterns + containing an extended class (one that cannot be represented by a bitmap + because it contains high-valued characters or Unicode property items, e.g. + [\pZ]). Almost always one would set UTF-8 mode when processing such a + pattern, but PCRE should not loop if you do not (it no longer does). + [Detail: two cases were found: (a) a repeated subpattern containing an + extended class; (b) a recursive reference to a subpattern that followed a + previous extended class. It wasn't skipping over the extended class + correctly when UTF-8 mode was not set.] + + 5. A negated single-character class was not being recognized as fixed-length + in lookbehind assertions such as (?<=[^f]), leading to an incorrect + compile error "lookbehind assertion is not fixed length". + + 6. The RunPerlTest auxiliary script was showing an unexpected difference + between PCRE and Perl for UTF-8 tests. It turns out that it is hard to + write a Perl script that can interpret lines of an input file either as + byte characters or as UTF-8, which is what "perltest" was being required to + do for the non-UTF-8 and UTF-8 tests, respectively. Essentially what you + can't do is switch easily at run time between having the "use utf8;" pragma + or not. In the end, I fudged it by using the RunPerlTest script to insert + "use utf8;" explicitly for the UTF-8 tests. + + 7. In multiline (/m) mode, PCRE was matching ^ after a terminating newline at + the end of the subject string, contrary to the documentation and to what + Perl does. This was true of both matching functions. Now it matches only at + the start of the subject and immediately after *internal* newlines. + + 8. A call of pcre_fullinfo() from pcretest to get the option bits was passing + a pointer to an int instead of a pointer to an unsigned long int. This + caused problems on 64-bit systems. + + 9. Applied a patch from the folks at Google to pcrecpp.cc, to fix "another + instance of the 'standard' template library not being so standard". + +10. There was no check on the number of named subpatterns nor the maximum + length of a subpattern name. The product of these values is used to compute + the size of the memory block for a compiled pattern. By supplying a very + long subpattern name and a large number of named subpatterns, the size + computation could be caused to overflow. This is now prevented by limiting + the length of names to 32 characters, and the number of named subpatterns + to 10,000. + +11. Subpatterns that are repeated with specific counts have to be replicated in + the compiled pattern. The size of memory for this was computed from the + length of the subpattern and the repeat count. The latter is limited to + 65535, but there was no limit on the former, meaning that integer overflow + could in principle occur. The compiled length of a repeated subpattern is + now limited to 30,000 bytes in order to prevent this. + +12. Added the optional facility to have named substrings with the same name. + +13. Added the ability to use a named substring as a condition, using the + Python syntax: (?(name)yes|no). This overloads (?(R)... and names that + are numbers (not recommended). Forward references are permitted. + +14. Added forward references in named backreferences (if you see what I mean). + +15. In UTF-8 mode, with the PCRE_DOTALL option set, a quantified dot in the + pattern could run off the end of the subject. For example, the pattern + "(?s)(.{1,5})"8 did this with the subject "ab". + +16. If PCRE_DOTALL or PCRE_MULTILINE were set, pcre_dfa_exec() behaved as if + PCRE_CASELESS was set when matching characters that were quantified with ? + or *. + +17. A character class other than a single negated character that had a minimum + but no maximum quantifier - for example [ab]{6,} - was not handled + correctly by pce_dfa_exec(). It would match only one character. + +18. A valid (though odd) pattern that looked like a POSIX character + class but used an invalid character after [ (for example [[,abc,]]) caused + pcre_compile() to give the error "Failed: internal error: code overflow" or + in some cases to crash with a glibc free() error. This could even happen if + the pattern terminated after [[ but there just happened to be a sequence of + letters, a binary zero, and a closing ] in the memory that followed. + +19. Perl's treatment of octal escapes in the range \400 to \777 has changed + over the years. Originally (before any Unicode support), just the bottom 8 + bits were taken. Thus, for example, \500 really meant \100. Nowadays the + output from "man perlunicode" includes this: + + The regular expression compiler produces polymorphic opcodes. That + is, the pattern adapts to the data and automatically switches to + the Unicode character scheme when presented with Unicode data--or + instead uses a traditional byte scheme when presented with byte + data. + + Sadly, a wide octal escape does not cause a switch, and in a string with + no other multibyte characters, these octal escapes are treated as before. + Thus, in Perl, the pattern /\500/ actually matches \100 but the pattern + /\500|\x{1ff}/ matches \500 or \777 because the whole thing is treated as a + Unicode string. + + I have not perpetrated such confusion in PCRE. Up till now, it took just + the bottom 8 bits, as in old Perl. I have now made octal escapes with + values greater than \377 illegal in non-UTF-8 mode. In UTF-8 mode they + translate to the appropriate multibyte character. + +29. Applied some refactoring to reduce the number of warnings from Microsoft + and Borland compilers. This has included removing the fudge introduced + seven years ago for the OS/2 compiler (see 2.02/2 below) because it caused + a warning about an unused variable. + +21. PCRE has not included VT (character 0x0b) in the set of whitespace + characters since release 4.0, because Perl (from release 5.004) does not. + [Or at least, is documented not to: some releases seem to be in conflict + with the documentation.] However, when a pattern was studied with + pcre_study() and all its branches started with \s, PCRE still included VT + as a possible starting character. Of course, this did no harm; it just + caused an unnecessary match attempt. + +22. Removed a now-redundant internal flag bit that recorded the fact that case + dependency changed within the pattern. This was once needed for "required + byte" processing, but is no longer used. This recovers a now-scarce options + bit. Also moved the least significant internal flag bit to the most- + significant bit of the word, which was not previously used (hangover from + the days when it was an int rather than a uint) to free up another bit for + the future. + +23. Added support for CRLF line endings as well as CR and LF. As well as the + default being selectable at build time, it can now be changed at runtime + via the PCRE_NEWLINE_xxx flags. There are now options for pcregrep to + specify that it is scanning data with non-default line endings. + +24. Changed the definition of CXXLINK to make it agree with the definition of + LINK in the Makefile, by replacing LDFLAGS to CXXFLAGS. + +25. Applied Ian Taylor's patches to avoid using another stack frame for tail + recursions. This makes a big different to stack usage for some patterns. + +26. If a subpattern containing a named recursion or subroutine reference such + as (?P>B) was quantified, for example (xxx(?P>B)){3}, the calculation of + the space required for the compiled pattern went wrong and gave too small a + value. Depending on the environment, this could lead to "Failed: internal + error: code overflow at offset 49" or "glibc detected double free or + corruption" errors. + +27. Applied patches from Google (a) to support the new newline modes and (b) to + advance over multibyte UTF-8 characters in GlobalReplace. + +28. Change free() to pcre_free() in pcredemo.c. Apparently this makes a + difference for some implementation of PCRE in some Windows version. + +29. Added some extra testing facilities to pcretest: + + \q in a data line sets the "match limit" value + \Q in a data line sets the "match recursion limt" value + -S sets the stack size, where is in megabytes + + The -S option isn't available for Windows. + + +Version 6.6 06-Feb-06 +--------------------- + + 1. Change 16(a) for 6.5 broke things, because PCRE_DATA_SCOPE was not defined + in pcreposix.h. I have copied the definition from pcre.h. + + 2. Change 25 for 6.5 broke compilation in a build directory out-of-tree + because pcre.h is no longer a built file. + + 3. Added Jeff Friedl's additional debugging patches to pcregrep. These are + not normally included in the compiled code. + + +Version 6.5 01-Feb-06 +--------------------- + + 1. When using the partial match feature with pcre_dfa_exec(), it was not + anchoring the second and subsequent partial matches at the new starting + point. This could lead to incorrect results. For example, with the pattern + /1234/, partially matching against "123" and then "a4" gave a match. + + 2. Changes to pcregrep: + + (a) All non-match returns from pcre_exec() were being treated as failures + to match the line. Now, unless the error is PCRE_ERROR_NOMATCH, an + error message is output. Some extra information is given for the + PCRE_ERROR_MATCHLIMIT and PCRE_ERROR_RECURSIONLIMIT errors, which are + probably the only errors that are likely to be caused by users (by + specifying a regex that has nested indefinite repeats, for instance). + If there are more than 20 of these errors, pcregrep is abandoned. + + (b) A binary zero was treated as data while matching, but terminated the + output line if it was written out. This has been fixed: binary zeroes + are now no different to any other data bytes. + + (c) Whichever of the LC_ALL or LC_CTYPE environment variables is set is + used to set a locale for matching. The --locale=xxxx long option has + been added (no short equivalent) to specify a locale explicitly on the + pcregrep command, overriding the environment variables. + + (d) When -B was used with -n, some line numbers in the output were one less + than they should have been. + + (e) Added the -o (--only-matching) option. + + (f) If -A or -C was used with -c (count only), some lines of context were + accidentally printed for the final match. + + (g) Added the -H (--with-filename) option. + + (h) The combination of options -rh failed to suppress file names for files + that were found from directory arguments. + + (i) Added the -D (--devices) and -d (--directories) options. + + (j) Added the -F (--fixed-strings) option. + + (k) Allow "-" to be used as a file name for -f as well as for a data file. + + (l) Added the --colo(u)r option. + + (m) Added Jeffrey Friedl's -S testing option, but within #ifdefs so that it + is not present by default. + + 3. A nasty bug was discovered in the handling of recursive patterns, that is, + items such as (?R) or (?1), when the recursion could match a number of + alternatives. If it matched one of the alternatives, but subsequently, + outside the recursion, there was a failure, the code tried to back up into + the recursion. However, because of the way PCRE is implemented, this is not + possible, and the result was an incorrect result from the match. + + In order to prevent this happening, the specification of recursion has + been changed so that all such subpatterns are automatically treated as + atomic groups. Thus, for example, (?R) is treated as if it were (?>(?R)). + + 4. I had overlooked the fact that, in some locales, there are characters for + which isalpha() is true but neither isupper() nor islower() are true. In + the fr_FR locale, for instance, the \xAA and \xBA characters (ordmasculine + and ordfeminine) are like this. This affected the treatment of \w and \W + when they appeared in character classes, but not when they appeared outside + a character class. The bit map for "word" characters is now created + separately from the results of isalnum() instead of just taking it from the + upper, lower, and digit maps. (Plus the underscore character, of course.) + + 5. The above bug also affected the handling of POSIX character classes such as + [[:alpha:]] and [[:alnum:]]. These do not have their own bit maps in PCRE's + permanent tables. Instead, the bit maps for such a class were previously + created as the appropriate unions of the upper, lower, and digit bitmaps. + Now they are created by subtraction from the [[:word:]] class, which has + its own bitmap. + + 6. The [[:blank:]] character class matches horizontal, but not vertical space. + It is created by subtracting the vertical space characters (\x09, \x0a, + \x0b, \x0c) from the [[:space:]] bitmap. Previously, however, the + subtraction was done in the overall bitmap for a character class, meaning + that a class such as [\x0c[:blank:]] was incorrect because \x0c would not + be recognized. This bug has been fixed. + + 7. Patches from the folks at Google: + + (a) pcrecpp.cc: "to handle a corner case that may or may not happen in + real life, but is still worth protecting against". + + (b) pcrecpp.cc: "corrects a bug when negative radixes are used with + regular expressions". + + (c) pcre_scanner.cc: avoid use of std::count() because not all systems + have it. + + (d) Split off pcrecpparg.h from pcrecpp.h and had the former built by + "configure" and the latter not, in order to fix a problem somebody had + with compiling the Arg class on HP-UX. + + (e) Improve the error-handling of the C++ wrapper a little bit. + + (f) New tests for checking recursion limiting. + + 8. The pcre_memmove() function, which is used only if the environment does not + have a standard memmove() function (and is therefore rarely compiled), + contained two bugs: (a) use of int instead of size_t, and (b) it was not + returning a result (though PCRE never actually uses the result). + + 9. In the POSIX regexec() interface, if nmatch is specified as a ridiculously + large number - greater than INT_MAX/(3*sizeof(int)) - REG_ESPACE is + returned instead of calling malloc() with an overflowing number that would + most likely cause subsequent chaos. + +10. The debugging option of pcretest was not showing the NO_AUTO_CAPTURE flag. + +11. The POSIX flag REG_NOSUB is now supported. When a pattern that was compiled + with this option is matched, the nmatch and pmatch options of regexec() are + ignored. + +12. Added REG_UTF8 to the POSIX interface. This is not defined by POSIX, but is + provided in case anyone wants to the the POSIX interface with UTF-8 + strings. + +13. Added CXXLDFLAGS to the Makefile parameters to provide settings only on the + C++ linking (needed for some HP-UX environments). + +14. Avoid compiler warnings in get_ucpname() when compiled without UCP support + (unused parameter) and in the pcre_printint() function (omitted "default" + switch label when the default is to do nothing). + +15. Added some code to make it possible, when PCRE is compiled as a C++ + library, to replace subject pointers for pcre_exec() with a smart pointer + class, thus making it possible to process discontinuous strings. + +16. The two macros PCRE_EXPORT and PCRE_DATA_SCOPE are confusing, and perform + much the same function. They were added by different people who were trying + to make PCRE easy to compile on non-Unix systems. It has been suggested + that PCRE_EXPORT be abolished now that there is more automatic apparatus + for compiling on Windows systems. I have therefore replaced it with + PCRE_DATA_SCOPE. This is set automatically for Windows; if not set it + defaults to "extern" for C or "extern C" for C++, which works fine on + Unix-like systems. It is now possible to override the value of PCRE_DATA_ + SCOPE with something explicit in config.h. In addition: + + (a) pcreposix.h still had just "extern" instead of either of these macros; + I have replaced it with PCRE_DATA_SCOPE. + + (b) Functions such as _pcre_xclass(), which are internal to the library, + but external in the C sense, all had PCRE_EXPORT in their definitions. + This is apparently wrong for the Windows case, so I have removed it. + (It makes no difference on Unix-like systems.) + +17. Added a new limit, MATCH_LIMIT_RECURSION, which limits the depth of nesting + of recursive calls to match(). This is different to MATCH_LIMIT because + that limits the total number of calls to match(), not all of which increase + the depth of recursion. Limiting the recursion depth limits the amount of + stack (or heap if NO_RECURSE is set) that is used. The default can be set + when PCRE is compiled, and changed at run time. A patch from Google adds + this functionality to the C++ interface. + +18. Changes to the handling of Unicode character properties: + + (a) Updated the table to Unicode 4.1.0. + + (b) Recognize characters that are not in the table as "Cn" (undefined). + + (c) I revised the way the table is implemented to a much improved format + which includes recognition of ranges. It now supports the ranges that + are defined in UnicodeData.txt, and it also amalgamates other + characters into ranges. This has reduced the number of entries in the + table from around 16,000 to around 3,000, thus reducing its size + considerably. I realized I did not need to use a tree structure after + all - a binary chop search is just as efficient. Having reduced the + number of entries, I extended their size from 6 bytes to 8 bytes to + allow for more data. + + (d) Added support for Unicode script names via properties such as \p{Han}. + +19. In UTF-8 mode, a backslash followed by a non-Ascii character was not + matching that character. + +20. When matching a repeated Unicode property with a minimum greater than zero, + (for example \pL{2,}), PCRE could look past the end of the subject if it + reached it while seeking the minimum number of characters. This could + happen only if some of the characters were more than one byte long, because + there is a check for at least the minimum number of bytes. + +21. Refactored the implementation of \p and \P so as to be more general, to + allow for more different types of property in future. This has changed the + compiled form incompatibly. Anybody with saved compiled patterns that use + \p or \P will have to recompile them. + +22. Added "Any" and "L&" to the supported property types. + +23. Recognize \x{...} as a code point specifier, even when not in UTF-8 mode, + but give a compile time error if the value is greater than 0xff. + +24. The man pages for pcrepartial, pcreprecompile, and pcre_compile2 were + accidentally not being installed or uninstalled. + +25. The pcre.h file was built from pcre.h.in, but the only changes that were + made were to insert the current release number. This seemed silly, because + it made things harder for people building PCRE on systems that don't run + "configure". I have turned pcre.h into a distributed file, no longer built + by "configure", with the version identification directly included. There is + no longer a pcre.h.in file. + + However, this change necessitated a change to the pcre-config script as + well. It is built from pcre-config.in, and one of the substitutions was the + release number. I have updated configure.ac so that ./configure now finds + the release number by grepping pcre.h. + +26. Added the ability to run the tests under valgrind. + + +Version 6.4 05-Sep-05 +--------------------- + + 1. Change 6.0/10/(l) to pcregrep introduced a bug that caused separator lines + "--" to be printed when multiple files were scanned, even when none of the + -A, -B, or -C options were used. This is not compatible with Gnu grep, so I + consider it to be a bug, and have restored the previous behaviour. + + 2. A couple of code tidies to get rid of compiler warnings. + + 3. The pcretest program used to cheat by referring to symbols in the library + whose names begin with _pcre_. These are internal symbols that are not + really supposed to be visible externally, and in some environments it is + possible to suppress them. The cheating is now confined to including + certain files from the library's source, which is a bit cleaner. + + 4. Renamed pcre.in as pcre.h.in to go with pcrecpp.h.in; it also makes the + file's purpose clearer. + + 5. Reorganized pcre_ucp_findchar(). + + +Version 6.3 15-Aug-05 +--------------------- + + 1. The file libpcre.pc.in did not have general read permission in the tarball. + + 2. There were some problems when building without C++ support: + + (a) If C++ support was not built, "make install" and "make test" still + tried to test it. + + (b) There were problems when the value of CXX was explicitly set. Some + changes have been made to try to fix these, and ... + + (c) --disable-cpp can now be used to explicitly disable C++ support. + + (d) The use of @CPP_OBJ@ directly caused a blank line preceded by a + backslash in a target when C++ was disabled. This confuses some + versions of "make", apparently. Using an intermediate variable solves + this. (Same for CPP_LOBJ.) + + 3. $(LINK_FOR_BUILD) now includes $(CFLAGS_FOR_BUILD) and $(LINK) + (non-Windows) now includes $(CFLAGS) because these flags are sometimes + necessary on certain architectures. + + 4. Added a setting of -export-symbols-regex to the link command to remove + those symbols that are exported in the C sense, but actually are local + within the library, and not documented. Their names all begin with + "_pcre_". This is not a perfect job, because (a) we have to except some + symbols that pcretest ("illegally") uses, and (b) the facility isn't always + available (and never for static libraries). I have made a note to try to + find a way round (a) in the future. + + +Version 6.2 01-Aug-05 +--------------------- + + 1. There was no test for integer overflow of quantifier values. A construction + such as {1111111111111111} would give undefined results. What is worse, if + a minimum quantifier for a parenthesized subpattern overflowed and became + negative, the calculation of the memory size went wrong. This could have + led to memory overwriting. + + 2. Building PCRE using VPATH was broken. Hopefully it is now fixed. + + 3. Added "b" to the 2nd argument of fopen() in dftables.c, for non-Unix-like + operating environments where this matters. + + 4. Applied Giuseppe Maxia's patch to add additional features for controlling + PCRE options from within the C++ wrapper. + + 5. Named capturing subpatterns were not being correctly counted when a pattern + was compiled. This caused two problems: (a) If there were more than 100 + such subpatterns, the calculation of the memory needed for the whole + compiled pattern went wrong, leading to an overflow error. (b) Numerical + back references of the form \12, where the number was greater than 9, were + not recognized as back references, even though there were sufficient + previous subpatterns. + + 6. Two minor patches to pcrecpp.cc in order to allow it to compile on older + versions of gcc, e.g. 2.95.4. + + +Version 6.1 21-Jun-05 +--------------------- + + 1. There was one reference to the variable "posix" in pcretest.c that was not + surrounded by "#if !defined NOPOSIX". + + 2. Make it possible to compile pcretest without DFA support, UTF8 support, or + the cross-check on the old pcre_info() function, for the benefit of the + cut-down version of PCRE that is currently imported into Exim. + + 3. A (silly) pattern starting with (?i)(?-i) caused an internal space + allocation error. I've done the easy fix, which wastes 2 bytes for sensible + patterns that start (?i) but I don't think that matters. The use of (?i) is + just an example; this all applies to the other options as well. + + 4. Since libtool seems to echo the compile commands it is issuing, the output + from "make" can be reduced a bit by putting "@" in front of each libtool + compile command. + + 5. Patch from the folks at Google for configure.in to be a bit more thorough + in checking for a suitable C++ installation before trying to compile the + C++ stuff. This should fix a reported problem when a compiler was present, + but no suitable headers. + + 6. The man pages all had just "PCRE" as their title. I have changed them to + be the relevant file name. I have also arranged that these names are + retained in the file doc/pcre.txt, which is a concatenation in text format + of all the man pages except the little individual ones for each function. + + 7. The NON-UNIX-USE file had not been updated for the different set of source + files that come with release 6. I also added a few comments about the C++ + wrapper. + + +Version 6.0 07-Jun-05 +--------------------- + + 1. Some minor internal re-organization to help with my DFA experiments. + + 2. Some missing #ifdef SUPPORT_UCP conditionals in pcretest and printint that + didn't matter for the library itself when fully configured, but did matter + when compiling without UCP support, or within Exim, where the ucp files are + not imported. + + 3. Refactoring of the library code to split up the various functions into + different source modules. The addition of the new DFA matching code (see + below) to a single monolithic source would have made it really too + unwieldy, quite apart from causing all the code to be include in a + statically linked application, when only some functions are used. This is + relevant even without the DFA addition now that patterns can be compiled in + one application and matched in another. + + The downside of splitting up is that there have to be some external + functions and data tables that are used internally in different modules of + the library but which are not part of the API. These have all had their + names changed to start with "_pcre_" so that they are unlikely to clash + with other external names. + + 4. Added an alternate matching function, pcre_dfa_exec(), which matches using + a different (DFA) algorithm. Although it is slower than the original + function, it does have some advantages for certain types of matching + problem. + + 5. Upgrades to pcretest in order to test the features of pcre_dfa_exec(), + including restarting after a partial match. + + 6. A patch for pcregrep that defines INVALID_FILE_ATTRIBUTES if it is not + defined when compiling for Windows was sent to me. I have put it into the + code, though I have no means of testing or verifying it. + + 7. Added the pcre_refcount() auxiliary function. + + 8. Added the PCRE_FIRSTLINE option. This constrains an unanchored pattern to + match before or at the first newline in the subject string. In pcretest, + the /f option on a pattern can be used to set this. + + 9. A repeated \w when used in UTF-8 mode with characters greater than 256 + would behave wrongly. This has been present in PCRE since release 4.0. + +10. A number of changes to the pcregrep command: + + (a) Refactored how -x works; insert ^(...)$ instead of setting + PCRE_ANCHORED and checking the length, in preparation for adding + something similar for -w. + + (b) Added the -w (match as a word) option. + + (c) Refactored the way lines are read and buffered so as to have more + than one at a time available. + + (d) Implemented a pcregrep test script. + + (e) Added the -M (multiline match) option. This allows patterns to match + over several lines of the subject. The buffering ensures that at least + 8K, or the rest of the document (whichever is the shorter) is available + for matching (and similarly the previous 8K for lookbehind assertions). + + (f) Changed the --help output so that it now says + + -w, --word-regex(p) + + instead of two lines, one with "regex" and the other with "regexp" + because that confused at least one person since the short forms are the + same. (This required a bit of code, as the output is generated + automatically from a table. It wasn't just a text change.) + + (g) -- can be used to terminate pcregrep options if the next thing isn't an + option but starts with a hyphen. Could be a pattern or a path name + starting with a hyphen, for instance. + + (h) "-" can be given as a file name to represent stdin. + + (i) When file names are being printed, "(standard input)" is used for + the standard input, for compatibility with GNU grep. Previously + "" was used. + + (j) The option --label=xxx can be used to supply a name to be used for + stdin when file names are being printed. There is no short form. + + (k) Re-factored the options decoding logic because we are going to add + two more options that take data. Such options can now be given in four + different ways, e.g. "-fname", "-f name", "--file=name", "--file name". + + (l) Added the -A, -B, and -C options for requesting that lines of context + around matches be printed. + + (m) Added the -L option to print the names of files that do not contain + any matching lines, that is, the complement of -l. + + (n) The return code is 2 if any file cannot be opened, but pcregrep does + continue to scan other files. + + (o) The -s option was incorrectly implemented. For compatibility with other + greps, it now suppresses the error message for a non-existent or non- + accessible file (but not the return code). There is a new option called + -q that suppresses the output of matching lines, which was what -s was + previously doing. + + (p) Added --include and --exclude options to specify files for inclusion + and exclusion when recursing. + +11. The Makefile was not using the Autoconf-supported LDFLAGS macro properly. + Hopefully, it now does. + +12. Missing cast in pcre_study(). + +13. Added an "uninstall" target to the makefile. + +14. Replaced "extern" in the function prototypes in Makefile.in with + "PCRE_DATA_SCOPE", which defaults to 'extern' or 'extern "C"' in the Unix + world, but is set differently for Windows. + +15. Added a second compiling function called pcre_compile2(). The only + difference is that it has an extra argument, which is a pointer to an + integer error code. When there is a compile-time failure, this is set + non-zero, in addition to the error test pointer being set to point to an + error message. The new argument may be NULL if no error number is required + (but then you may as well call pcre_compile(), which is now just a + wrapper). This facility is provided because some applications need a + numeric error indication, but it has also enabled me to tidy up the way + compile-time errors are handled in the POSIX wrapper. + +16. Added VPATH=.libs to the makefile; this should help when building with one + prefix path and installing with another. (Or so I'm told by someone who + knows more about this stuff than I do.) + +17. Added a new option, REG_DOTALL, to the POSIX function regcomp(). This + passes PCRE_DOTALL to the pcre_compile() function, making the "." character + match everything, including newlines. This is not POSIX-compatible, but + somebody wanted the feature. From pcretest it can be activated by using + both the P and the s flags. + +18. AC_PROG_LIBTOOL appeared twice in Makefile.in. Removed one. + +19. libpcre.pc was being incorrectly installed as executable. + +20. A couple of places in pcretest check for end-of-line by looking for '\n'; + it now also looks for '\r' so that it will work unmodified on Windows. + +21. Added Google's contributed C++ wrapper to the distribution. + +22. Added some untidy missing memory free() calls in pcretest, to keep + Electric Fence happy when testing. + + + +Version 5.0 13-Sep-04 +--------------------- + + 1. Internal change: literal characters are no longer packed up into items + containing multiple characters in a single byte-string. Each character + is now matched using a separate opcode. However, there may be more than one + byte in the character in UTF-8 mode. + + 2. The pcre_callout_block structure has two new fields: pattern_position and + next_item_length. These contain the offset in the pattern to the next match + item, and its length, respectively. + + 3. The PCRE_AUTO_CALLOUT option for pcre_compile() requests the automatic + insertion of callouts before each pattern item. Added the /C option to + pcretest to make use of this. + + 4. On the advice of a Windows user, the lines + + #if defined(_WIN32) || defined(WIN32) + _setmode( _fileno( stdout ), 0x8000 ); + #endif /* defined(_WIN32) || defined(WIN32) */ + + have been added to the source of pcretest. This apparently does useful + magic in relation to line terminators. + + 5. Changed "r" and "w" in the calls to fopen() in pcretest to "rb" and "wb" + for the benefit of those environments where the "b" makes a difference. + + 6. The icc compiler has the same options as gcc, but "configure" doesn't seem + to know about it. I have put a hack into configure.in that adds in code + to set GCC=yes if CC=icc. This seems to end up at a point in the + generated configure script that is early enough to affect the setting of + compiler options, which is what is needed, but I have no means of testing + whether it really works. (The user who reported this had patched the + generated configure script, which of course I cannot do.) + + LATER: After change 22 below (new libtool files), the configure script + seems to know about icc (and also ecc). Therefore, I have commented out + this hack in configure.in. + + 7. Added support for pkg-config (2 patches were sent in). + + 8. Negated POSIX character classes that used a combination of internal tables + were completely broken. These were [[:^alpha:]], [[:^alnum:]], and + [[:^ascii]]. Typically, they would match almost any characters. The other + POSIX classes were not broken in this way. + + 9. Matching the pattern "\b.*?" against "ab cd", starting at offset 1, failed + to find the match, as PCRE was deluded into thinking that the match had to + start at the start point or following a newline. The same bug applied to + patterns with negative forward assertions or any backward assertions + preceding ".*" at the start, unless the pattern required a fixed first + character. This was a failing pattern: "(?!.bcd).*". The bug is now fixed. + +10. In UTF-8 mode, when moving forwards in the subject after a failed match + starting at the last subject character, bytes beyond the end of the subject + string were read. + +11. Renamed the variable "class" as "classbits" to make life easier for C++ + users. (Previously there was a macro definition, but it apparently wasn't + enough.) + +12. Added the new field "tables" to the extra data so that tables can be passed + in at exec time, or the internal tables can be re-selected. This allows + a compiled regex to be saved and re-used at a later time by a different + program that might have everything at different addresses. + +13. Modified the pcre-config script so that, when run on Solaris, it shows a + -R library as well as a -L library. + +14. The debugging options of pcretest (-d on the command line or D on a + pattern) showed incorrect output for anything following an extended class + that contained multibyte characters and which was followed by a quantifier. + +15. Added optional support for general category Unicode character properties + via the \p, \P, and \X escapes. Unicode property support implies UTF-8 + support. It adds about 90K to the size of the library. The meanings of the + inbuilt class escapes such as \d and \s have NOT been changed. + +16. Updated pcredemo.c to include calls to free() to release the memory for the + compiled pattern. + +17. The generated file chartables.c was being created in the source directory + instead of in the building directory. This caused the build to fail if the + source directory was different from the building directory, and was + read-only. + +18. Added some sample Win commands from Mark Tetrode into the NON-UNIX-USE + file. No doubt somebody will tell me if they don't make sense... Also added + Dan Mooney's comments about building on OpenVMS. + +19. Added support for partial matching via the PCRE_PARTIAL option for + pcre_exec() and the \P data escape in pcretest. + +20. Extended pcretest with 3 new pattern features: + + (i) A pattern option of the form ">rest-of-line" causes pcretest to + write the compiled pattern to the file whose name is "rest-of-line". + This is a straight binary dump of the data, with the saved pointer to + the character tables forced to be NULL. The study data, if any, is + written too. After writing, pcretest reads a new pattern. + + (ii) If, instead of a pattern, ": new target + : new target + : use native compiler + : use native linker + : handle Windows platform correctly + : ditto + : ditto + copy DLL to top builddir before testing + + As part of these changes, -no-undefined was removed again. This was reported + to give trouble on HP-UX 11.0, so getting rid of it seems like a good idea + in any case. + +3. Some tidies to get rid of compiler warnings: + + . In the match_data structure, match_limit was an unsigned long int, whereas + match_call_count was an int. I've made them both unsigned long ints. + + . In pcretest the fact that a const uschar * doesn't automatically cast to + a void * provoked a warning. + + . Turning on some more compiler warnings threw up some "shadow" variables + and a few more missing casts. + +4. If PCRE was complied with UTF-8 support, but called without the PCRE_UTF8 + option, a class that contained a single character with a value between 128 + and 255 (e.g. /[\xFF]/) caused PCRE to crash. + +5. If PCRE was compiled with UTF-8 support, but called without the PCRE_UTF8 + option, a class that contained several characters, but with at least one + whose value was between 128 and 255 caused PCRE to crash. + + +Version 4.1 12-Mar-03 +--------------------- + +1. Compiling with gcc -pedantic found a couple of places where casts were +needed, and a string in dftables.c that was longer than standard compilers are +required to support. + +2. Compiling with Sun's compiler found a few more places where the code could +be tidied up in order to avoid warnings. + +3. The variables for cross-compiling were called HOST_CC and HOST_CFLAGS; the +first of these names is deprecated in the latest Autoconf in favour of the name +CC_FOR_BUILD, because "host" is typically used to mean the system on which the +compiled code will be run. I can't find a reference for HOST_CFLAGS, but by +analogy I have changed it to CFLAGS_FOR_BUILD. + +4. Added -no-undefined to the linking command in the Makefile, because this is +apparently helpful for Windows. To make it work, also added "-L. -lpcre" to the +linking step for the pcreposix library. + +5. PCRE was failing to diagnose the case of two named groups with the same +name. + +6. A problem with one of PCRE's optimizations was discovered. PCRE remembers a +literal character that is needed in the subject for a match, and scans along to +ensure that it is present before embarking on the full matching process. This +saves time in cases of nested unlimited repeats that are never going to match. +Problem: the scan can take a lot of time if the subject is very long (e.g. +megabytes), thus penalizing straightforward matches. It is now done only if the +amount of subject to be scanned is less than 1000 bytes. + +7. A lesser problem with the same optimization is that it was recording the +first character of an anchored pattern as "needed", thus provoking a search +right along the subject, even when the first match of the pattern was going to +fail. The "needed" character is now not set for anchored patterns, unless it +follows something in the pattern that is of non-fixed length. Thus, it still +fulfils its original purpose of finding quick non-matches in cases of nested +unlimited repeats, but isn't used for simple anchored patterns such as /^abc/. + + +Version 4.0 17-Feb-03 +--------------------- + +1. If a comment in an extended regex that started immediately after a meta-item +extended to the end of string, PCRE compiled incorrect data. This could lead to +all kinds of weird effects. Example: /#/ was bad; /()#/ was bad; /a#/ was not. + +2. Moved to autoconf 2.53 and libtool 1.4.2. + +3. Perl 5.8 no longer needs "use utf8" for doing UTF-8 things. Consequently, +the special perltest8 script is no longer needed - all the tests can be run +from a single perltest script. + +4. From 5.004, Perl has not included the VT character (0x0b) in the set defined +by \s. It has now been removed in PCRE. This means it isn't recognized as +whitespace in /x regexes too, which is the same as Perl. Note that the POSIX +class [:space:] *does* include VT, thereby creating a mess. + +5. Added the class [:blank:] (a GNU extension from Perl 5.8) to match only +space and tab. + +6. Perl 5.005 was a long time ago. It's time to amalgamate the tests that use +its new features into the main test script, reducing the number of scripts. + +7. Perl 5.8 has changed the meaning of patterns like /a(?i)b/. Earlier versions +were backward compatible, and made the (?i) apply to the whole pattern, as if +/i were given. Now it behaves more logically, and applies the option setting +only to what follows. PCRE has been changed to follow suit. However, if it +finds options settings right at the start of the pattern, it extracts them into +the global options, as before. Thus, they show up in the info data. + +8. Added support for the \Q...\E escape sequence. Characters in between are +treated as literals. This is slightly different from Perl in that $ and @ are +also handled as literals inside the quotes. In Perl, they will cause variable +interpolation. Note the following examples: + + Pattern PCRE matches Perl matches + + \Qabc$xyz\E abc$xyz abc followed by the contents of $xyz + \Qabc\$xyz\E abc\$xyz abc\$xyz + \Qabc\E\$\Qxyz\E abc$xyz abc$xyz + +For compatibility with Perl, \Q...\E sequences are recognized inside character +classes as well as outside them. + +9. Re-organized 3 code statements in pcretest to avoid "overflow in +floating-point constant arithmetic" warnings from a Microsoft compiler. Added a +(size_t) cast to one statement in pcretest and one in pcreposix to avoid +signed/unsigned warnings. + +10. SunOS4 doesn't have strtoul(). This was used only for unpicking the -o +option for pcretest, so I've replaced it by a simple function that does just +that job. + +11. pcregrep was ending with code 0 instead of 2 for the commands "pcregrep" or +"pcregrep -". + +12. Added "possessive quantifiers" ?+, *+, ++, and {,}+ which come from Sun's +Java package. This provides some syntactic sugar for simple cases of what my +documentation calls "once-only subpatterns". A pattern such as x*+ is the same +as (?>x*). In other words, if what is inside (?>...) is just a single repeated +item, you can use this simplified notation. Note that only makes sense with +greedy quantifiers. Consequently, the use of the possessive quantifier forces +greediness, whatever the setting of the PCRE_UNGREEDY option. + +13. A change of greediness default within a pattern was not taking effect at +the current level for patterns like /(b+(?U)a+)/. It did apply to parenthesized +subpatterns that followed. Patterns like /b+(?U)a+/ worked because the option +was abstracted outside. + +14. PCRE now supports the \G assertion. It is true when the current matching +position is at the start point of the match. This differs from \A when the +starting offset is non-zero. Used with the /g option of pcretest (or similar +code), it works in the same way as it does for Perl's /g option. If all +alternatives of a regex begin with \G, the expression is anchored to the start +match position, and the "anchored" flag is set in the compiled expression. + +15. Some bugs concerning the handling of certain option changes within patterns +have been fixed. These applied to options other than (?ims). For example, +"a(?x: b c )d" did not match "XabcdY" but did match "Xa b c dY". It should have +been the other way round. Some of this was related to change 7 above. + +16. PCRE now gives errors for /[.x.]/ and /[=x=]/ as unsupported POSIX +features, as Perl does. Previously, PCRE gave the warnings only for /[[.x.]]/ +and /[[=x=]]/. PCRE now also gives an error for /[:name:]/ because it supports +POSIX classes only within a class (e.g. /[[:alpha:]]/). + +17. Added support for Perl's \C escape. This matches one byte, even in UTF8 +mode. Unlike ".", it always matches newline, whatever the setting of +PCRE_DOTALL. However, PCRE does not permit \C to appear in lookbehind +assertions. Perl allows it, but it doesn't (in general) work because it can't +calculate the length of the lookbehind. At least, that's the case for Perl +5.8.0 - I've been told they are going to document that it doesn't work in +future. + +18. Added an error diagnosis for escapes that PCRE does not support: these are +\L, \l, \N, \P, \p, \U, \u, and \X. + +19. Although correctly diagnosing a missing ']' in a character class, PCRE was +reading past the end of the pattern in cases such as /[abcd/. + +20. PCRE was getting more memory than necessary for patterns with classes that +contained both POSIX named classes and other characters, e.g. /[[:space:]abc/. + +21. Added some code, conditional on #ifdef VPCOMPAT, to make life easier for +compiling PCRE for use with Virtual Pascal. + +22. Small fix to the Makefile to make it work properly if the build is done +outside the source tree. + +23. Added a new extension: a condition to go with recursion. If a conditional +subpattern starts with (?(R) the "true" branch is used if recursion has +happened, whereas the "false" branch is used only at the top level. + +24. When there was a very long string of literal characters (over 255 bytes +without UTF support, over 250 bytes with UTF support), the computation of how +much memory was required could be incorrect, leading to segfaults or other +strange effects. + +25. PCRE was incorrectly assuming anchoring (either to start of subject or to +start of line for a non-DOTALL pattern) when a pattern started with (.*) and +there was a subsequent back reference to those brackets. This meant that, for +example, /(.*)\d+\1/ failed to match "abc123bc". Unfortunately, it isn't +possible to check for precisely this case. All we can do is abandon the +optimization if .* occurs inside capturing brackets when there are any back +references whatsoever. (See below for a better fix that came later.) + +26. The handling of the optimization for finding the first character of a +non-anchored pattern, and for finding a character that is required later in the +match were failing in some cases. This didn't break the matching; it just +failed to optimize when it could. The way this is done has been re-implemented. + +27. Fixed typo in error message for invalid (?R item (it said "(?p"). + +28. Added a new feature that provides some of the functionality that Perl +provides with (?{...}). The facility is termed a "callout". The way it is done +in PCRE is for the caller to provide an optional function, by setting +pcre_callout to its entry point. Like pcre_malloc and pcre_free, this is a +global variable. By default it is unset, which disables all calling out. To get +the function called, the regex must include (?C) at appropriate points. This +is, in fact, equivalent to (?C0), and any number <= 255 may be given with (?C). +This provides a means of identifying different callout points. When PCRE +reaches such a point in the regex, if pcre_callout has been set, the external +function is called. It is provided with data in a structure called +pcre_callout_block, which is defined in pcre.h. If the function returns 0, +matching continues; if it returns a non-zero value, the match at the current +point fails. However, backtracking will occur if possible. [This was changed +later and other features added - see item 49 below.] + +29. pcretest is upgraded to test the callout functionality. It provides a +callout function that displays information. By default, it shows the start of +the match and the current position in the text. There are some new data escapes +to vary what happens: + + \C+ in addition, show current contents of captured substrings + \C- do not supply a callout function + \C!n return 1 when callout number n is reached + \C!n!m return 1 when callout number n is reached for the mth time + +30. If pcregrep was called with the -l option and just a single file name, it +output "" if a match was found, instead of the file name. + +31. Improve the efficiency of the POSIX API to PCRE. If the number of capturing +slots is less than POSIX_MALLOC_THRESHOLD, use a block on the stack to pass to +pcre_exec(). This saves a malloc/free per call. The default value of +POSIX_MALLOC_THRESHOLD is 10; it can be changed by --with-posix-malloc-threshold +when configuring. + +32. The default maximum size of a compiled pattern is 64K. There have been a +few cases of people hitting this limit. The code now uses macros to handle the +storing of links as offsets within the compiled pattern. It defaults to 2-byte +links, but this can be changed to 3 or 4 bytes by --with-link-size when +configuring. Tests 2 and 5 work only with 2-byte links because they output +debugging information about compiled patterns. + +33. Internal code re-arrangements: + +(a) Moved the debugging function for printing out a compiled regex into + its own source file (printint.c) and used #include to pull it into + pcretest.c and, when DEBUG is defined, into pcre.c, instead of having two + separate copies. + +(b) Defined the list of op-code names for debugging as a macro in + internal.h so that it is next to the definition of the opcodes. + +(c) Defined a table of op-code lengths for simpler skipping along compiled + code. This is again a macro in internal.h so that it is next to the + definition of the opcodes. + +34. Added support for recursive calls to individual subpatterns, along the +lines of Robin Houston's patch (but implemented somewhat differently). + +35. Further mods to the Makefile to help Win32. Also, added code to pcregrep to +allow it to read and process whole directories in Win32. This code was +contributed by Lionel Fourquaux; it has not been tested by me. + +36. Added support for named subpatterns. The Python syntax (?P...) is +used to name a group. Names consist of alphanumerics and underscores, and must +be unique. Back references use the syntax (?P=name) and recursive calls use +(?P>name) which is a PCRE extension to the Python extension. Groups still have +numbers. The function pcre_fullinfo() can be used after compilation to extract +a name/number map. There are three relevant calls: + + PCRE_INFO_NAMEENTRYSIZE yields the size of each entry in the map + PCRE_INFO_NAMECOUNT yields the number of entries + PCRE_INFO_NAMETABLE yields a pointer to the map. + +The map is a vector of fixed-size entries. The size of each entry depends on +the length of the longest name used. The first two bytes of each entry are the +group number, most significant byte first. There follows the corresponding +name, zero terminated. The names are in alphabetical order. + +37. Make the maximum literal string in the compiled code 250 for the non-UTF-8 +case instead of 255. Making it the same both with and without UTF-8 support +means that the same test output works with both. + +38. There was a case of malloc(0) in the POSIX testing code in pcretest. Avoid +calling malloc() with a zero argument. + +39. Change 25 above had to resort to a heavy-handed test for the .* anchoring +optimization. I've improved things by keeping a bitmap of backreferences with +numbers 1-31 so that if .* occurs inside capturing brackets that are not in +fact referenced, the optimization can be applied. It is unlikely that a +relevant occurrence of .* (i.e. one which might indicate anchoring or forcing +the match to follow \n) will appear inside brackets with a number greater than +31, but if it does, any back reference > 31 suppresses the optimization. + +40. Added a new compile-time option PCRE_NO_AUTO_CAPTURE. This has the effect +of disabling numbered capturing parentheses. Any opening parenthesis that is +not followed by ? behaves as if it were followed by ?: but named parentheses +can still be used for capturing (and they will acquire numbers in the usual +way). + +41. Redesigned the return codes from the match() function into yes/no/error so +that errors can be passed back from deep inside the nested calls. A malloc +failure while inside a recursive subpattern call now causes the +PCRE_ERROR_NOMEMORY return instead of quietly going wrong. + +42. It is now possible to set a limit on the number of times the match() +function is called in a call to pcre_exec(). This facility makes it possible to +limit the amount of recursion and backtracking, though not in a directly +obvious way, because the match() function is used in a number of different +circumstances. The count starts from zero for each position in the subject +string (for non-anchored patterns). The default limit is, for compatibility, a +large number, namely 10 000 000. You can change this in two ways: + +(a) When configuring PCRE before making, you can use --with-match-limit=n + to set a default value for the compiled library. + +(b) For each call to pcre_exec(), you can pass a pcre_extra block in which + a different value is set. See 45 below. + +If the limit is exceeded, pcre_exec() returns PCRE_ERROR_MATCHLIMIT. + +43. Added a new function pcre_config(int, void *) to enable run-time extraction +of things that can be changed at compile time. The first argument specifies +what is wanted and the second points to where the information is to be placed. +The current list of available information is: + + PCRE_CONFIG_UTF8 + +The output is an integer that is set to one if UTF-8 support is available; +otherwise it is set to zero. + + PCRE_CONFIG_NEWLINE + +The output is an integer that it set to the value of the code that is used for +newline. It is either LF (10) or CR (13). + + PCRE_CONFIG_LINK_SIZE + +The output is an integer that contains the number of bytes used for internal +linkage in compiled expressions. The value is 2, 3, or 4. See item 32 above. + + PCRE_CONFIG_POSIX_MALLOC_THRESHOLD + +The output is an integer that contains the threshold above which the POSIX +interface uses malloc() for output vectors. See item 31 above. + + PCRE_CONFIG_MATCH_LIMIT + +The output is an unsigned integer that contains the default limit of the number +of match() calls in a pcre_exec() execution. See 42 above. + +44. pcretest has been upgraded by the addition of the -C option. This causes it +to extract all the available output from the new pcre_config() function, and to +output it. The program then exits immediately. + +45. A need has arisen to pass over additional data with calls to pcre_exec() in +order to support additional features. One way would have been to define +pcre_exec2() (for example) with extra arguments, but this would not have been +extensible, and would also have required all calls to the original function to +be mapped to the new one. Instead, I have chosen to extend the mechanism that +is used for passing in "extra" data from pcre_study(). + +The pcre_extra structure is now exposed and defined in pcre.h. It currently +contains the following fields: + + flags a bitmap indicating which of the following fields are set + study_data opaque data from pcre_study() + match_limit a way of specifying a limit on match() calls for a specific + call to pcre_exec() + callout_data data for callouts (see 49 below) + +The flag bits are also defined in pcre.h, and are + + PCRE_EXTRA_STUDY_DATA + PCRE_EXTRA_MATCH_LIMIT + PCRE_EXTRA_CALLOUT_DATA + +The pcre_study() function now returns one of these new pcre_extra blocks, with +the actual study data pointed to by the study_data field, and the +PCRE_EXTRA_STUDY_DATA flag set. This can be passed directly to pcre_exec() as +before. That is, this change is entirely upwards-compatible and requires no +change to existing code. + +If you want to pass in additional data to pcre_exec(), you can either place it +in a pcre_extra block provided by pcre_study(), or create your own pcre_extra +block. + +46. pcretest has been extended to test the PCRE_EXTRA_MATCH_LIMIT feature. If a +data string contains the escape sequence \M, pcretest calls pcre_exec() several +times with different match limits, until it finds the minimum value needed for +pcre_exec() to complete. The value is then output. This can be instructive; for +most simple matches the number is quite small, but for pathological cases it +gets very large very quickly. + +47. There's a new option for pcre_fullinfo() called PCRE_INFO_STUDYSIZE. It +returns the size of the data block pointed to by the study_data field in a +pcre_extra block, that is, the value that was passed as the argument to +pcre_malloc() when PCRE was getting memory in which to place the information +created by pcre_study(). The fourth argument should point to a size_t variable. +pcretest has been extended so that this information is shown after a successful +pcre_study() call when information about the compiled regex is being displayed. + +48. Cosmetic change to Makefile: there's no need to have / after $(DESTDIR) +because what follows is always an absolute path. (Later: it turns out that this +is more than cosmetic for MinGW, because it doesn't like empty path +components.) + +49. Some changes have been made to the callout feature (see 28 above): + +(i) A callout function now has three choices for what it returns: + + 0 => success, carry on matching + > 0 => failure at this point, but backtrack if possible + < 0 => serious error, return this value from pcre_exec() + + Negative values should normally be chosen from the set of PCRE_ERROR_xxx + values. In particular, returning PCRE_ERROR_NOMATCH forces a standard + "match failed" error. The error number PCRE_ERROR_CALLOUT is reserved for + use by callout functions. It will never be used by PCRE itself. + +(ii) The pcre_extra structure (see 45 above) has a void * field called + callout_data, with corresponding flag bit PCRE_EXTRA_CALLOUT_DATA. The + pcre_callout_block structure has a field of the same name. The contents of + the field passed in the pcre_extra structure are passed to the callout + function in the corresponding field in the callout block. This makes it + easier to use the same callout-containing regex from multiple threads. For + testing, the pcretest program has a new data escape + + \C*n pass the number n (may be negative) as callout_data + + If the callout function in pcretest receives a non-zero value as + callout_data, it returns that value. + +50. Makefile wasn't handling CFLAGS properly when compiling dftables. Also, +there were some redundant $(CFLAGS) in commands that are now specified as +$(LINK), which already includes $(CFLAGS). + +51. Extensions to UTF-8 support are listed below. These all apply when (a) PCRE +has been compiled with UTF-8 support *and* pcre_compile() has been compiled +with the PCRE_UTF8 flag. Patterns that are compiled without that flag assume +one-byte characters throughout. Note that case-insensitive matching applies +only to characters whose values are less than 256. PCRE doesn't support the +notion of cases for higher-valued characters. + +(i) A character class whose characters are all within 0-255 is handled as + a bit map, and the map is inverted for negative classes. Previously, a + character > 255 always failed to match such a class; however it should + match if the class was a negative one (e.g. [^ab]). This has been fixed. + +(ii) A negated character class with a single character < 255 is coded as + "not this character" (OP_NOT). This wasn't working properly when the test + character was multibyte, either singly or repeated. + +(iii) Repeats of multibyte characters are now handled correctly in UTF-8 + mode, for example: \x{100}{2,3}. + +(iv) The character escapes \b, \B, \d, \D, \s, \S, \w, and \W (either + singly or repeated) now correctly test multibyte characters. However, + PCRE doesn't recognize any characters with values greater than 255 as + digits, spaces, or word characters. Such characters always match \D, \S, + and \W, and never match \d, \s, or \w. + +(v) Classes may now contain characters and character ranges with values + greater than 255. For example: [ab\x{100}-\x{400}]. + +(vi) pcregrep now has a --utf-8 option (synonym -u) which makes it call + PCRE in UTF-8 mode. + +52. The info request value PCRE_INFO_FIRSTCHAR has been renamed +PCRE_INFO_FIRSTBYTE because it is a byte value. However, the old name is +retained for backwards compatibility. (Note that LASTLITERAL is also a byte +value.) + +53. The single man page has become too large. I have therefore split it up into +a number of separate man pages. These also give rise to individual HTML pages; +these are now put in a separate directory, and there is an index.html page that +lists them all. Some hyperlinking between the pages has been installed. + +54. Added convenience functions for handling named capturing parentheses. + +55. Unknown escapes inside character classes (e.g. [\M]) and escapes that +aren't interpreted therein (e.g. [\C]) are literals in Perl. This is now also +true in PCRE, except when the PCRE_EXTENDED option is set, in which case they +are faulted. + +56. Introduced HOST_CC and HOST_CFLAGS which can be set in the environment when +calling configure. These values are used when compiling the dftables.c program +which is run to generate the source of the default character tables. They +default to the values of CC and CFLAGS. If you are cross-compiling PCRE, +you will need to set these values. + +57. Updated the building process for Windows DLL, as provided by Fred Cox. + + +Version 3.9 02-Jan-02 +--------------------- + +1. A bit of extraneous text had somehow crept into the pcregrep documentation. + +2. If --disable-static was given, the building process failed when trying to +build pcretest and pcregrep. (For some reason it was using libtool to compile +them, which is not right, as they aren't part of the library.) + + +Version 3.8 18-Dec-01 +--------------------- + +1. The experimental UTF-8 code was completely screwed up. It was packing the +bytes in the wrong order. How dumb can you get? + + +Version 3.7 29-Oct-01 +--------------------- + +1. In updating pcretest to check change 1 of version 3.6, I screwed up. +This caused pcretest, when used on the test data, to segfault. Unfortunately, +this didn't happen under Solaris 8, where I normally test things. + +2. The Makefile had to be changed to make it work on BSD systems, where 'make' +doesn't seem to recognize that ./xxx and xxx are the same file. (This entry +isn't in ChangeLog distributed with 3.7 because I forgot when I hastily made +this fix an hour or so after the initial 3.7 release.) + + +Version 3.6 23-Oct-01 +--------------------- + +1. Crashed with /(sens|respons)e and \1ibility/ and "sense and sensibility" if +offsets passed as NULL with zero offset count. + +2. The config.guess and config.sub files had not been updated when I moved to +the latest autoconf. + + +Version 3.5 15-Aug-01 +--------------------- + +1. Added some missing #if !defined NOPOSIX conditionals in pcretest.c that +had been forgotten. + +2. By using declared but undefined structures, we can avoid using "void" +definitions in pcre.h while keeping the internal definitions of the structures +private. + +3. The distribution is now built using autoconf 2.50 and libtool 1.4. From a +user point of view, this means that both static and shared libraries are built +by default, but this can be individually controlled. More of the work of +handling this static/shared cases is now inside libtool instead of PCRE's make +file. + +4. The pcretest utility is now installed along with pcregrep because it is +useful for users (to test regexs) and by doing this, it automatically gets +relinked by libtool. The documentation has been turned into a man page, so +there are now .1, .txt, and .html versions in /doc. + +5. Upgrades to pcregrep: + (i) Added long-form option names like gnu grep. + (ii) Added --help to list all options with an explanatory phrase. + (iii) Added -r, --recursive to recurse into sub-directories. + (iv) Added -f, --file to read patterns from a file. + +6. pcre_exec() was referring to its "code" argument before testing that +argument for NULL (and giving an error if it was NULL). + +7. Upgraded Makefile.in to allow for compiling in a different directory from +the source directory. + +8. Tiny buglet in pcretest: when pcre_fullinfo() was called to retrieve the +options bits, the pointer it was passed was to an int instead of to an unsigned +long int. This mattered only on 64-bit systems. + +9. Fixed typo (3.4/1) in pcre.h again. Sigh. I had changed pcre.h (which is +generated) instead of pcre.in, which it its source. Also made the same change +in several of the .c files. + +10. A new release of gcc defines printf() as a macro, which broke pcretest +because it had an ifdef in the middle of a string argument for printf(). Fixed +by using separate calls to printf(). + +11. Added --enable-newline-is-cr and --enable-newline-is-lf to the configure +script, to force use of CR or LF instead of \n in the source. On non-Unix +systems, the value can be set in config.h. + +12. The limit of 200 on non-capturing parentheses is a _nesting_ limit, not an +absolute limit. Changed the text of the error message to make this clear, and +likewise updated the man page. + +13. The limit of 99 on the number of capturing subpatterns has been removed. +The new limit is 65535, which I hope will not be a "real" limit. + + +Version 3.4 22-Aug-00 +--------------------- + +1. Fixed typo in pcre.h: unsigned const char * changed to const unsigned char *. + +2. Diagnose condition (?(0) as an error instead of crashing on matching. + + +Version 3.3 01-Aug-00 +--------------------- + +1. If an octal character was given, but the value was greater than \377, it +was not getting masked to the least significant bits, as documented. This could +lead to crashes in some systems. + +2. Perl 5.6 (if not earlier versions) accepts classes like [a-\d] and treats +the hyphen as a literal. PCRE used to give an error; it now behaves like Perl. + +3. Added the functions pcre_free_substring() and pcre_free_substring_list(). +These just pass their arguments on to (pcre_free)(), but they are provided +because some uses of PCRE bind it to non-C systems that can call its functions, +but cannot call free() or pcre_free() directly. + +4. Add "make test" as a synonym for "make check". Corrected some comments in +the Makefile. + +5. Add $(DESTDIR)/ in front of all the paths in the "install" target in the +Makefile. + +6. Changed the name of pgrep to pcregrep, because Solaris has introduced a +command called pgrep for grepping around the active processes. + +7. Added the beginnings of support for UTF-8 character strings. + +8. Arranged for the Makefile to pass over the settings of CC, CFLAGS, and +RANLIB to ./ltconfig so that they are used by libtool. I think these are all +the relevant ones. (AR is not passed because ./ltconfig does its own figuring +out for the ar command.) + + +Version 3.2 12-May-00 +--------------------- + +This is purely a bug fixing release. + +1. If the pattern /((Z)+|A)*/ was matched agained ZABCDEFG it matched Z instead +of ZA. This was just one example of several cases that could provoke this bug, +which was introduced by change 9 of version 2.00. The code for breaking +infinite loops after an iteration that matches an empty string was't working +correctly. + +2. The pcretest program was not imitating Perl correctly for the pattern /a*/g +when matched against abbab (for example). After matching an empty string, it +wasn't forcing anchoring when setting PCRE_NOTEMPTY for the next attempt; this +caused it to match further down the string than it should. + +3. The code contained an inclusion of sys/types.h. It isn't clear why this +was there because it doesn't seem to be needed, and it causes trouble on some +systems, as it is not a Standard C header. It has been removed. + +4. Made 4 silly changes to the source to avoid stupid compiler warnings that +were reported on the Macintosh. The changes were from + + while ((c = *(++ptr)) != 0 && c != '\n'); +to + while ((c = *(++ptr)) != 0 && c != '\n') ; + +Totally extraordinary, but if that's what it takes... + +5. PCRE is being used in one environment where neither memmove() nor bcopy() is +available. Added HAVE_BCOPY and an autoconf test for it; if neither +HAVE_MEMMOVE nor HAVE_BCOPY is set, use a built-in emulation function which +assumes the way PCRE uses memmove() (always moving upwards). + +6. PCRE is being used in one environment where strchr() is not available. There +was only one use in pcre.c, and writing it out to avoid strchr() probably gives +faster code anyway. + + +Version 3.1 09-Feb-00 +--------------------- + +The only change in this release is the fixing of some bugs in Makefile.in for +the "install" target: + +(1) It was failing to install pcreposix.h. + +(2) It was overwriting the pcre.3 man page with the pcreposix.3 man page. + + +Version 3.0 01-Feb-00 +--------------------- + +1. Add support for the /+ modifier to perltest (to output $` like it does in +pcretest). + +2. Add support for the /g modifier to perltest. + +3. Fix pcretest so that it behaves even more like Perl for /g when the pattern +matches null strings. + +4. Fix perltest so that it doesn't do unwanted things when fed an empty +pattern. Perl treats empty patterns specially - it reuses the most recent +pattern, which is not what we want. Replace // by /(?#)/ in order to avoid this +effect. + +5. The POSIX interface was broken in that it was just handing over the POSIX +captured string vector to pcre_exec(), but (since release 2.00) PCRE has +required a bigger vector, with some working space on the end. This means that +the POSIX wrapper now has to get and free some memory, and copy the results. + +6. Added some simple autoconf support, placing the test data and the +documentation in separate directories, re-organizing some of the +information files, and making it build pcre-config (a GNU standard). Also added +libtool support for building PCRE as a shared library, which is now the +default. + +7. Got rid of the leading zero in the definition of PCRE_MINOR because 08 and +09 are not valid octal constants. Single digits will be used for minor values +less than 10. + +8. Defined REG_EXTENDED and REG_NOSUB as zero in the POSIX header, so that +existing programs that set these in the POSIX interface can use PCRE without +modification. + +9. Added a new function, pcre_fullinfo() with an extensible interface. It can +return all that pcre_info() returns, plus additional data. The pcre_info() +function is retained for compatibility, but is considered to be obsolete. + +10. Added experimental recursion feature (?R) to handle one common case that +Perl 5.6 will be able to do with (?p{...}). + +11. Added support for POSIX character classes like [:alpha:], which Perl is +adopting. + + +Version 2.08 31-Aug-99 +---------------------- + +1. When startoffset was not zero and the pattern began with ".*", PCRE was not +trying to match at the startoffset position, but instead was moving forward to +the next newline as if a previous match had failed. + +2. pcretest was not making use of PCRE_NOTEMPTY when repeating for /g and /G, +and could get into a loop if a null string was matched other than at the start +of the subject. + +3. Added definitions of PCRE_MAJOR and PCRE_MINOR to pcre.h so the version can +be distinguished at compile time, and for completeness also added PCRE_DATE. + +5. Added Paul Sokolovsky's minor changes to make it easy to compile a Win32 DLL +in GnuWin32 environments. + + +Version 2.07 29-Jul-99 +---------------------- + +1. The documentation is now supplied in plain text form and HTML as well as in +the form of man page sources. + +2. C++ compilers don't like assigning (void *) values to other pointer types. +In particular this affects malloc(). Although there is no problem in Standard +C, I've put in casts to keep C++ compilers happy. + +3. Typo on pcretest.c; a cast of (unsigned char *) in the POSIX regexec() call +should be (const char *). + +4. If NOPOSIX is defined, pcretest.c compiles without POSIX support. This may +be useful for non-Unix systems who don't want to bother with the POSIX stuff. +However, I haven't made this a standard facility. The documentation doesn't +mention it, and the Makefile doesn't support it. + +5. The Makefile now contains an "install" target, with editable destinations at +the top of the file. The pcretest program is not installed. + +6. pgrep -V now gives the PCRE version number and date. + +7. Fixed bug: a zero repetition after a literal string (e.g. /abcde{0}/) was +causing the entire string to be ignored, instead of just the last character. + +8. If a pattern like /"([^\\"]+|\\.)*"/ is applied in the normal way to a +non-matching string, it can take a very, very long time, even for strings of +quite modest length, because of the nested recursion. PCRE now does better in +some of these cases. It does this by remembering the last required literal +character in the pattern, and pre-searching the subject to ensure it is present +before running the real match. In other words, it applies a heuristic to detect +some types of certain failure quickly, and in the above example, if presented +with a string that has no trailing " it gives "no match" very quickly. + +9. A new runtime option PCRE_NOTEMPTY causes null string matches to be ignored; +other alternatives are tried instead. + + +Version 2.06 09-Jun-99 +---------------------- + +1. Change pcretest's output for amount of store used to show just the code +space, because the remainder (the data block) varies in size between 32-bit and +64-bit systems. + +2. Added an extra argument to pcre_exec() to supply an offset in the subject to +start matching at. This allows lookbehinds to work when searching for multiple +occurrences in a string. + +3. Added additional options to pcretest for testing multiple occurrences: + + /+ outputs the rest of the string that follows a match + /g loops for multiple occurrences, using the new startoffset argument + /G loops for multiple occurrences by passing an incremented pointer + +4. PCRE wasn't doing the "first character" optimization for patterns starting +with \b or \B, though it was doing it for other lookbehind assertions. That is, +it wasn't noticing that a match for a pattern such as /\bxyz/ has to start with +the letter 'x'. On long subject strings, this gives a significant speed-up. + + +Version 2.05 21-Apr-99 +---------------------- + +1. Changed the type of magic_number from int to long int so that it works +properly on 16-bit systems. + +2. Fixed a bug which caused patterns starting with .* not to work correctly +when the subject string contained newline characters. PCRE was assuming +anchoring for such patterns in all cases, which is not correct because .* will +not pass a newline unless PCRE_DOTALL is set. It now assumes anchoring only if +DOTALL is set at top level; otherwise it knows that patterns starting with .* +must be retried after every newline in the subject. + + +Version 2.04 18-Feb-99 +---------------------- + +1. For parenthesized subpatterns with repeats whose minimum was zero, the +computation of the store needed to hold the pattern was incorrect (too large). +If such patterns were nested a few deep, this could multiply and become a real +problem. + +2. Added /M option to pcretest to show the memory requirement of a specific +pattern. Made -m a synonym of -s (which does this globally) for compatibility. + +3. Subpatterns of the form (regex){n,m} (i.e. limited maximum) were being +compiled in such a way that the backtracking after subsequent failure was +pessimal. Something like (a){0,3} was compiled as (a)?(a)?(a)? instead of +((a)((a)(a)?)?)? with disastrous performance if the maximum was of any size. + + +Version 2.03 02-Feb-99 +---------------------- + +1. Fixed typo and small mistake in man page. + +2. Added 4th condition (GPL supersedes if conflict) and created separate +LICENCE file containing the conditions. + +3. Updated pcretest so that patterns such as /abc\/def/ work like they do in +Perl, that is the internal \ allows the delimiter to be included in the +pattern. Locked out the use of \ as a delimiter. If \ immediately follows +the final delimiter, add \ to the end of the pattern (to test the error). + +4. Added the convenience functions for extracting substrings after a successful +match. Updated pcretest to make it able to test these functions. + + +Version 2.02 14-Jan-99 +---------------------- + +1. Initialized the working variables associated with each extraction so that +their saving and restoring doesn't refer to uninitialized store. + +2. Put dummy code into study.c in order to trick the optimizer of the IBM C +compiler for OS/2 into generating correct code. Apparently IBM isn't going to +fix the problem. + +3. Pcretest: the timing code wasn't using LOOPREPEAT for timing execution +calls, and wasn't printing the correct value for compiling calls. Increased the +default value of LOOPREPEAT, and the number of significant figures in the +times. + +4. Changed "/bin/rm" in the Makefile to "-rm" so it works on Windows NT. + +5. Renamed "deftables" as "dftables" to get it down to 8 characters, to avoid +a building problem on Windows NT with a FAT file system. + + +Version 2.01 21-Oct-98 +---------------------- + +1. Changed the API for pcre_compile() to allow for the provision of a pointer +to character tables built by pcre_maketables() in the current locale. If NULL +is passed, the default tables are used. + + +Version 2.00 24-Sep-98 +---------------------- + +1. Since the (>?) facility is in Perl 5.005, don't require PCRE_EXTRA to enable +it any more. + +2. Allow quantification of (?>) groups, and make it work correctly. + +3. The first character computation wasn't working for (?>) groups. + +4. Correct the implementation of \Z (it is permitted to match on the \n at the +end of the subject) and add 5.005's \z, which really does match only at the +very end of the subject. + +5. Remove the \X "cut" facility; Perl doesn't have it, and (?> is neater. + +6. Remove the ability to specify CASELESS, MULTILINE, DOTALL, and +DOLLAR_END_ONLY at runtime, to make it possible to implement the Perl 5.005 +localized options. All options to pcre_study() were also removed. + +7. Add other new features from 5.005: + + $(?<= positive lookbehind + $(?a*))*/ (a PCRE_EXTRA facility). + + +Version 1.00 18-Nov-97 +---------------------- + +1. Added compile-time macros to support systems such as SunOS4 which don't have +memmove() or strerror() but have other things that can be used instead. + +2. Arranged that "make clean" removes the executables. + + +Version 0.99 27-Oct-97 +---------------------- + +1. Fixed bug in code for optimizing classes with only one character. It was +initializing a 32-byte map regardless, which could cause it to run off the end +of the memory it had got. + +2. Added, conditional on PCRE_EXTRA, the proposed (?>REGEX) construction. + + +Version 0.98 22-Oct-97 +---------------------- + +1. Fixed bug in code for handling temporary memory usage when there are more +back references than supplied space in the ovector. This could cause segfaults. + + +Version 0.97 21-Oct-97 +---------------------- + +1. Added the \X "cut" facility, conditional on PCRE_EXTRA. + +2. Optimized negated single characters not to use a bit map. + +3. Brought error texts together as macro definitions; clarified some of them; +fixed one that was wrong - it said "range out of order" when it meant "invalid +escape sequence". + +4. Changed some char * arguments to const char *. + +5. Added PCRE_NOTBOL and PCRE_NOTEOL (from POSIX). + +6. Added the POSIX-style API wrapper in pcreposix.a and testing facilities in +pcretest. + + +Version 0.96 16-Oct-97 +---------------------- + +1. Added a simple "pgrep" utility to the distribution. + +2. Fixed an incompatibility with Perl: "{" is now treated as a normal character +unless it appears in one of the precise forms "{ddd}", "{ddd,}", or "{ddd,ddd}" +where "ddd" means "one or more decimal digits". + +3. Fixed serious bug. If a pattern had a back reference, but the call to +pcre_exec() didn't supply a large enough ovector to record the related +identifying subpattern, the match always failed. PCRE now remembers the number +of the largest back reference, and gets some temporary memory in which to save +the offsets during matching if necessary, in order to ensure that +backreferences always work. + +4. Increased the compatibility with Perl in a number of ways: + + (a) . no longer matches \n by default; an option PCRE_DOTALL is provided + to request this handling. The option can be set at compile or exec time. + + (b) $ matches before a terminating newline by default; an option + PCRE_DOLLAR_ENDONLY is provided to override this (but not in multiline + mode). The option can be set at compile or exec time. + + (c) The handling of \ followed by a digit other than 0 is now supposed to be + the same as Perl's. If the decimal number it represents is less than 10 + or there aren't that many previous left capturing parentheses, an octal + escape is read. Inside a character class, it's always an octal escape, + even if it is a single digit. + + (d) An escaped but undefined alphabetic character is taken as a literal, + unless PCRE_EXTRA is set. Currently this just reserves the remaining + escapes. + + (e) {0} is now permitted. (The previous item is removed from the compiled + pattern). + +5. Changed all the names of code files so that the basic parts are no longer +than 10 characters, and abolished the teeny "globals.c" file. + +6. Changed the handling of character classes; they are now done with a 32-byte +bit map always. + +7. Added the -d and /D options to pcretest to make it possible to look at the +internals of compilation without having to recompile pcre. + + +Version 0.95 23-Sep-97 +---------------------- + +1. Fixed bug in pre-pass concerning escaped "normal" characters such as \x5c or +\x20 at the start of a run of normal characters. These were being treated as +real characters, instead of the source characters being re-checked. + + +Version 0.94 18-Sep-97 +---------------------- + +1. The functions are now thread-safe, with the caveat that the global variables +containing pointers to malloc() and free() or alternative functions are the +same for all threads. + +2. Get pcre_study() to generate a bitmap of initial characters for non- +anchored patterns when this is possible, and use it if passed to pcre_exec(). + + +Version 0.93 15-Sep-97 +---------------------- + +1. /(b)|(:+)/ was computing an incorrect first character. + +2. Add pcre_study() to the API and the passing of pcre_extra to pcre_exec(), +but not actually doing anything yet. + +3. Treat "-" characters in classes that cannot be part of ranges as literals, +as Perl does (e.g. [-az] or [az-]). + +4. Set the anchored flag if a branch starts with .* or .*? because that tests +all possible positions. + +5. Split up into different modules to avoid including unneeded functions in a +compiled binary. However, compile and exec are still in one module. The "study" +function is split off. + +6. The character tables are now in a separate module whose source is generated +by an auxiliary program - but can then be edited by hand if required. There are +now no calls to isalnum(), isspace(), isdigit(), isxdigit(), tolower() or +toupper() in the code. + +7. Turn the malloc/free funtions variables into pcre_malloc and pcre_free and +make them global. Abolish the function for setting them, as the caller can now +set them directly. + + +Version 0.92 11-Sep-97 +---------------------- + +1. A repeat with a fixed maximum and a minimum of 1 for an ordinary character +(e.g. /a{1,3}/) was broken (I mis-optimized it). + +2. Caseless matching was not working in character classes if the characters in +the pattern were in upper case. + +3. Make ranges like [W-c] work in the same way as Perl for caseless matching. + +4. Make PCRE_ANCHORED public and accept as a compile option. + +5. Add an options word to pcre_exec() and accept PCRE_ANCHORED and +PCRE_CASELESS at run time. Add escapes \A and \I to pcretest to cause it to +pass them. + +6. Give an error if bad option bits passed at compile or run time. + +7. Add PCRE_MULTILINE at compile and exec time, and (?m) as well. Add \M to +pcretest to cause it to pass that flag. + +8. Add pcre_info(), to get the number of identifying subpatterns, the stored +options, and the first character, if set. + +9. Recognize C+ or C{n,m} where n >= 1 as providing a fixed starting character. + + +Version 0.91 10-Sep-97 +---------------------- + +1. PCRE was failing to diagnose unlimited repeats of subpatterns that could +match the empty string as in /(a*)*/. It was looping and ultimately crashing. + +2. PCRE was looping on encountering an indefinitely repeated back reference to +a subpattern that had matched an empty string, e.g. /(a|)\1*/. It now does what +Perl does - treats the match as successful. + +**** diff --git a/cosmic rage/docs/RegularExpressions.txt b/cosmic rage/docs/RegularExpressions.txt new file mode 100644 index 0000000..0a53b57 --- /dev/null +++ b/cosmic rage/docs/RegularExpressions.txt @@ -0,0 +1,1996 @@ +PCRE REGULAR EXPRESSION DETAILS + + The syntax and semantics of the regular expressions supported by PCRE + are described below. Regular expressions are also described in the Perl + documentation and in a number of books, some of which have copious + examples. Jeffrey Friedl's "Mastering Regular Expressions", published + by O'Reilly, covers regular expressions in great detail. This descrip- + tion of PCRE's regular expressions is intended as reference material. + + The original operation of PCRE was on strings of one-byte characters. + However, there is now also support for UTF-8 character strings. To use + this, you must build PCRE to include UTF-8 support, and then call + pcre_compile() with the PCRE_UTF8 option. How this affects pattern + matching is mentioned in several places below. There is also a summary + of UTF-8 features in the section on UTF-8 support in the main pcre + page. + + The remainder of this document discusses the patterns that are sup- + ported by PCRE when its main matching function, pcre_exec(), is used. + From release 6.0, PCRE offers a second matching function, + pcre_dfa_exec(), which matches using a different algorithm that is not + Perl-compatible. The advantages and disadvantages of the alternative + function, and how it differs from the normal function, are discussed in + the pcrematching page. + + +CHARACTERS AND METACHARACTERS + + A regular expression is a pattern that is matched against a subject + string from left to right. Most characters stand for themselves in a + pattern, and match the corresponding characters in the subject. As a + trivial example, the pattern + + The quick brown fox + + matches a portion of a subject string that is identical to itself. When + caseless matching is specified (the PCRE_CASELESS option), letters are + matched independently of case. In UTF-8 mode, PCRE always understands + the concept of case for characters whose values are less than 128, so + caseless matching is always possible. For characters with higher val- + ues, the concept of case is supported if PCRE is compiled with Unicode + property support, but not otherwise. If you want to use caseless + matching for characters 128 and above, you must ensure that PCRE is + compiled with Unicode property support as well as with UTF-8 support. + + The power of regular expressions comes from the ability to include + alternatives and repetitions in the pattern. These are encoded in the + pattern by the use of metacharacters, which do not stand for themselves + but instead are interpreted in some special way. + + There are two different sets of metacharacters: those that are recog- + nized anywhere in the pattern except within square brackets, and those + that are recognized within square brackets. Outside square brackets, + the metacharacters are as follows: + + \ general escape character with several uses + ^ assert start of string (or line, in multiline mode) + $ assert end of string (or line, in multiline mode) + . match any character except newline (by default) + [ start character class definition + | start of alternative branch + ( start subpattern + ) end subpattern + ? extends the meaning of ( + also 0 or 1 quantifier + also quantifier minimizer + * 0 or more quantifier + + 1 or more quantifier + also "possessive quantifier" + { start min/max quantifier + + Part of a pattern that is in square brackets is called a "character + class". In a character class the only metacharacters are: + + \ general escape character + ^ negate the class, but only if the first character + - indicates character range + [ POSIX character class (only if followed by POSIX + syntax) + ] terminates the character class + + The following sections describe the use of each of the metacharacters. + + +BACKSLASH + + The backslash character has several uses. Firstly, if it is followed by + a non-alphanumeric character, it takes away any special meaning that + character may have. This use of backslash as an escape character + applies both inside and outside character classes. + + For example, if you want to match a * character, you write \* in the + pattern. This escaping action applies whether or not the following + character would otherwise be interpreted as a metacharacter, so it is + always safe to precede a non-alphanumeric with backslash to specify + that it stands for itself. In particular, if you want to match a back- + slash, you write \\. + + If a pattern is compiled with the PCRE_EXTENDED option, whitespace in + the pattern (other than in a character class) and characters between a + # outside a character class and the next newline are ignored. An escap- + ing backslash can be used to include a whitespace or # character as + part of the pattern. + + If you want to remove the special meaning from a sequence of charac- + ters, you can do so by putting them between \Q and \E. This is differ- + ent from Perl in that $ and @ are handled as literals in \Q...\E + sequences in PCRE, whereas in Perl, $ and @ cause variable interpola- + tion. Note the following examples: + + Pattern PCRE matches Perl matches + + \Qabc$xyz\E abc$xyz abc followed by the + contents of $xyz + \Qabc\$xyz\E abc\$xyz abc\$xyz + \Qabc\E\$\Qxyz\E abc$xyz abc$xyz + + The \Q...\E sequence is recognized both inside and outside character + classes. + + Non-printing characters + + A second use of backslash provides a way of encoding non-printing char- + acters in patterns in a visible manner. There is no restriction on the + appearance of non-printing characters, apart from the binary zero that + terminates a pattern, but when a pattern is being prepared by text + editing, it is usually easier to use one of the following escape + sequences than the binary character it represents: + + \a alarm, that is, the BEL character (hex 07) + \cx "control-x", where x is any character + \e escape (hex 1B) + \f formfeed (hex 0C) + \n newline (hex 0A) + \r carriage return (hex 0D) + \t tab (hex 09) + \ddd character with octal code ddd, or backreference + \xhh character with hex code hh + \x{hhh..} character with hex code hhh.. + + The precise effect of \cx is as follows: if x is a lower case letter, + it is converted to upper case. Then bit 6 of the character (hex 40) is + inverted. Thus \cz becomes hex 1A, but \c{ becomes hex 3B, while \c; + becomes hex 7B. + + After \x, from zero to two hexadecimal digits are read (letters can be + in upper or lower case). Any number of hexadecimal digits may appear + between \x{ and }, but the value of the character code must be less + than 256 in non-UTF-8 mode, and less than 2**31 in UTF-8 mode (that is, + the maximum hexadecimal value is 7FFFFFFF). If characters other than + hexadecimal digits appear between \x{ and }, or if there is no termi- + nating }, this form of escape is not recognized. Instead, the initial + \x will be interpreted as a basic hexadecimal escape, with no following + digits, giving a character whose value is zero. + + Characters whose value is less than 256 can be defined by either of the + two syntaxes for \x. There is no difference in the way they are han- + dled. For example, \xdc is exactly the same as \x{dc}. + + After \0 up to two further octal digits are read. If there are fewer + than two digits, just those that are present are used. Thus the + sequence \0\x\07 specifies two binary zeros followed by a BEL character + (code value 7). Make sure you supply two digits after the initial zero + if the pattern character that follows is itself an octal digit. + + The handling of a backslash followed by a digit other than 0 is compli- + cated. Outside a character class, PCRE reads it and any following dig- + its as a decimal number. If the number is less than 10, or if there + have been at least that many previous capturing left parentheses in the + expression, the entire sequence is taken as a back reference. A + description of how this works is given later, following the discussion + of parenthesized subpatterns. + + Inside a character class, or if the decimal number is greater than 9 + and there have not been that many capturing subpatterns, PCRE re-reads + up to three octal digits following the backslash, and uses them to gen- + erate a data character. Any subsequent digits stand for themselves. In + non-UTF-8 mode, the value of a character specified in octal must be + less than \400. In UTF-8 mode, values up to \777 are permitted. For + example: + + \040 is another way of writing a space + \40 is the same, provided there are fewer than 40 + previous capturing subpatterns + \7 is always a back reference + \11 might be a back reference, or another way of + writing a tab + \011 is always a tab + \0113 is a tab followed by the character "3" + \113 might be a back reference, otherwise the + character with octal code 113 + \377 might be a back reference, otherwise + the byte consisting entirely of 1 bits + \81 is either a back reference, or a binary zero + followed by the two characters "8" and "1" + + Note that octal values of 100 or greater must not be introduced by a + leading zero, because no more than three octal digits are ever read. + + All the sequences that define a single character value can be used both + inside and outside character classes. In addition, inside a character + class, the sequence \b is interpreted as the backspace character (hex + 08), and the sequences \R and \X are interpreted as the characters "R" + and "X", respectively. Outside a character class, these sequences have + different meanings (see below). + + Absolute and relative back references + + The sequence \g followed by a positive or negative number, optionally + enclosed in braces, is an absolute or relative back reference. Back + references are discussed later, following the discussion of parenthe- + sized subpatterns. + + Generic character types + + Another use of backslash is for specifying generic character types. The + following are always recognized: + + \d any decimal digit + \D any character that is not a decimal digit + \h any horizontal whitespace character + \H any character that is not a horizontal whitespace character + \s any whitespace character + \S any character that is not a whitespace character + \v any vertical whitespace character + \V any character that is not a vertical whitespace character + \w any "word" character + \W any "non-word" character + + Each pair of escape sequences partitions the complete set of characters + into two disjoint sets. Any given character matches one, and only one, + of each pair. + + These character type sequences can appear both inside and outside char- + acter classes. They each match one character of the appropriate type. + If the current matching point is at the end of the subject string, all + of them fail, since there is no character to match. + + For compatibility with Perl, \s does not match the VT character (code + 11). This makes it different from the the POSIX "space" class. The \s + characters are HT (9), LF (10), FF (12), CR (13), and space (32). (If + "use locale;" is included in a Perl script, \s may match the VT charac- + ter. In PCRE, it never does.) + + A "word" character is an underscore or any character less than 256 that + is a letter or digit. The definition of letters and digits is con- + trolled by PCRE's low-valued character tables, and may vary if locale- + specific matching is taking place (see "Locale support" in the pcreapi + page). For example, in the "fr_FR" (French) locale, some character + codes greater than 128 are used for accented letters, and these are + matched by \w. + + In UTF-8 mode, characters with values greater than 128 never match \d, + \s, or \w, and always match \D, \S, and \W. This is true even when Uni- + code character property support is available. The use of locales with + Unicode is discouraged. + + Newline sequences + + Outside a character class, the escape sequence \R matches any Unicode + newline sequence. This is an extension to Perl. In non-UTF-8 mode \R is + equivalent to the following: + + (?>\r\n|\n|\x0b|\f|\r|\x85) + + This is an example of an "atomic group", details of which are given + below. This particular group matches either the two-character sequence + CR followed by LF, or one of the single characters LF (linefeed, + U+000A), VT (vertical tab, U+000B), FF (formfeed, U+000C), CR (carriage + return, U+000D), or NEL (next line, U+0085). The two-character sequence + is treated as a single unit that cannot be split. + + In UTF-8 mode, two additional characters whose codepoints are greater + than 255 are added: LS (line separator, U+2028) and PS (paragraph sepa- + rator, U+2029). Unicode character property support is not needed for + these characters to be recognized. + + Inside a character class, \R matches the letter "R". + + Unicode character properties + + When PCRE is built with Unicode character property support, three addi- + tional escape sequences to match character properties are available + when UTF-8 mode is selected. They are: + + \p{xx} a character with the xx property + \P{xx} a character without the xx property + \X an extended Unicode sequence + + The property names represented by xx above are limited to the Unicode + script names, the general category properties, and "Any", which matches + any character (including newline). Other properties such as "InMusical- + Symbols" are not currently supported by PCRE. Note that \P{Any} does + not match any characters, so always causes a match failure. + + Sets of Unicode characters are defined as belonging to certain scripts. + A character from one of these sets can be matched using a script name. + For example: + + \p{Greek} + \P{Han} + + Those that are not part of an identified script are lumped together as + "Common". The current list of scripts is: + + Arabic, Armenian, Balinese, Bengali, Bopomofo, Braille, Buginese, + Buhid, Canadian_Aboriginal, Cherokee, Common, Coptic, Cuneiform, + Cypriot, Cyrillic, Deseret, Devanagari, Ethiopic, Georgian, Glagolitic, + Gothic, Greek, Gujarati, Gurmukhi, Han, Hangul, Hanunoo, Hebrew, Hira- + gana, Inherited, Kannada, Katakana, Kharoshthi, Khmer, Lao, Latin, + Limbu, Linear_B, Malayalam, Mongolian, Myanmar, New_Tai_Lue, Nko, + Ogham, Old_Italic, Old_Persian, Oriya, Osmanya, Phags_Pa, Phoenician, + Runic, Shavian, Sinhala, Syloti_Nagri, Syriac, Tagalog, Tagbanwa, + Tai_Le, Tamil, Telugu, Thaana, Thai, Tibetan, Tifinagh, Ugaritic, Yi. + + Each character has exactly one general category property, specified by + a two-letter abbreviation. For compatibility with Perl, negation can be + specified by including a circumflex between the opening brace and the + property name. For example, \p{^Lu} is the same as \P{Lu}. + + If only one letter is specified with \p or \P, it includes all the gen- + eral category properties that start with that letter. In this case, in + the absence of negation, the curly brackets in the escape sequence are + optional; these two examples have the same effect: + + \p{L} + \pL + + The following general category property codes are supported: + + C Other + Cc Control + Cf Format + Cn Unassigned + Co Private use + Cs Surrogate + + L Letter + Ll Lower case letter + Lm Modifier letter + Lo Other letter + Lt Title case letter + Lu Upper case letter + + M Mark + Mc Spacing mark + Me Enclosing mark + Mn Non-spacing mark + + N Number + Nd Decimal number + Nl Letter number + No Other number + + P Punctuation + Pc Connector punctuation + Pd Dash punctuation + Pe Close punctuation + Pf Final punctuation + Pi Initial punctuation + Po Other punctuation + Ps Open punctuation + + S Symbol + Sc Currency symbol + Sk Modifier symbol + Sm Mathematical symbol + So Other symbol + + Z Separator + Zl Line separator + Zp Paragraph separator + Zs Space separator + + The special property L& is also supported: it matches a character that + has the Lu, Ll, or Lt property, in other words, a letter that is not + classified as a modifier or "other". + + The long synonyms for these properties that Perl supports (such as + \p{Letter}) are not supported by PCRE, nor is it permitted to prefix + any of these properties with "Is". + + No character that is in the Unicode table has the Cn (unassigned) prop- + erty. Instead, this property is assumed for any code point that is not + in the Unicode table. + + Specifying caseless matching does not affect these escape sequences. + For example, \p{Lu} always matches only upper case letters. + + The \X escape matches any number of Unicode characters that form an + extended Unicode sequence. \X is equivalent to + + (?>\PM\pM*) + + That is, it matches a character without the "mark" property, followed + by zero or more characters with the "mark" property, and treats the + sequence as an atomic group (see below). Characters with the "mark" + property are typically accents that affect the preceding character. + + Matching characters by Unicode property is not fast, because PCRE has + to search a structure that contains data for over fifteen thousand + characters. That is why the traditional escape sequences such as \d and + \w do not use Unicode properties in PCRE. + + Simple assertions + + The final use of backslash is for certain simple assertions. An asser- + tion specifies a condition that has to be met at a particular point in + a match, without consuming any characters from the subject string. The + use of subpatterns for more complicated assertions is described below. + The backslashed assertions are: + + \b matches at a word boundary + \B matches when not at a word boundary + \A matches at the start of the subject + \Z matches at the end of the subject + also matches before a newline at the end of the subject + \z matches only at the end of the subject + \G matches at the first matching position in the subject + + These assertions may not appear in character classes (but note that \b + has a different meaning, namely the backspace character, inside a char- + acter class). + + A word boundary is a position in the subject string where the current + character and the previous character do not both match \w or \W (i.e. + one matches \w and the other matches \W), or the start or end of the + string if the first or last character matches \w, respectively. + + The \A, \Z, and \z assertions differ from the traditional circumflex + and dollar (described in the next section) in that they only ever match + at the very start and end of the subject string, whatever options are + set. Thus, they are independent of multiline mode. These three asser- + tions are not affected by the PCRE_NOTBOL or PCRE_NOTEOL options, which + affect only the behaviour of the circumflex and dollar metacharacters. + However, if the startoffset argument of pcre_exec() is non-zero, indi- + cating that matching is to start at a point other than the beginning of + the subject, \A can never match. The difference between \Z and \z is + that \Z matches before a newline at the end of the string as well as at + the very end, whereas \z matches only at the end. + + The \G assertion is true only when the current matching position is at + the start point of the match, as specified by the startoffset argument + of pcre_exec(). It differs from \A when the value of startoffset is + non-zero. By calling pcre_exec() multiple times with appropriate argu- + ments, you can mimic Perl's /g option, and it is in this kind of imple- + mentation where \G can be useful. + + Note, however, that PCRE's interpretation of \G, as the start of the + current match, is subtly different from Perl's, which defines it as the + end of the previous match. In Perl, these can be different when the + previously matched string was empty. Because PCRE does just one match + at a time, it cannot reproduce this behaviour. + + If all the alternatives of a pattern begin with \G, the expression is + anchored to the starting match position, and the "anchored" flag is set + in the compiled regular expression. + + +CIRCUMFLEX AND DOLLAR + + Outside a character class, in the default matching mode, the circumflex + character is an assertion that is true only if the current matching + point is at the start of the subject string. If the startoffset argu- + ment of pcre_exec() is non-zero, circumflex can never match if the + PCRE_MULTILINE option is unset. Inside a character class, circumflex + has an entirely different meaning (see below). + + Circumflex need not be the first character of the pattern if a number + of alternatives are involved, but it should be the first thing in each + alternative in which it appears if the pattern is ever to match that + branch. If all possible alternatives start with a circumflex, that is, + if the pattern is constrained to match only at the start of the sub- + ject, it is said to be an "anchored" pattern. (There are also other + constructs that can cause a pattern to be anchored.) + + A dollar character is an assertion that is true only if the current + matching point is at the end of the subject string, or immediately + before a newline at the end of the string (by default). Dollar need not + be the last character of the pattern if a number of alternatives are + involved, but it should be the last item in any branch in which it + appears. Dollar has no special meaning in a character class. + + The meaning of dollar can be changed so that it matches only at the + very end of the string, by setting the PCRE_DOLLAR_ENDONLY option at + compile time. This does not affect the \Z assertion. + + The meanings of the circumflex and dollar characters are changed if the + PCRE_MULTILINE option is set. When this is the case, a circumflex + matches immediately after internal newlines as well as at the start of + the subject string. It does not match after a newline that ends the + string. A dollar matches before any newlines in the string, as well as + at the very end, when PCRE_MULTILINE is set. When newline is specified + as the two-character sequence CRLF, isolated CR and LF characters do + not indicate newlines. + + For example, the pattern /^abc$/ matches the subject string "def\nabc" + (where \n represents a newline) in multiline mode, but not otherwise. + Consequently, patterns that are anchored in single line mode because + all branches start with ^ are not anchored in multiline mode, and a + match for circumflex is possible when the startoffset argument of + pcre_exec() is non-zero. The PCRE_DOLLAR_ENDONLY option is ignored if + PCRE_MULTILINE is set. + + Note that the sequences \A, \Z, and \z can be used to match the start + and end of the subject in both modes, and if all branches of a pattern + start with \A it is always anchored, whether or not PCRE_MULTILINE is + set. + + +FULL STOP (PERIOD, DOT) + + Outside a character class, a dot in the pattern matches any one charac- + ter in the subject string except (by default) a character that signi- + fies the end of a line. In UTF-8 mode, the matched character may be + more than one byte long. + + When a line ending is defined as a single character, dot never matches + that character; when the two-character sequence CRLF is used, dot does + not match CR if it is immediately followed by LF, but otherwise it + matches all characters (including isolated CRs and LFs). When any Uni- + code line endings are being recognized, dot does not match CR or LF or + any of the other line ending characters. + + The behaviour of dot with regard to newlines can be changed. If the + PCRE_DOTALL option is set, a dot matches any one character, without + exception. If the two-character sequence CRLF is present in the subject + string, it takes two dots to match it. + + The handling of dot is entirely independent of the handling of circum- + flex and dollar, the only relationship being that they both involve + newlines. Dot has no special meaning in a character class. + + +MATCHING A SINGLE BYTE + + Outside a character class, the escape sequence \C matches any one byte, + both in and out of UTF-8 mode. Unlike a dot, it always matches any + line-ending characters. The feature is provided in Perl in order to + match individual bytes in UTF-8 mode. Because it breaks up UTF-8 char- + acters into individual bytes, what remains in the string may be a mal- + formed UTF-8 string. For this reason, the \C escape sequence is best + avoided. + + PCRE does not allow \C to appear in lookbehind assertions (described + below), because in UTF-8 mode this would make it impossible to calcu- + late the length of the lookbehind. + + +SQUARE BRACKETS AND CHARACTER CLASSES + + An opening square bracket introduces a character class, terminated by a + closing square bracket. A closing square bracket on its own is not spe- + cial. If a closing square bracket is required as a member of the class, + it should be the first data character in the class (after an initial + circumflex, if present) or escaped with a backslash. + + A character class matches a single character in the subject. In UTF-8 + mode, the character may occupy more than one byte. A matched character + must be in the set of characters defined by the class, unless the first + character in the class definition is a circumflex, in which case the + subject character must not be in the set defined by the class. If a + circumflex is actually required as a member of the class, ensure it is + not the first character, or escape it with a backslash. + + For example, the character class [aeiou] matches any lower case vowel, + while [^aeiou] matches any character that is not a lower case vowel. + Note that a circumflex is just a convenient notation for specifying the + characters that are in the class by enumerating those that are not. A + class that starts with a circumflex is not an assertion: it still con- + sumes a character from the subject string, and therefore it fails if + the current pointer is at the end of the string. + + In UTF-8 mode, characters with values greater than 255 can be included + in a class as a literal string of bytes, or by using the \x{ escaping + mechanism. + + When caseless matching is set, any letters in a class represent both + their upper case and lower case versions, so for example, a caseless + [aeiou] matches "A" as well as "a", and a caseless [^aeiou] does not + match "A", whereas a caseful version would. In UTF-8 mode, PCRE always + understands the concept of case for characters whose values are less + than 128, so caseless matching is always possible. For characters with + higher values, the concept of case is supported if PCRE is compiled + with Unicode property support, but not otherwise. If you want to use + caseless matching for characters 128 and above, you must ensure that + PCRE is compiled with Unicode property support as well as with UTF-8 + support. + + Characters that might indicate line breaks are never treated in any + special way when matching character classes, whatever line-ending + sequence is in use, and whatever setting of the PCRE_DOTALL and + PCRE_MULTILINE options is used. A class such as [^a] always matches one + of these characters. + + The minus (hyphen) character can be used to specify a range of charac- + ters in a character class. For example, [d-m] matches any letter + between d and m, inclusive. If a minus character is required in a + class, it must be escaped with a backslash or appear in a position + where it cannot be interpreted as indicating a range, typically as the + first or last character in the class. + + It is not possible to have the literal character "]" as the end charac- + ter of a range. A pattern such as [W-]46] is interpreted as a class of + two characters ("W" and "-") followed by a literal string "46]", so it + would match "W46]" or "-46]". However, if the "]" is escaped with a + backslash it is interpreted as the end of range, so [W-\]46] is inter- + preted as a class containing a range followed by two other characters. + The octal or hexadecimal representation of "]" can also be used to end + a range. + + Ranges operate in the collating sequence of character values. They can + also be used for characters specified numerically, for example + [\000-\037]. In UTF-8 mode, ranges can include characters whose values + are greater than 255, for example [\x{100}-\x{2ff}]. + + If a range that includes letters is used when caseless matching is set, + it matches the letters in either case. For example, [W-c] is equivalent + to [][\\^_`wxyzabc], matched caselessly, and in non-UTF-8 mode, if + character tables for the "fr_FR" locale are in use, [\xc8-\xcb] matches + accented E characters in both cases. In UTF-8 mode, PCRE supports the + concept of case for characters with values greater than 128 only when + it is compiled with Unicode property support. + + The character types \d, \D, \p, \P, \s, \S, \w, and \W may also appear + in a character class, and add the characters that they match to the + class. For example, [\dABCDEF] matches any hexadecimal digit. A circum- + flex can conveniently be used with the upper case character types to + specify a more restricted set of characters than the matching lower + case type. For example, the class [^\W_] matches any letter or digit, + but not underscore. + + The only metacharacters that are recognized in character classes are + backslash, hyphen (only where it can be interpreted as specifying a + range), circumflex (only at the start), opening square bracket (only + when it can be interpreted as introducing a POSIX class name - see the + next section), and the terminating closing square bracket. However, + escaping other non-alphanumeric characters does no harm. + + +POSIX CHARACTER CLASSES + + Perl supports the POSIX notation for character classes. This uses names + enclosed by [: and :] within the enclosing square brackets. PCRE also + supports this notation. For example, + + [01[:alpha:]%] + + matches "0", "1", any alphabetic character, or "%". The supported class + names are + + alnum letters and digits + alpha letters + ascii character codes 0 - 127 + blank space or tab only + cntrl control characters + digit decimal digits (same as \d) + graph printing characters, excluding space + lower lower case letters + print printing characters, including space + punct printing characters, excluding letters and digits + space white space (not quite the same as \s) + upper upper case letters + word "word" characters (same as \w) + xdigit hexadecimal digits + + The "space" characters are HT (9), LF (10), VT (11), FF (12), CR (13), + and space (32). Notice that this list includes the VT character (code + 11). This makes "space" different to \s, which does not include VT (for + Perl compatibility). + + The name "word" is a Perl extension, and "blank" is a GNU extension + from Perl 5.8. Another Perl extension is negation, which is indicated + by a ^ character after the colon. For example, + + [12[:^digit:]] + + matches "1", "2", or any non-digit. PCRE (and Perl) also recognize the + POSIX syntax [.ch.] and [=ch=] where "ch" is a "collating element", but + these are not supported, and an error is given if they are encountered. + + In UTF-8 mode, characters with values greater than 128 do not match any + of the POSIX character classes. + + +VERTICAL BAR + + Vertical bar characters are used to separate alternative patterns. For + example, the pattern + + gilbert|sullivan + + matches either "gilbert" or "sullivan". Any number of alternatives may + appear, and an empty alternative is permitted (matching the empty + string). The matching process tries each alternative in turn, from left + to right, and the first one that succeeds is used. If the alternatives + are within a subpattern (defined below), "succeeds" means matching the + rest of the main pattern as well as the alternative in the subpattern. + + +INTERNAL OPTION SETTING + + The settings of the PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and + PCRE_EXTENDED options can be changed from within the pattern by a + sequence of Perl option letters enclosed between "(?" and ")". The + option letters are + + i for PCRE_CASELESS + m for PCRE_MULTILINE + s for PCRE_DOTALL + x for PCRE_EXTENDED + + For example, (?im) sets caseless, multiline matching. It is also possi- + ble to unset these options by preceding the letter with a hyphen, and a + combined setting and unsetting such as (?im-sx), which sets PCRE_CASE- + LESS and PCRE_MULTILINE while unsetting PCRE_DOTALL and PCRE_EXTENDED, + is also permitted. If a letter appears both before and after the + hyphen, the option is unset. + + When an option change occurs at top level (that is, not inside subpat- + tern parentheses), the change applies to the remainder of the pattern + that follows. If the change is placed right at the start of a pattern, + PCRE extracts it into the global options (and it will therefore show up + in data extracted by the pcre_fullinfo() function). + + An option change within a subpattern (see below for a description of + subpatterns) affects only that part of the current pattern that follows + it, so + + (a(?i)b)c + + matches abc and aBc and no other strings (assuming PCRE_CASELESS is not + used). By this means, options can be made to have different settings + in different parts of the pattern. Any changes made in one alternative + do carry on into subsequent branches within the same subpattern. For + example, + + (a(?i)b|c) + + matches "ab", "aB", "c", and "C", even though when matching "C" the + first branch is abandoned before the option setting. This is because + the effects of option settings happen at compile time. There would be + some very weird behaviour otherwise. + + The PCRE-specific options PCRE_DUPNAMES, PCRE_UNGREEDY, and PCRE_EXTRA + can be changed in the same way as the Perl-compatible options by using + the characters J, U and X respectively. + + +SUBPATTERNS + + Subpatterns are delimited by parentheses (round brackets), which can be + nested. Turning part of a pattern into a subpattern does two things: + + 1. It localizes a set of alternatives. For example, the pattern + + cat(aract|erpillar|) + + matches one of the words "cat", "cataract", or "caterpillar". Without + the parentheses, it would match "cataract", "erpillar" or an empty + string. + + 2. It sets up the subpattern as a capturing subpattern. This means + that, when the whole pattern matches, that portion of the subject + string that matched the subpattern is passed back to the caller via the + ovector argument of pcre_exec(). Opening parentheses are counted from + left to right (starting from 1) to obtain numbers for the capturing + subpatterns. + + For example, if the string "the red king" is matched against the pat- + tern + + the ((red|white) (king|queen)) + + the captured substrings are "red king", "red", and "king", and are num- + bered 1, 2, and 3, respectively. + + The fact that plain parentheses fulfil two functions is not always + helpful. There are often times when a grouping subpattern is required + without a capturing requirement. If an opening parenthesis is followed + by a question mark and a colon, the subpattern does not do any captur- + ing, and is not counted when computing the number of any subsequent + capturing subpatterns. For example, if the string "the white queen" is + matched against the pattern + + the ((?:red|white) (king|queen)) + + the captured substrings are "white queen" and "queen", and are numbered + 1 and 2. The maximum number of capturing subpatterns is 65535. + + As a convenient shorthand, if any option settings are required at the + start of a non-capturing subpattern, the option letters may appear + between the "?" and the ":". Thus the two patterns + + (?i:saturday|sunday) + (?:(?i)saturday|sunday) + + match exactly the same set of strings. Because alternative branches are + tried from left to right, and options are not reset until the end of + the subpattern is reached, an option setting in one branch does affect + subsequent branches, so the above patterns match "SUNDAY" as well as + "Saturday". + + +NAMED SUBPATTERNS + + Identifying capturing parentheses by number is simple, but it can be + very hard to keep track of the numbers in complicated regular expres- + sions. Furthermore, if an expression is modified, the numbers may + change. To help with this difficulty, PCRE supports the naming of sub- + patterns. This feature was not added to Perl until release 5.10. Python + had the feature earlier, and PCRE introduced it at release 4.0, using + the Python syntax. PCRE now supports both the Perl and the Python syn- + tax. + + In PCRE, a subpattern can be named in one of three ways: (?...) + or (?'name'...) as in Perl, or (?P...) as in Python. References + to capturing parentheses from other parts of the pattern, such as back- + references, recursion, and conditions, can be made by name as well as + by number. + + Names consist of up to 32 alphanumeric characters and underscores. + Named capturing parentheses are still allocated numbers as well as + names, exactly as if the names were not present. The PCRE API provides + function calls for extracting the name-to-number translation table from + a compiled pattern. There is also a convenience function for extracting + a captured substring by name. + + By default, a name must be unique within a pattern, but it is possible + to relax this constraint by setting the PCRE_DUPNAMES option at compile + time. This can be useful for patterns where only one instance of the + named parentheses can match. Suppose you want to match the name of a + weekday, either as a 3-letter abbreviation or as the full name, and in + both cases you want to extract the abbreviation. This pattern (ignoring + the line breaks) does the job: + + (?Mon|Fri|Sun)(?:day)?| + (?Tue)(?:sday)?| + (?Wed)(?:nesday)?| + (?Thu)(?:rsday)?| + (?Sat)(?:urday)? + + There are five capturing substrings, but only one is ever set after a + match. The convenience function for extracting the data by name + returns the substring for the first (and in this example, the only) + subpattern of that name that matched. This saves searching to find + which numbered subpattern it was. If you make a reference to a non- + unique named subpattern from elsewhere in the pattern, the one that + corresponds to the lowest number is used. For further details of the + interfaces for handling named subpatterns, see the pcreapi documenta- + tion. + + +REPETITION + + Repetition is specified by quantifiers, which can follow any of the + following items: + + a literal data character + the dot metacharacter + the \C escape sequence + the \X escape sequence (in UTF-8 mode with Unicode properties) + the \R escape sequence + an escape such as \d that matches a single character + a character class + a back reference (see next section) + a parenthesized subpattern (unless it is an assertion) + + The general repetition quantifier specifies a minimum and maximum num- + ber of permitted matches, by giving the two numbers in curly brackets + (braces), separated by a comma. The numbers must be less than 65536, + and the first must be less than or equal to the second. For example: + + z{2,4} + + matches "zz", "zzz", or "zzzz". A closing brace on its own is not a + special character. If the second number is omitted, but the comma is + present, there is no upper limit; if the second number and the comma + are both omitted, the quantifier specifies an exact number of required + matches. Thus + + [aeiou]{3,} + + matches at least 3 successive vowels, but may match many more, while + + \d{8} + + matches exactly 8 digits. An opening curly bracket that appears in a + position where a quantifier is not allowed, or one that does not match + the syntax of a quantifier, is taken as a literal character. For exam- + ple, {,6} is not a quantifier, but a literal string of four characters. + + In UTF-8 mode, quantifiers apply to UTF-8 characters rather than to + individual bytes. Thus, for example, \x{100}{2} matches two UTF-8 char- + acters, each of which is represented by a two-byte sequence. Similarly, + when Unicode property support is available, \X{3} matches three Unicode + extended sequences, each of which may be several bytes long (and they + may be of different lengths). + + The quantifier {0} is permitted, causing the expression to behave as if + the previous item and the quantifier were not present. + + For convenience, the three most common quantifiers have single-charac- + ter abbreviations: + + * is equivalent to {0,} + + is equivalent to {1,} + ? is equivalent to {0,1} + + It is possible to construct infinite loops by following a subpattern + that can match no characters with a quantifier that has no upper limit, + for example: + + (a?)* + + Earlier versions of Perl and PCRE used to give an error at compile time + for such patterns. However, because there are cases where this can be + useful, such patterns are now accepted, but if any repetition of the + subpattern does in fact match no characters, the loop is forcibly bro- + ken. + + By default, the quantifiers are "greedy", that is, they match as much + as possible (up to the maximum number of permitted times), without + causing the rest of the pattern to fail. The classic example of where + this gives problems is in trying to match comments in C programs. These + appear between /* and */ and within the comment, individual * and / + characters may appear. An attempt to match C comments by applying the + pattern + + /\*.*\*/ + + to the string + + /* first comment */ not comment /* second comment */ + + fails, because it matches the entire string owing to the greediness of + the .* item. + + However, if a quantifier is followed by a question mark, it ceases to + be greedy, and instead matches the minimum number of times possible, so + the pattern + + /\*.*?\*/ + + does the right thing with the C comments. The meaning of the various + quantifiers is not otherwise changed, just the preferred number of + matches. Do not confuse this use of question mark with its use as a + quantifier in its own right. Because it has two uses, it can sometimes + appear doubled, as in + + \d??\d + + which matches one digit by preference, but can match two if that is the + only way the rest of the pattern matches. + + If the PCRE_UNGREEDY option is set (an option that is not available in + Perl), the quantifiers are not greedy by default, but individual ones + can be made greedy by following them with a question mark. In other + words, it inverts the default behaviour. + + When a parenthesized subpattern is quantified with a minimum repeat + count that is greater than 1 or with a limited maximum, more memory is + required for the compiled pattern, in proportion to the size of the + minimum or maximum. + + If a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equiv- + alent to Perl's /s) is set, thus allowing the dot to match newlines, + the pattern is implicitly anchored, because whatever follows will be + tried against every character position in the subject string, so there + is no point in retrying the overall match at any position after the + first. PCRE normally treats such a pattern as though it were preceded + by \A. + + In cases where it is known that the subject string contains no new- + lines, it is worth setting PCRE_DOTALL in order to obtain this opti- + mization, or alternatively using ^ to indicate anchoring explicitly. + + However, there is one situation where the optimization cannot be used. + When .* is inside capturing parentheses that are the subject of a + backreference elsewhere in the pattern, a match at the start may fail + where a later one succeeds. Consider, for example: + + (.*)abc\1 + + If the subject is "xyz123abc123" the match point is the fourth charac- + ter. For this reason, such a pattern is not implicitly anchored. + + When a capturing subpattern is repeated, the value captured is the sub- + string that matched the final iteration. For example, after + + (tweedle[dume]{3}\s*)+ + + has matched "tweedledum tweedledee" the value of the captured substring + is "tweedledee". However, if there are nested capturing subpatterns, + the corresponding captured values may have been set in previous itera- + tions. For example, after + + /(a|(b))+/ + + matches "aba" the value of the second captured substring is "b". + + +ATOMIC GROUPING AND POSSESSIVE QUANTIFIERS + + With both maximizing ("greedy") and minimizing ("ungreedy" or "lazy") + repetition, failure of what follows normally causes the repeated item + to be re-evaluated to see if a different number of repeats allows the + rest of the pattern to match. Sometimes it is useful to prevent this, + either to change the nature of the match, or to cause it fail earlier + than it otherwise might, when the author of the pattern knows there is + no point in carrying on. + + Consider, for example, the pattern \d+foo when applied to the subject + line + + 123456bar + + After matching all 6 digits and then failing to match "foo", the normal + action of the matcher is to try again with only 5 digits matching the + \d+ item, and then with 4, and so on, before ultimately failing. + "Atomic grouping" (a term taken from Jeffrey Friedl's book) provides + the means for specifying that once a subpattern has matched, it is not + to be re-evaluated in this way. + + If we use atomic grouping for the previous example, the matcher gives + up immediately on failing to match "foo" the first time. The notation + is a kind of special parenthesis, starting with (?> as in this example: + + (?>\d+)foo + + This kind of parenthesis "locks up" the part of the pattern it con- + tains once it has matched, and a failure further into the pattern is + prevented from backtracking into it. Backtracking past it to previous + items, however, works as normal. + + An alternative description is that a subpattern of this type matches + the string of characters that an identical standalone pattern would + match, if anchored at the current point in the subject string. + + Atomic grouping subpatterns are not capturing subpatterns. Simple cases + such as the above example can be thought of as a maximizing repeat that + must swallow everything it can. So, while both \d+ and \d+? are pre- + pared to adjust the number of digits they match in order to make the + rest of the pattern match, (?>\d+) can only match an entire sequence of + digits. + + Atomic groups in general can of course contain arbitrarily complicated + subpatterns, and can be nested. However, when the subpattern for an + atomic group is just a single repeated item, as in the example above, a + simpler notation, called a "possessive quantifier" can be used. This + consists of an additional + character following a quantifier. Using + this notation, the previous example can be rewritten as + + \d++foo + + Possessive quantifiers are always greedy; the setting of the + PCRE_UNGREEDY option is ignored. They are a convenient notation for the + simpler forms of atomic group. However, there is no difference in the + meaning of a possessive quantifier and the equivalent atomic group, + though there may be a performance difference; possessive quantifiers + should be slightly faster. + + The possessive quantifier syntax is an extension to the Perl 5.8 syn- + tax. Jeffrey Friedl originated the idea (and the name) in the first + edition of his book. Mike McCloskey liked it, so implemented it when he + built Sun's Java package, and PCRE copied it from there. It ultimately + found its way into Perl at release 5.10. + + PCRE has an optimization that automatically "possessifies" certain sim- + ple pattern constructs. For example, the sequence A+B is treated as + A++B because there is no point in backtracking into a sequence of A's + when B must follow. + + When a pattern contains an unlimited repeat inside a subpattern that + can itself be repeated an unlimited number of times, the use of an + atomic group is the only way to avoid some failing matches taking a + very long time indeed. The pattern + + (\D+|<\d+>)*[!?] + + matches an unlimited number of substrings that either consist of non- + digits, or digits enclosed in <>, followed by either ! or ?. When it + matches, it runs quickly. However, if it is applied to + + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + + it takes a long time before reporting failure. This is because the + string can be divided between the internal \D+ repeat and the external + * repeat in a large number of ways, and all have to be tried. (The + example uses [!?] rather than a single character at the end, because + both PCRE and Perl have an optimization that allows for fast failure + when a single character is used. They remember the last single charac- + ter that is required for a match, and fail early if it is not present + in the string.) If the pattern is changed so that it uses an atomic + group, like this: + + ((?>\D+)|<\d+>)*[!?] + + sequences of non-digits cannot be broken, and failure happens quickly. + + +BACK REFERENCES + + Outside a character class, a backslash followed by a digit greater than + 0 (and possibly further digits) is a back reference to a capturing sub- + pattern earlier (that is, to its left) in the pattern, provided there + have been that many previous capturing left parentheses. + + However, if the decimal number following the backslash is less than 10, + it is always taken as a back reference, and causes an error only if + there are not that many capturing left parentheses in the entire pat- + tern. In other words, the parentheses that are referenced need not be + to the left of the reference for numbers less than 10. A "forward back + reference" of this type can make sense when a repetition is involved + and the subpattern to the right has participated in an earlier itera- + tion. + + It is not possible to have a numerical "forward back reference" to a + subpattern whose number is 10 or more using this syntax because a + sequence such as \50 is interpreted as a character defined in octal. + See the subsection entitled "Non-printing characters" above for further + details of the handling of digits following a backslash. There is no + such problem when named parentheses are used. A back reference to any + subpattern is possible using named parentheses (see below). + + Another way of avoiding the ambiguity inherent in the use of digits + following a backslash is to use the \g escape sequence, which is a fea- + ture introduced in Perl 5.10. This escape must be followed by a posi- + tive or a negative number, optionally enclosed in braces. These exam- + ples are all identical: + + (ring), \1 + (ring), \g1 + (ring), \g{1} + + A positive number specifies an absolute reference without the ambiguity + that is present in the older syntax. It is also useful when literal + digits follow the reference. A negative number is a relative reference. + Consider this example: + + (abc(def)ghi)\g{-1} + + The sequence \g{-1} is a reference to the most recently started captur- + ing subpattern before \g, that is, is it equivalent to \2. Similarly, + \g{-2} would be equivalent to \1. The use of relative references can be + helpful in long patterns, and also in patterns that are created by + joining together fragments that contain references within themselves. + + A back reference matches whatever actually matched the capturing sub- + pattern in the current subject string, rather than anything matching + the subpattern itself (see "Subpatterns as subroutines" below for a way + of doing that). So the pattern + + (sens|respons)e and \1ibility + + matches "sense and sensibility" and "response and responsibility", but + not "sense and responsibility". If caseful matching is in force at the + time of the back reference, the case of letters is relevant. For exam- + ple, + + ((?i)rah)\s+\1 + + matches "rah rah" and "RAH RAH", but not "RAH rah", even though the + original capturing subpattern is matched caselessly. + + Back references to named subpatterns use the Perl syntax \k or + \k'name' or the Python syntax (?P=name). We could rewrite the above + example in either of the following ways: + + (?(?i)rah)\s+\k + (?P(?i)rah)\s+(?P=p1) + + A subpattern that is referenced by name may appear in the pattern + before or after the reference. + + There may be more than one back reference to the same subpattern. If a + subpattern has not actually been used in a particular match, any back + references to it always fail. For example, the pattern + + (a|(bc))\2 + + always fails if it starts to match "a" rather than "bc". Because there + may be many capturing parentheses in a pattern, all digits following + the backslash are taken as part of a potential back reference number. + If the pattern continues with a digit character, some delimiter must be + used to terminate the back reference. If the PCRE_EXTENDED option is + set, this can be whitespace. Otherwise an empty comment (see "Com- + ments" below) can be used. + + A back reference that occurs inside the parentheses to which it refers + fails when the subpattern is first used, so, for example, (a\1) never + matches. However, such references can be useful inside repeated sub- + patterns. For example, the pattern + + (a|b\1)+ + + matches any number of "a"s and also "aba", "ababbaa" etc. At each iter- + ation of the subpattern, the back reference matches the character + string corresponding to the previous iteration. In order for this to + work, the pattern must be such that the first iteration does not need + to match the back reference. This can be done using alternation, as in + the example above, or by a quantifier with a minimum of zero. + + +ASSERTIONS + + An assertion is a test on the characters following or preceding the + current matching point that does not actually consume any characters. + The simple assertions coded as \b, \B, \A, \G, \Z, \z, ^ and $ are + described above. + + More complicated assertions are coded as subpatterns. There are two + kinds: those that look ahead of the current position in the subject + string, and those that look behind it. An assertion subpattern is + matched in the normal way, except that it does not cause the current + matching position to be changed. + + Assertion subpatterns are not capturing subpatterns, and may not be + repeated, because it makes no sense to assert the same thing several + times. If any kind of assertion contains capturing subpatterns within + it, these are counted for the purposes of numbering the capturing sub- + patterns in the whole pattern. However, substring capturing is carried + out only for positive assertions, because it does not make sense for + negative assertions. + + Lookahead assertions + + Lookahead assertions start with (?= for positive assertions and (?! for + negative assertions. For example, + + \w+(?=;) + + matches a word followed by a semicolon, but does not include the semi- + colon in the match, and + + foo(?!bar) + + matches any occurrence of "foo" that is not followed by "bar". Note + that the apparently similar pattern + + (?!foo)bar + + does not find an occurrence of "bar" that is preceded by something + other than "foo"; it finds any occurrence of "bar" whatsoever, because + the assertion (?!foo) is always true when the next three characters are + "bar". A lookbehind assertion is needed to achieve the other effect. + + If you want to force a matching failure at some point in a pattern, the + most convenient way to do it is with (?!) because an empty string + always matches, so an assertion that requires there not to be an empty + string must always fail. + + Lookbehind assertions + + Lookbehind assertions start with (?<= for positive assertions and (?)...) or (?('name')...) to test for a + used subpattern by name. For compatibility with earlier versions of + PCRE, which had this facility before Perl, the syntax (?(name)...) is + also recognized. However, there is a possible ambiguity with this syn- + tax, because subpattern names may consist entirely of digits. PCRE + looks first for a named subpattern; if it cannot find one and the name + consists entirely of digits, PCRE looks for a subpattern of that num- + ber, which must be greater than zero. Using subpattern names that con- + sist entirely of digits is not recommended. + + Rewriting the above example to use a named subpattern gives this: + + (? \( )? [^()]+ (?() \) ) + + + Checking for pattern recursion + + If the condition is the string (R), and there is no subpattern with the + name R, the condition is true if a recursive call to the whole pattern + or any subpattern has been made. If digits or a name preceded by amper- + sand follow the letter R, for example: + + (?(R3)...) or (?(R&name)...) + + the condition is true if the most recent recursion is into the subpat- + tern whose number or name is given. This condition does not check the + entire recursion stack. + + At "top level", all these recursion test conditions are false. Recur- + sive patterns are described below. + + Defining subpatterns for use by reference only + + If the condition is the string (DEFINE), and there is no subpattern + with the name DEFINE, the condition is always false. In this case, + there may be only one alternative in the subpattern. It is always + skipped if control reaches this point in the pattern; the idea of + DEFINE is that it can be used to define "subroutines" that can be ref- + erenced from elsewhere. (The use of "subroutines" is described below.) + For example, a pattern to match an IPv4 address could be written like + this (ignore whitespace and line breaks): + + (?(DEFINE) (? 2[0-4]\d | 25[0-5] | 1\d\d | [1-9]?\d) ) + \b (?&byte) (\.(?&byte)){3} \b + + The first part of the pattern is a DEFINE group inside which a another + group named "byte" is defined. This matches an individual component of + an IPv4 address (a number less than 256). When matching takes place, + this part of the pattern is skipped because DEFINE acts like a false + condition. + + The rest of the pattern uses references to the named group to match the + four dot-separated components of an IPv4 address, insisting on a word + boundary at each end. + + Assertion conditions + + If the condition is not in any of the above formats, it must be an + assertion. This may be a positive or negative lookahead or lookbehind + assertion. Consider this pattern, again containing non-significant + white space, and with the two alternatives on the second line: + + (?(?=[^a-z]*[a-z]) + \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) + + The condition is a positive lookahead assertion that matches an + optional sequence of non-letters followed by a letter. In other words, + it tests for the presence of at least one letter in the subject. If a + letter is found, the subject is matched against the first alternative; + otherwise it is matched against the second. This pattern matches + strings in one of the two forms dd-aaa-dd or dd-dd-dd, where aaa are + letters and dd are digits. + + +COMMENTS + + The sequence (?# marks the start of a comment that continues up to the + next closing parenthesis. Nested parentheses are not permitted. The + characters that make up a comment play no part in the pattern matching + at all. + + If the PCRE_EXTENDED option is set, an unescaped # character outside a + character class introduces a comment that continues to immediately + after the next newline in the pattern. + + +RECURSIVE PATTERNS + + Consider the problem of matching a string in parentheses, allowing for + unlimited nested parentheses. Without the use of recursion, the best + that can be done is to use a pattern that matches up to some fixed + depth of nesting. It is not possible to handle an arbitrary nesting + depth. + + For some time, Perl has provided a facility that allows regular expres- + sions to recurse (amongst other things). It does this by interpolating + Perl code in the expression at run time, and the code can refer to the + expression itself. A Perl pattern using code interpolation to solve the + parentheses problem can be created like this: + + $re = qr{\( (?: (?>[^()]+) | (?p{$re}) )* \)}x; + + The (?p{...}) item interpolates Perl code at run time, and in this case + refers recursively to the pattern in which it appears. + + Obviously, PCRE cannot support the interpolation of Perl code. Instead, + it supports special syntax for recursion of the entire pattern, and + also for individual subpattern recursion. After its introduction in + PCRE and Python, this kind of recursion was introduced into Perl at + release 5.10. + + A special item that consists of (? followed by a number greater than + zero and a closing parenthesis is a recursive call of the subpattern of + the given number, provided that it occurs inside that subpattern. (If + not, it is a "subroutine" call, which is described in the next sec- + tion.) The special item (?R) or (?0) is a recursive call of the entire + regular expression. + + In PCRE (like Python, but unlike Perl), a recursive subpattern call is + always treated as an atomic group. That is, once it has matched some of + the subject string, it is never re-entered, even if it contains untried + alternatives and there is a subsequent matching failure. + + This PCRE pattern solves the nested parentheses problem (assume the + PCRE_EXTENDED option is set so that white space is ignored): + + \( ( (?>[^()]+) | (?R) )* \) + + First it matches an opening parenthesis. Then it matches any number of + substrings which can either be a sequence of non-parentheses, or a + recursive match of the pattern itself (that is, a correctly parenthe- + sized substring). Finally there is a closing parenthesis. + + If this were part of a larger pattern, you would not want to recurse + the entire pattern, so instead you could use this: + + ( \( ( (?>[^()]+) | (?1) )* \) ) + + We have put the pattern into parentheses, and caused the recursion to + refer to them instead of the whole pattern. In a larger pattern, keep- + ing track of parenthesis numbers can be tricky. It may be more conve- + nient to use named parentheses instead. The Perl syntax for this is + (?&name); PCRE's earlier syntax (?P>name) is also supported. We could + rewrite the above example as follows: + + (? \( ( (?>[^()]+) | (?&pn) )* \) ) + + If there is more than one subpattern with the same name, the earliest + one is used. This particular example pattern contains nested unlimited + repeats, and so the use of atomic grouping for matching strings of non- + parentheses is important when applying the pattern to strings that do + not match. For example, when this pattern is applied to + + (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa() + + it yields "no match" quickly. However, if atomic grouping is not used, + the match runs for a very long time indeed because there are so many + different ways the + and * repeats can carve up the subject, and all + have to be tested before failure can be reported. + + At the end of a match, the values set for any capturing subpatterns are + those from the outermost level of the recursion at which the subpattern + value is set. If you want to obtain intermediate values, a callout + function can be used (see below and the pcrecallout documentation). If + the pattern above is matched against + + (ab(cd)ef) + + the value for the capturing parentheses is "ef", which is the last + value taken on at the top level. If additional parentheses are added, + giving + + \( ( ( (?>[^()]+) | (?R) )* ) \) + ^ ^ + ^ ^ + + the string they capture is "ab(cd)ef", the contents of the top level + parentheses. If there are more than 15 capturing parentheses in a pat- + tern, PCRE has to obtain extra memory to store data during a recursion, + which it does by using pcre_malloc, freeing it via pcre_free after- + wards. If no memory can be obtained, the match fails with the + PCRE_ERROR_NOMEMORY error. + + Do not confuse the (?R) item with the condition (R), which tests for + recursion. Consider this pattern, which matches text in angle brack- + ets, allowing for arbitrary nesting. Only digits are allowed in nested + brackets (that is, when recursing), whereas any characters are permit- + ted at the outer level. + + < (?: (?(R) \d++ | [^<>]*+) | (?R)) * > + + In this pattern, (?(R) is the start of a conditional subpattern, with + two different alternatives for the recursive and non-recursive cases. + The (?R) item is the actual recursive call. + + +SUBPATTERNS AS SUBROUTINES + + If the syntax for a recursive subpattern reference (either by number or + by name) is used outside the parentheses to which it refers, it oper- + ates like a subroutine in a programming language. The "called" subpat- + tern may be defined before or after the reference. An earlier example + pointed out that the pattern + + (sens|respons)e and \1ibility + + matches "sense and sensibility" and "response and responsibility", but + not "sense and responsibility". If instead the pattern + + (sens|respons)e and (?1)ibility + + is used, it does match "sense and responsibility" as well as the other + two strings. Another example is given in the discussion of DEFINE + above. + + Like recursive subpatterns, a "subroutine" call is always treated as an + atomic group. That is, once it has matched some of the subject string, + it is never re-entered, even if it contains untried alternatives and + there is a subsequent matching failure. + + When a subpattern is used as a subroutine, processing options such as + case-independence are fixed when the subpattern is defined. They cannot + be changed for different calls. For example, consider this pattern: + + (abc)(?i:(?1)) + + It matches "abcabc". It does not match "abcABC" because the change of + processing option does not affect the called subpattern. + + +CALLOUTS + + Perl has a feature whereby using the sequence (?{...}) causes arbitrary + Perl code to be obeyed in the middle of matching a regular expression. + This makes it possible, amongst other things, to extract different sub- + strings that match the same pair of parentheses when there is a repeti- + tion. + + PCRE provides a similar feature, but of course it cannot obey arbitrary + Perl code. The feature is called "callout". The caller of PCRE provides + an external function by putting its entry point in the global variable + pcre_callout. By default, this variable contains NULL, which disables + all calling out. + + Within a regular expression, (?C) indicates the points at which the + external function is to be called. If you want to identify different + callout points, you can put a number less than 256 after the letter C. + The default value is zero. For example, this pattern has two callout + points: + + (?C1)abc(?C2)def + + If the PCRE_AUTO_CALLOUT flag is passed to pcre_compile(), callouts are + automatically installed before each item in the pattern. They are all + numbered 255. + + During matching, when PCRE reaches a callout point (and pcre_callout is + set), the external function is called. It is provided with the number + of the callout, the position in the pattern, and, optionally, one item + of data originally supplied by the caller of pcre_exec(). The callout + function may cause matching to proceed, to backtrack, or to fail alto- + gether. A complete description of the interface to the callout function + is given in the pcrecallout documentation. + + +Last updated: 14 December 2009 +Copyright (c) 1997-2006 University of Cambridge. + +------------------- + +PCRE REGULAR EXPRESSION SYNTAX SUMMARY + + The full syntax and semantics of the regular expressions that are sup- + ported by PCRE are described in the pcrepattern documentation. This + document contains just a quick-reference summary of the syntax. + + +QUOTING + + \x where x is non-alphanumeric is a literal x + \Q...\E treat enclosed characters as literal + + +CHARACTERS + + \a alarm, that is, the BEL character (hex 07) + \cx "control-x", where x is any character + \e escape (hex 1B) + \f formfeed (hex 0C) + \n newline (hex 0A) + \r carriage return (hex 0D) + \t tab (hex 09) + \ddd character with octal code ddd, or backreference + \xhh character with hex code hh + \x{hhh..} character with hex code hhh.. + + +CHARACTER TYPES + + . any character except newline; + in dotall mode, any character whatsoever + \C one byte, even in UTF-8 mode (best avoided) + \d a decimal digit + \D a character that is not a decimal digit + \h a horizontal whitespace character + \H a character that is not a horizontal whitespace character + \p{xx} a character with the xx property + \P{xx} a character without the xx property + \R a newline sequence + \s a whitespace character + \S a character that is not a whitespace character + \v a vertical whitespace character + \V a character that is not a vertical whitespace character + \w a "word" character + \W a "non-word" character + \X an extended Unicode sequence + + In PCRE, \d, \D, \s, \S, \w, and \W recognize only ASCII characters. + + +GENERAL CATEGORY PROPERTY CODES FOR \p and \P + + C Other + Cc Control + Cf Format + Cn Unassigned + Co Private use + Cs Surrogate + + L Letter + Ll Lower case letter + Lm Modifier letter + Lo Other letter + Lt Title case letter + Lu Upper case letter + L& Ll, Lu, or Lt + + M Mark + Mc Spacing mark + Me Enclosing mark + Mn Non-spacing mark + + N Number + Nd Decimal number + Nl Letter number + No Other number + + P Punctuation + Pc Connector punctuation + Pd Dash punctuation + Pe Close punctuation + Pf Final punctuation + Pi Initial punctuation + Po Other punctuation + Ps Open punctuation + + S Symbol + Sc Currency symbol + Sk Modifier symbol + Sm Mathematical symbol + So Other symbol + + Z Separator + Zl Line separator + Zp Paragraph separator + Zs Space separator + + +SCRIPT NAMES FOR \p AND \P + + Arabic, Armenian, Balinese, Bengali, Bopomofo, Braille, Buginese, + Buhid, Canadian_Aboriginal, Carian, Cham, Cherokee, Common, Coptic, Cu- + neiform, Cypriot, Cyrillic, Deseret, Devanagari, Ethiopic, Georgian, + Glagolitic, Gothic, Greek, Gujarati, Gurmukhi, Han, Hangul, Hanunoo, + Hebrew, Hiragana, Inherited, Kannada, Katakana, Kayah_Li, Kharoshthi, + Khmer, Lao, Latin, Lepcha, Limbu, Linear_B, Lycian, Lydian, Malayalam, + Mongolian, Myanmar, New_Tai_Lue, Nko, Ogham, Old_Italic, Old_Persian, + Ol_Chiki, Oriya, Osmanya, Phags_Pa, Phoenician, Rejang, Runic, Saurash- + tra, Shavian, Sinhala, Sudanese, Syloti_Nagri, Syriac, Tagalog, Tag- + banwa, Tai_Le, Tamil, Telugu, Thaana, Thai, Tibetan, Tifinagh, + Ugaritic, Vai, Yi. + + +CHARACTER CLASSES + + [...] positive character class + [^...] negative character class + [x-y] range (can be used for hex characters) + [[:xxx:]] positive POSIX named set + [[:^xxx:]] negative POSIX named set + + alnum alphanumeric + alpha alphabetic + ascii 0-127 + blank space or tab + cntrl control character + digit decimal digit + graph printing, excluding space + lower lower case letter + print printing, including space + punct printing, excluding alphanumeric + space whitespace + upper upper case letter + word same as \w + xdigit hexadecimal digit + + In PCRE, POSIX character set names recognize only ASCII characters. You + can use \Q...\E inside a character class. + + +QUANTIFIERS + + ? 0 or 1, greedy + ?+ 0 or 1, possessive + ?? 0 or 1, lazy + * 0 or more, greedy + *+ 0 or more, possessive + *? 0 or more, lazy + + 1 or more, greedy + ++ 1 or more, possessive + +? 1 or more, lazy + {n} exactly n + {n,m} at least n, no more than m, greedy + {n,m}+ at least n, no more than m, possessive + {n,m}? at least n, no more than m, lazy + {n,} n or more, greedy + {n,}+ n or more, possessive + {n,}? n or more, lazy + + +ANCHORS AND SIMPLE ASSERTIONS + + \b word boundary (only ASCII letters recognized) + \B not a word boundary + ^ start of subject + also after internal newline in multiline mode + \A start of subject + $ end of subject + also before newline at end of subject + also before internal newline in multiline mode + \Z end of subject + also before newline at end of subject + \z end of subject + \G first matching position in subject + + +MATCH POINT RESET + + \K reset start of match + + +ALTERNATION + + expr|expr|expr... + + +CAPTURING + + (...) capturing group + (?...) named capturing group (Perl) + (?'name'...) named capturing group (Perl) + (?P...) named capturing group (Python) + (?:...) non-capturing group + (?|...) non-capturing group; reset group numbers for + capturing groups in each alternative + + +ATOMIC GROUPS + + (?>...) atomic, non-capturing group + + +COMMENT + + (?#....) comment (not nestable) + + +OPTION SETTING + + (?i) caseless + (?J) allow duplicate names + (?m) multiline + (?s) single line (dotall) + (?U) default ungreedy (lazy) + (?x) extended (ignore white space) + (?-...) unset option(s) + + The following is recognized only at the start of a pattern or after one + of the newline-setting options with similar syntax: + + (*UTF8) set UTF-8 mode + + +LOOKAHEAD AND LOOKBEHIND ASSERTIONS + + (?=...) positive look ahead + (?!...) negative look ahead + (?<=...) positive look behind + (? reference by name (Perl) + \k'name' reference by name (Perl) + \g{name} reference by name (Perl) + \k{name} reference by name (.NET) + (?P=name) reference by name (Python) + + +SUBROUTINE REFERENCES (POSSIBLY RECURSIVE) + + (?R) recurse whole pattern + (?n) call subpattern by absolute number + (?+n) call subpattern by relative number + (?-n) call subpattern by relative number + (?&name) call subpattern by name (Perl) + (?P>name) call subpattern by name (Python) + \g call subpattern by name (Oniguruma) + \g'name' call subpattern by name (Oniguruma) + \g call subpattern by absolute number (Oniguruma) + \g'n' call subpattern by absolute number (Oniguruma) + \g<+n> call subpattern by relative number (PCRE extension) + \g'+n' call subpattern by relative number (PCRE extension) + \g<-n> call subpattern by relative number (PCRE extension) + \g'-n' call subpattern by relative number (PCRE extension) + + +CONDITIONAL PATTERNS + + (?(condition)yes-pattern) + (?(condition)yes-pattern|no-pattern) + + (?(n)... absolute reference condition + (?(+n)... relative reference condition + (?(-n)... relative reference condition + (?()... named reference condition (Perl) + (?('name')... named reference condition (Perl) + (?(name)... named reference condition (PCRE) + (?(R)... overall recursion condition + (?(Rn)... specific group recursion condition + (?(R&name)... specific recursion condition + (?(DEFINE)... define subpattern for reference + (?(assert)... assertion condition + + +BACKTRACKING CONTROL + + The following act immediately they are reached: + + (*ACCEPT) force successful match + (*FAIL) force backtrack; synonym (*F) + + The following act only when a subsequent match failure causes a back- + track to reach them. They all force a match failure, but they differ in + what happens afterwards. Those that advance the start-of-match point do + so only if the pattern is not anchored. + + (*COMMIT) overall failure, no advance of starting point + (*PRUNE) advance to next starting character + (*SKIP) advance start to current matching position + (*THEN) local failure, backtrack to next alternation + + +NEWLINE CONVENTIONS + + These are recognized only at the very start of the pattern or after a + (*BSR_...) or (*UTF8) option. + + (*CR) carriage return only + (*LF) linefeed only + (*CRLF) carriage return followed by linefeed + (*ANYCRLF) all three of the above + (*ANY) any Unicode newline sequence + + +WHAT \R MATCHES + + These are recognized only at the very start of the pattern or after a + (*...) option that sets the newline convention or UTF-8 mode. + + (*BSR_ANYCRLF) CR, LF, or CRLF + (*BSR_UNICODE) any Unicode newline sequence + + +CALLOUTS + + (?C) callout + (?Cn) callout with data n + + diff --git a/cosmic rage/docs/gpl.txt b/cosmic rage/docs/gpl.txt new file mode 100644 index 0000000..d511905 --- /dev/null +++ b/cosmic rage/docs/gpl.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/cosmic rage/docs/lpeg-128.gif b/cosmic rage/docs/lpeg-128.gif new file mode 100644 index 0000000..bbf5e78 Binary files /dev/null and b/cosmic rage/docs/lpeg-128.gif differ diff --git a/cosmic rage/docs/lpeg.html b/cosmic rage/docs/lpeg.html new file mode 100644 index 0000000..9e7ff39 --- /dev/null +++ b/cosmic rage/docs/lpeg.html @@ -0,0 +1,1423 @@ + + + + LPeg - Parsing Expression Grammars For Lua + + + + + + + +
+ +
+ +
LPeg
+
+ Parsing Expression Grammars For Lua, version 0.10 +
+
+ +
+ + + +
+ + +

Introduction

+ +

+LPeg is a new pattern-matching library for Lua, +based on + +Parsing Expression Grammars (PEGs). +This text is a reference manual for the library. +For a more formal treatment of LPeg, +as well as some discussion about its implementation, +see + +A Text Pattern-Matching Tool based on Parsing Expression Grammars. +(You may also be interested in my +talk about LPeg +given at the III Lua Workshop.) +

+ +

+Following the Snobol tradition, +LPeg defines patterns as first-class objects. +That is, patterns are regular Lua values +(represented by userdata). +The library offers several functions to create +and compose patterns. +With the use of metamethods, +several of these functions are provided as infix or prefix +operators. +On the one hand, +the result is usually much more verbose than the typical +encoding of patterns using the so called +regular expressions +(which typically are not regular expressions in the formal sense). +On the other hand, +first-class patterns allow much better documentation +(as it is easy to comment the code, +to break complex definitions in smaller parts, etc.) +and are extensible, +as we can define new functions to create and compose patterns. +

+ +

+For a quick glance of the library, +the following table summarizes its basic operations +for creating patterns: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
OperatorDescription
lpeg.P(string)Matches string literally
lpeg.P(n)Matches exactly n characters
lpeg.S(string)Matches any character in string (Set)
lpeg.R("xy")Matches any character between x and y (Range)
patt^nMatches at least n repetitions of patt
patt^-nMatches at most n repetitions of patt
patt1 * patt2Matches patt1 followed by patt2
patt1 + patt2Matches patt1 or patt2 + (ordered choice)
patt1 - patt2Matches patt1 if patt2 does not match
-pattEquivalent to ("" - patt)
#pattMatches patt but consumes no input
lpeg.B(patt, n)Matches patt n characters behind + the current position, consuming no input
+ +

As a very simple example, +lpeg.R("09")^1 creates a pattern that +matches a non-empty sequence of digits. +As a not so simple example, +-lpeg.P(1) +(which can be written as lpeg.P(-1) +or simply -1 for operations expecting a pattern) +matches an empty string only if it cannot match a single character; +so, it succeeds only at the subject's end. +

+ +

+LPeg also offers the re module, +which implements patterns following a regular-expression style +(e.g., [09]+). +(This module is 250 lines of Lua code, +and of course uses LPeg to parse regular expressions and +translate them to regular LPeg patterns.) +

+ + +

Functions

+ + +

lpeg.match (pattern, subject [, init])

+

+The matching function. +It attempts to match the given pattern against the subject string. +If the match succeeds, +returns the index in the subject of the first character after the match, +or the captured values +(if the pattern captured any value). +

+ +

+An optional numeric argument init makes the match +starts at that position in the subject string. +As usual in Lua libraries, +a negative value counts from the end. +

+ +

+Unlike typical pattern-matching functions, +match works only in anchored mode; +that is, it tries to match the pattern with a prefix of +the given subject string (at position init), +not with an arbitrary substring of the subject. +So, if we want to find a pattern anywhere in a string, +we must either write a loop in Lua or write a pattern that +matches anywhere. +This second approach is easy and quite efficient; +see examples. +

+ +

lpeg.type (value)

+

+If the given value is a pattern, +returns the string "pattern". +Otherwise returns nil. +

+ +

lpeg.version ()

+

+Returns a string with the running version of LPeg. +

+ +

lpeg.setmaxstack (max)

+

+Sets the maximum size for the backtrack stack used by LPeg to +track calls and choices. +Most well-written patterns need little backtrack levels and +therefore you seldom need to change this maximum; +but a few useful patterns may need more space. +Before changing this maximum you should try to rewrite your +pattern to avoid the need for extra space. +

+ + +

Basic Constructions

+ +

+The following operations build patterns. +All operations that expect a pattern as an argument +may receive also strings, tables, numbers, booleans, or functions, +which are translated to patterns according to +the rules of function lpeg.P. +

+ + + +

lpeg.P (value)

+

+Converts the given value into a proper pattern, +according to the following rules: +

+
    + +
  • +If the argument is a pattern, +it is returned unmodified. +

  • + +
  • +If the argument is a string, +it is translated to a pattern that matches literally the string. +

  • + +
  • +If the argument is a non-negative number n, +the result is a pattern that matches exactly n characters. +

  • + +
  • +If the argument is a negative number -n, +the result is a pattern that +succeeds only if the input string does not have n characters: +lpeg.P(-n) +is equivalent to -lpeg.P(n) +(see the unary minus operation). +

  • + +
  • +If the argument is a boolean, +the result is a pattern that always succeeds or always fails +(according to the boolean value), +without consuming any input. +

  • + +
  • +If the argument is a table, +it is interpreted as a grammar +(see Grammars). +

  • + +
  • +If the argument is a function, +returns a pattern equivalent to a +match-time capture over the empty string. +

  • + +
+ + +

lpeg.B(patt [, n])

+

+Returns a pattern that +matches only if the input string matches patt +starting n positions behind the current position. +(The default value for n is 1.) +If the current position is less than or equal to n, +this pattern fails. +

+ +

+Like the and predicate, +this pattern never consumes any input, +independently of success or failure, +and it never produces any capture. +

+ +

+The pattern patt cannot contain any open reference +to grammar rules (see grammars). +

+ +

+(This is an experimental feature. +There is a good chance it will change in future versions.) +

+ + +

lpeg.R ({range})

+

+Returns a pattern that matches any single character +belonging to one of the given ranges. +Each range is a string xy of length 2, +representing all characters with code +between the codes of x and y +(both inclusive). +

+ +

+As an example, the pattern +lpeg.R("09") matches any digit, +and lpeg.R("az", "AZ") matches any ASCII letter. +

+ + +

lpeg.S (string)

+

+Returns a pattern that matches any single character that +appears in the given string. +(The S stands for Set.) +

+ +

+As an example, the pattern +lpeg.S("+-*/") matches any arithmetic operator. +

+ +

+Note that, if s is a character +(that is, a string of length 1), +then lpeg.P(s) is equivalent to lpeg.S(s) +which is equivalent to lpeg.R(s..s). +Note also that both lpeg.S("") and lpeg.R() +are patterns that always fail. +

+ + +

lpeg.V (v)

+

+This operation creates a non-terminal (a variable) +for a grammar. +The created non-terminal refers to the rule indexed by v +in the enclosing grammar. +(See Grammars for details.) +

+ + +

lpeg.locale ([table])

+

+Returns a table with patterns for matching some character classes +according to the current locale. +The table has fields named +alnum, +alpha, +cntrl, +digit, +graph, +lower, +print, +punct, +space, +upper, and +xdigit, +each one containing a correspondent pattern. +Each pattern matches any single character that belongs to its class. +

+ +

+If called with an argument table, +then it creates those fields inside the given table and +returns that table. +

+ + +

#patt

+

+Returns a pattern that +matches only if the input string matches patt, +but without consuming any input, +independently of success or failure. +(This pattern is called an and predicate +and it is equivalent to +&patt in the original PEG notation.) +

+ + +

+This pattern never produces any capture. +

. + + +

-patt

+

+Returns a pattern that +matches only if the input string does not match patt. +It does not consume any input, +independently of success or failure. +(This pattern is equivalent to +!patt in the original PEG notation.) +

+ +

+As an example, the pattern +-lpeg.P(1) matches only the end of string. +

+ +

+This pattern never produces any captures, +because either patt fails +or -patt fails. +(A failing pattern never produces captures.) +

+ + +

patt1 + patt2

+

+Returns a pattern equivalent to an ordered choice +of patt1 and patt2. +(This is denoted by patt1 / patt2 in the original PEG notation, +not to be confused with the / operation in LPeg.) +It matches either patt1 or patt2, +with no backtracking once one of them succeeds. +The identity element for this operation is the pattern +lpeg.P(false), +which always fails. +

+ +

+If both patt1 and patt2 are +character sets, +this operation is equivalent to set union. +

+
+lower = lpeg.R("az")
+upper = lpeg.R("AZ")
+letter = lower + upper
+
+ + +

patt1 - patt2

+

+Returns a pattern equivalent to !patt2 patt1. +This pattern asserts that the input does not match +patt2 and then matches patt1. +

+ +

+When succeeded, +this pattern produces all captures from patt1. +It never produces any capture from patt2 +(as either patt2 fails or +patt1 - patt2 fails). +

+ +

+If both patt1 and patt2 are +character sets, +this operation is equivalent to set difference. +Note that -patt is equivalent to "" - patt +(or 0 - patt). +If patt is a character set, +1 - patt is its complement. +

+ + +

patt1 * patt2

+

+Returns a pattern that matches patt1 +and then matches patt2, +starting where patt1 finished. +The identity element for this operation is the +pattern lpeg.P(true), +which always succeeds. +

+ +

+(LPeg uses the * operator +[instead of the more obvious ..] +both because it has +the right priority and because in formal languages it is +common to use a dot for denoting concatenation.) +

+ + +

patt^n

+

+If n is nonnegative, +this pattern is +equivalent to pattn patt*. +It matches at least n occurrences of patt. +

+ +

+Otherwise, when n is negative, +this pattern is equivalent to (patt?)-n. +That is, it matches at most |n| +occurrences of patt. +

+ +

+In particular, patt^0 is equivalent to patt*, +patt^1 is equivalent to patt+, +and patt^-1 is equivalent to patt? +in the original PEG notation. +

+ +

+In all cases, +the resulting pattern is greedy with no backtracking +(also called a possessive repetition). +That is, it matches only the longest possible sequence +of matches for patt. +

+ + + +

Grammars

+ +

+With the use of Lua variables, +it is possible to define patterns incrementally, +with each new pattern using previously defined ones. +However, this technique does not allow the definition of +recursive patterns. +For recursive patterns, +we need real grammars. +

+ +

+LPeg represents grammars with tables, +where each entry is a rule. +

+ +

+The call lpeg.V(v) +creates a pattern that represents the nonterminal +(or variable) with index v in a grammar. +Because the grammar still does not exist when +this function is evaluated, +the result is an open reference to the respective rule. +

+ +

+A table is fixed when it is converted to a pattern +(either by calling lpeg.P or by using it wherein a +pattern is expected). +Then every open reference created by lpeg.V(v) +is corrected to refer to the rule indexed by v in the table. +

+ +

+When a table is fixed, +the result is a pattern that matches its initial rule. +The entry with index 1 in the table defines its initial rule. +If that entry is a string, +it is assumed to be the name of the initial rule. +Otherwise, LPeg assumes that the entry 1 itself is the initial rule. +

+ +

+As an example, +the following grammar matches strings of a's and b's that +have the same number of a's and b's: +

+
+equalcount = lpeg.P{
+  "S";   -- initial rule name
+  S = "a" * lpeg.V"B" + "b" * lpeg.V"A" + "",
+  A = "a" * lpeg.V"S" + "b" * lpeg.V"A" * lpeg.V"A",
+  B = "b" * lpeg.V"S" + "a" * lpeg.V"B" * lpeg.V"B",
+} * -1
+
+

+It is equivalent to the following grammar in standard PEG notation: +

+
+  S <- 'a' B / 'b' A / ''
+  A <- 'a' S / 'b' A A
+  B <- 'b' S / 'a' B B
+
+ + +

Captures

+ +

+A capture is a pattern that creates values +(the so called semantic information) when it matches. +LPeg offers several kinds of captures, +which produces values based on matches and combine these values to +produce new values. +Each capture may produce zero or more values. +

+ +

+The following table summarizes the basic captures: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OperationWhat it Produces
lpeg.C(patt)the match for patt plus all captures + made by patt
lpeg.Carg(n)the value of the nth extra argument to + lpeg.match (matches the empty string)
lpeg.Cb(name)the values produced by the previous + group capture named name + (matches the empty string)
lpeg.Cc(values)the given values (matches the empty string)
lpeg.Cf(patt, func)a folding of the captures from patt
lpeg.Cg(patt [, name])the values produced by patt, + optionally tagged with name
lpeg.Cp()the current position (matches the empty string)
lpeg.Cs(patt)the match for patt + with the values from nested captures replacing their matches
lpeg.Ct(patt)a table with all captures from patt
patt / stringstring, with some marks replaced by captures + of patt
patt / tabletable[c], where c is the (first) + capture of patt
patt / functionthe returns of function applied to the captures + of patt
lpeg.Cmt(patt, function)the returns of function applied to the captures + of patt; the application is done at match time
+ +

+A capture pattern produces its values every time it succeeds. +For instance, +a capture inside a loop produces as many values as matched by the loop. +A capture produces a value only when it succeeds. +For instance, +the pattern lpeg.C(lpeg.P"a"^-1) +produces the empty string when there is no "a" +(because the pattern "a"? succeeds), +while the pattern lpeg.C("a")^-1 +does not produce any value when there is no "a" +(because the pattern "a" fails). +

+ +

+Usually, +LPeg evaluates all captures only after (and if) the entire match succeeds. +During the match time it only gathers enough information +to produce the capture values later. +As a particularly important consequence, +most captures cannot affect the way a pattern matches a subject. +The only exception to this rule is the +so-called match-time capture. +When a match-time capture matches, +it forces the immediate evaluation of all its nested captures +and then calls its corresponding function, +which tells whether the match succeeds and also +what values are produced. +

+ +

lpeg.C (patt)

+

+Creates a simple capture, +which captures the substring of the subject that matches patt. +The captured value is a string. +If patt has other captures, +their values are returned after this one. +

+ + +

lpeg.Carg (n)

+

+Creates an argument capture. +This pattern matches the empty string and +produces the value given as the nth extra +argument given in the call to lpeg.match. +

+ + +

lpeg.Cb (name)

+

+Creates a back capture. +This pattern matches the empty string and +produces the values produced by the most recent +group capture named name. +

+ +

+Most recent means the last +complete +outermost +group capture with the given name. +A Complete capture means that the entire pattern +corresponding to the capture has matched. +An Outermost capture means that the capture is not inside +another complete capture. +

+ + +

lpeg.Cc ([value, ...])

+

+Creates a constant capture. +This pattern matches the empty string and +produces all given values as its captured values. +

+ + +

lpeg.Cf (patt, func)

+

+Creates a fold capture. +If patt produces a list of captures +C1 C2 ... Cn, +this capture will produce the value +func(...func(func(C1, C2), C3)..., + Cn), +that is, it will fold +(or accumulate, or reduce) +the captures from patt using function func. +

+ +

+This capture assumes that patt should produce +at least one capture with at least one value (of any type), +which becomes the initial value of an accumulator. +(If you need a specific initial value, +you may prefix a constant capture to patt.) +For each subsequent capture +LPeg calls func +with this accumulator as the first argument and all values produced +by the capture as extra arguments; +the value returned by this call +becomes the new value for the accumulator. +The final value of the accumulator becomes the captured value. +

+ +

+As an example, +the following pattern matches a list of numbers separated +by commas and returns their addition: +

+
+-- matches a numeral and captures its value
+number = lpeg.R"09"^1 / tonumber
+
+-- matches a list of numbers, captures their values
+list = number * ("," * number)^0
+
+-- auxiliary function to add two numbers
+function add (acc, newvalue) return acc + newvalue end
+
+-- folds the list of numbers adding them
+sum = lpeg.Cf(list, add)
+
+-- example of use
+print(sum:match("10,30,43"))   --> 83
+
+ + +

lpeg.Cg (patt [, name])

+

+Creates a group capture. +It groups all values returned by patt +into a single capture. +The group may be anonymous (if no name is given) +or named with the given name. +

+ +

+An anonymous group serves to join values from several captures into +a single capture. +A named group has a different behavior. +In most situations, a named group returns no values at all. +Its values are only relevant for a following +back capture or when used +inside a table capture. +

+ + +

lpeg.Cp ()

+

+Creates a position capture. +It matches the empty string and +captures the position in the subject where the match occurs. +The captured value is a number. +

+ + +

lpeg.Cs (patt)

+

+Creates a substitution capture, +which captures the substring of the subject that matches patt, +with substitutions. +For any capture inside patt with a value, +the substring that matched the capture is replaced by the capture value +(which should be a string). +The final captured value is the string resulting from +all replacements. +

+ + +

lpeg.Ct (patt)

+

+Creates a table capture. +This capture creates a table and puts all values from all anonymous captures +made by patt inside this table in successive integer keys, +starting at 1. +Moreover, +for each named capture group created by patt, +the first value of the group is put into the table +with the group name as its key. +The captured value is only the table. +

+ + +

patt / string

+

+Creates a string capture. +It creates a capture string based on string. +The captured value is a copy of string, +except that the character % works as an escape character: +any sequence in string of the form %n, +with n between 1 and 9, +stands for the match of the n-th capture in patt. +The sequence %0 stands for the whole match. +The sequence %% stands for a single %. + + +

patt / table

+

+Creates a query capture. +It indexes the given table using as key the first value captured by +patt, +or the whole match if patt produced no value. +The value at that index is the final value of the capture. +If the table does not have that key, +there is no captured value. +

+ + +

patt / function

+

+Creates a function capture. +It calls the given function passing all captures made by +patt as arguments, +or the whole match if patt made no capture. +The values returned by the function +are the final values of the capture. +In particular, +if function returns no value, +there is no captured value. +

+ + +

lpeg.Cmt(patt, function)

+

+Creates a match-time capture. +Unlike all other captures, +this one is evaluated immediately when a match occurs. +It forces the immediate evaluation of all its nested captures +and then calls function. +

+ +

+The given function gets as arguments the entire subject, +the current position (after the match of patt), +plus any capture values produced by patt. +

+ +

+The first value returned by function +defines how the match happens. +If the call returns a number, +the match succeeds +and the returned number becomes the new current position. +(Assuming a subject s and current position i, +the returned number must be in the range [i, len(s) + 1].) +If the call returns true, +the match succeeds without consuming any input. +(So, to return true is equivalent to return i.) +If the call returns false, nil, or no value, +the match fails. +

+ +

+Any extra values returned by the function become the +values produced by the capture. +

+ + + + +

Some Examples

+ +

Using a Pattern

+

+This example shows a very simple but complete program +that builds and uses a pattern: +

+
+local lpeg = require "lpeg"
+
+-- matches a word followed by end-of-string
+p = lpeg.R"az"^1 * -1
+
+print(p:match("hello"))        --> 6
+print(lpeg.match(p, "hello"))  --> 6
+print(p:match("1 hello"))      --> nil
+
+

+The pattern is simply a sequence of one or more lower-case letters +followed by the end of string (-1). +The program calls match both as a method +and as a function. +In both sucessful cases, +the match returns +the index of the first character after the match, +which is the string length plus one. +

+ + +

Name-value lists

+

+This example parses a list of name-value pairs and returns a table +with those pairs: +

+
+lpeg.locale(lpeg)   -- adds locale entries into 'lpeg' table
+
+local space = lpeg.space^0
+local name = lpeg.C(lpeg.alpha^1) * space
+local sep = lpeg.S(",;") * space
+local pair = lpeg.Cg(name * "=" * space * name) * sep^-1
+local list = lpeg.Cf(lpeg.Ct("") * pair^0, rawset)
+t = list:match("a=b, c = hi; next = pi")  --> { a = "b", c = "hi", next = "pi" }
+
+

+Each pair has the format name = name followed by +an optional separator (a comma or a semicolon). +The pair pattern encloses the pair in a group pattern, +so that the names become the values of a single capture. +The list pattern then folds these captures. +It starts with an empty table, +created by a table capture matching an empty string; +then for each capture (a pair of names) it applies rawset +over the accumulator (the table) and the capture values (the pair of names). +rawset returns the table itself, +so the accumulator is always the table. +

+ +

Splitting a string

+

+The following code builds a pattern that +splits a string using a given pattern +sep as a separator: +

+
+function split (s, sep)
+  sep = lpeg.P(sep)
+  local elem = lpeg.C((1 - sep)^0)
+  local p = elem * (sep * elem)^0
+  return lpeg.match(p, s)
+end
+
+

+First the function ensures that sep is a proper pattern. +The pattern elem is a repetition of zero of more +arbitrary characters as long as there is not a match against +the separator. It also captures its result. +The pattern p matches a list of elements separated +by sep. +

+ +

+If the split results in too many values, +it may overflow the maximum number of values +that can be returned by a Lua function. +In this case, +we should collect these values in a table: +

+
+function split (s, sep)
+  sep = lpeg.P(sep)
+  local elem = lpeg.C((1 - sep)^0)
+  local p = lpeg.Ct(elem * (sep * elem)^0)   -- make a table capture
+  return lpeg.match(p, s)
+end
+
+ + +

Searching for a pattern

+

+The primitive match works only in anchored mode. +If we want to find a pattern anywhere in a string, +we must write a pattern that matches anywhere. +

+ +

+Because patterns are composable, +we can write a function that, +given any arbitrary pattern p, +returns a new pattern that searches for p +anywhere in a string. +There are several ways to do the search. +One way is like this: +

+
+function anywhere (p)
+  return lpeg.P{ p + 1 * lpeg.V(1) }
+end
+
+

+This grammar has a straight reading: +it matches p or skips one character and tries again. +

+ +

+If we want to know where the pattern is in the string +(instead of knowing only that it is there somewhere), +we can add position captures to the pattern: +

+
+local I = lpeg.Cp()
+function anywhere (p)
+  return lpeg.P{ I * p * I + 1 * lpeg.V(1) }
+end
+
+ +

+Another option for the search is like this: +

+
+local I = lpeg.Cp()
+function anywhere (p)
+  return (1 - lpeg.P(p))^0 * I * p * I
+end
+
+

+Again the pattern has a straight reading: +it skips as many characters as possible while not matching p, +and then matches p (plus appropriate captures). +

+ +

+If we want to look for a pattern only at word boundaries, +we can use the following transformer: +

+ +
+local t = lpeg.locale()
+
+function atwordboundary (p)
+  return lpeg.P{
+    [1] = p + t.alpha^0 * (1 - t.alpha)^1 * lpeg.V(1)
+  }
+end
+
+ + +

Balanced parentheses

+

+The following pattern matches only strings with balanced parentheses: +

+
+b = lpeg.P{ "(" * ((1 - lpeg.S"()") + lpeg.V(1))^0 * ")" }
+
+

+Reading the first (and only) rule of the given grammar, +we have that a balanced string is +an open parenthesis, +followed by zero or more repetitions of either +a non-parenthesis character or +a balanced string (lpeg.V(1)), +followed by a closing parenthesis. +

+ + +

Global substitution

+

+The next example does a job somewhat similar to string.gsub. +It receives a pattern and a replacement value, +and substitutes the replacement value for all occurrences of the pattern +in a given string: +

+
+function gsub (s, patt, repl)
+  patt = lpeg.P(patt)
+  patt = lpeg.Cs((patt / repl + 1)^0)
+  return lpeg.match(patt, s)
+end
+
+

+As in string.gsub, +the replacement value can be a string, +a function, or a table. +

+ + +

Comma-Separated Values (CSV)

+

+This example breaks a string into comma-separated values, +returning all fields: +

+
+local field = '"' * lpeg.Cs(((lpeg.P(1) - '"') + lpeg.P'""' / '"')^0) * '"' +
+                    lpeg.C((1 - lpeg.S',\n"')^0)
+
+local record = field * (',' * field)^0 * (lpeg.P'\n' + -1)
+
+function csv (s)
+  return lpeg.match(record, s)
+end
+
+

+A field is either a quoted field +(which may contain any character except an individual quote, +which may be written as two quotes that are replaced by one) +or an unquoted field +(which cannot contain commas, newlines, or quotes). +A record is a list of fields separated by commas, +ending with a newline or the string end (-1). +

+ +

+As it is, +the previous pattern returns each field as a separated result. +If we add a table capture in the definition of record, +the pattern will return instead a single table +containing all fields: +

+
+local record = lpeg.Ct(field * (',' * field)^0) * (lpeg.P'\n' + -1)
+
+ + +

UTF-8 and Latin 1

+

+It is not difficult to use LPeg to convert a string from +UTF-8 encoding to Latin 1 (ISO 8859-1): +

+ +
+-- convert a two-byte UTF-8 sequence to a Latin 1 character
+local function f2 (s)
+  local c1, c2 = string.byte(s, 1, 2)
+  return string.char(c1 * 64 + c2 - 12416)
+end
+
+local utf8 = lpeg.R("\0\127")
+           + lpeg.R("\194\195") * lpeg.R("\128\191") / f2
+
+local decode_pattern = lpeg.Cs(utf8^0) * -1
+
+

+In this code, +the definition of UTF-8 is already restricted to the +Latin 1 range (from 0 to 255). +Any encoding outside this range (as well as any invalid encoding) +will not match that pattern. +

+ +

+As the definition of decode_pattern demands that +the pattern matches the whole input (because of the -1 at its end), +any invalid string will simply fail to match, +without any useful information about the problem. +We can improve this situation redefining decode_pattern +as follows: +

+
+local function er (_, i) error("invalid encoding at position " .. i) end
+
+local decode_pattern = lpeg.Cs(utf8^0) * (-1 + lpeg.P(er))
+
+

+Now, if the pattern utf8^0 stops +before the end of the string, +an appropriate error function is called. +

+ + +

UTF-8 and Unicode

+

+We can extend the previous patterns to handle all Unicode code points. +Of course, +we cannot translate them to Latin 1 or any other one-byte encoding. +Instead, our translation results in a array with the code points +represented as numbers. +The full code is here: +

+
+-- decode a two-byte UTF-8 sequence
+local function f2 (s)
+  local c1, c2 = string.byte(s, 1, 2)
+  return c1 * 64 + c2 - 12416
+end
+
+-- decode a three-byte UTF-8 sequence
+local function f3 (s)
+  local c1, c2, c3 = string.byte(s, 1, 3)
+  return (c1 * 64 + c2) * 64 + c3 - 925824
+end
+
+-- decode a four-byte UTF-8 sequence
+local function f4 (s)
+  local c1, c2, c3, c4 = string.byte(s, 1, 4)
+  return ((c1 * 64 + c2) * 64 + c3) * 64 + c4 - 63447168
+end
+
+local cont = lpeg.R("\128\191")   -- continuation byte
+
+local utf8 = lpeg.R("\0\127") / string.byte
+           + lpeg.R("\194\223") * cont / f2
+           + lpeg.R("\224\239") * cont * cont / f3
+           + lpeg.R("\240\244") * cont * cont * cont / f4
+
+local decode_pattern = lpeg.Ct(utf8^0) * -1
+
+ + +

Lua's long strings

+

+A long string in Lua starts with the pattern [=*[ +and ends at the first occurrence of ]=*] with +exactly the same number of equal signs. +If the opening brackets are followed by a newline, +this newline is discharged +(that is, it is not part of the string). +

+ +

+To match a long string in Lua, +the pattern must capture the first repetition of equal signs and then, +whenever it finds a candidate for closing the string, +check whether it has the same number of equal signs. +

+ +
+equals = lpeg.P"="^0
+open = "[" * lpeg.Cg(equals, "init") * "[" * lpeg.P"\n"^-1
+close = "]" * lpeg.C(equals) * "]"
+closeeq = lpeg.Cmt(close * lpeg.Cb("init"), function (s, i, a, b) return a == b end)
+string = open * lpeg.C((lpeg.P(1) - closeeq)^0) * close /
+  function (s, o) return s end
+
+ +

+The open pattern matches [=*[, +capturing the repetitions of equal signs in a group named init; +it also discharges an optional newline, if present. +The close pattern matches ]=*], +also capturing the repetitions of equal signs. +The closeeq pattern first matches close; +then it uses a back capture to recover the capture made +by the previous open, +which is named init; +finally it uses a match-time capture to check +whether both captures are equal. +The string pattern starts with an open, +then it goes as far as possible until matching closeeq, +and then matches the final close. +The final function capture simply discards +the capture made by close. +

+ + +

Arithmetic expressions

+

+This example is a complete parser and evaluator for simple +arithmetic expressions. +We write it in two styles. +The first approach first builds a syntax tree and then +traverses this tree to compute the expression value: +

+
+-- Lexical Elements
+local Space = lpeg.S(" \n\t")^0
+local Number = lpeg.C(lpeg.P"-"^-1 * lpeg.R("09")^1) * Space
+local FactorOp = lpeg.C(lpeg.S("+-")) * Space
+local TermOp = lpeg.C(lpeg.S("*/")) * Space
+local Open = "(" * Space
+local Close = ")" * Space
+
+-- Grammar
+local Exp, Term, Factor = lpeg.V"Exp", lpeg.V"Term", lpeg.V"Factor"
+G = lpeg.P{ Exp,
+  Exp = lpeg.Ct(Factor * (FactorOp * Factor)^0);
+  Factor = lpeg.Ct(Term * (TermOp * Term)^0);
+  Term = Number + Open * Exp * Close;
+}
+
+G = Space * G * -1
+
+-- Evaluator
+function eval (x)
+  if type(x) == "string" then
+    return tonumber(x)
+  else
+    local op1 = eval(x[1])
+    for i = 2, #x, 2 do
+      local op = x[i]
+      local op2 = eval(x[i + 1])
+      if (op == "+") then op1 = op1 + op2
+      elseif (op == "-") then op1 = op1 - op2
+      elseif (op == "*") then op1 = op1 * op2
+      elseif (op == "/") then op1 = op1 / op2
+      end
+    end
+    return op1
+  end
+end
+
+-- Parser/Evaluator
+function evalExp (s)
+  local t = lpeg.match(G, s)
+  if not t then error("syntax error", 2) end
+  return eval(t)
+end
+
+-- small example
+print(evalExp"3 + 5*9 / (1+1) - 12")   --> 13.5
+
+ +

+The second style computes the expression value on the fly, +without building the syntax tree. +The following grammar takes this approach. +(It assumes the same lexical elements as before.) +

+
+-- Auxiliary function
+function eval (v1, op, v2)
+  if (op == "+") then return v1 + v2
+  elseif (op == "-") then return v1 - v2
+  elseif (op == "*") then return v1 * v2
+  elseif (op == "/") then return v1 / v2
+  end
+end
+
+-- Grammar
+local V = lpeg.V
+G = lpeg.P{ "Exp",
+  Exp = lpeg.Cf(V"Factor" * lpeg.Cg(FactorOp * V"Factor")^0, eval);
+  Factor = lpeg.Cf(V"Term" * lpeg.Cg(TermOp * V"Term")^0, eval);
+  Term = Number / tonumber + Open * V"Exp" * Close;
+}
+
+-- small example
+print(lpeg.match(G, "3 + 5*9 / (1+1) - 12"))   --> 13.5
+
+

+Note the use of the fold (accumulator) capture. +To compute the value of an expression, +the accumulator starts with the value of the first factor, +and then applies eval over +the accumulator, the operator, +and the new factor for each repetition. +

+ + + +

Download

+ +

LPeg +source code.

+ + +

License

+ +

+Copyright © 2008 Lua.org, PUC-Rio. +

+

+Permission is hereby granted, free of charge, +to any person obtaining a copy of this software and +associated documentation files (the "Software"), +to deal in the Software without restriction, +including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, +and to permit persons to whom the Software is +furnished to do so, +subject to the following conditions: +

+ +

+The above copyright notice and this permission notice +shall be included in all copies or substantial portions of the Software. +

+ +

+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +

+ +
+ +
+ +
+

+$Id: lpeg.html,v 1.62 2010/11/05 12:52:33 roberto Exp $ +

+
+ +
+ + + diff --git a/cosmic rage/docs/lsqlite3.html b/cosmic rage/docs/lsqlite3.html new file mode 100644 index 0000000..5a791d5 --- /dev/null +++ b/cosmic rage/docs/lsqlite3.html @@ -0,0 +1,860 @@ + + +LuaSQLite 3 + + + + + + + + + + + +
+

NAME

+

LuaSQLite 3 - a Lua 5.1 wrapper for the SQLite3 library

+

+


+

OVERVIEW

+

LuaSQLite 3 is a thin wrapper around the public domain SQLite3 +database engine.

+

The lsqlite3 module supports the creation and manipulation of +SQLite3 databases. After a require('lsqlite3') the exported +functions are called with prefix sqlite3. However, most sqlite3 +functions are called via an object-oriented interface to either +database or SQL statement objects; see below for details.

+

This documentation does not attempt to describe how SQLite3 itself +works, it just describes the Lua binding and the available functions. +For more information about the SQL features supported by SQLite3 and +details about the syntax of SQL statements and queries, please see the +SQLite3 documentation http://www.sqlite.org/. Using some of the +advanced features (how to use callbacks, for instance) will require +some familiarity with the SQLite3 API.

+

+


+

REFERENCE

+

+


+

SQLite3 functions

+

+

sqlite3.complete

+
+        sqlite3.complete(sql)
+

Returns true if the string sql comprises one or more complete SQL +statements and false otherwise.

+

+

sqlite3.open

+
+        sqlite3.open(filename)
+

Opens (or creates if it does not exist) an SQLite database with name +filename and returns its handle as userdata (the returned object +should be used for all further method calls in connection with this +specific database, see Database methods). Example:

+
+        myDB=sqlite3.open('MyDatabase.sqlite3')  -- open
+        -- do some database calls...
+        myDB:close()  -- close
+

In case of an error, the function returns nil, an error code and an +error message.

+

+

sqlite3.open_memory

+
+        sqlite3.open_memory()
+

Opens an SQLite database in memory and returns its handle as +userdata. In case of an error, the function returns nil, an error code +and an error message. (In-memory databases are volatile as they are +never stored on disk.)

+

+

sqlite3.temp_directory

+
+        sqlite3.temp_directory([temp])
+

Sets or queries the directory used by SQLite for temporary files. If +string temp is a directory name or nil, the temporary directory is +set accordingly and the old value is returned. If temp is missing, +the function simply returns the current temporary directory.

+

+

sqlite3.version

+
+        sqlite3.version()
+

Returns a string with SQLite version information, in the form 'x.y[.z]'.

+

+


+

Database methods

+

After opening a database with sqlite3.open() or +sqlite3.open_memory() +the returned database object should be used for all further method calls +in connection with that database. An open database object supports the +following methods.

+

+

db:busy_handler

+
+        db:busy_handler([func[,udata]])
+

Sets or removes a busy handler for a database. func is either a Lua +function that implements the busy handler or nil to remove a previously +set handler. This function returns nothing.

+

The handler function is called with two parameters: udata and the +number of (re-)tries for a pending transaction. It should return nil, +false or 0 if the transaction is to be aborted. All other values will +result in another attempt to perform the transaction. (See the SQLite +documentation for important hints about writing busy handlers.)

+

+

db:busy_timeout

+
+        db:busy_timeout(t)
+

Sets a busy handler that waits for t milliseconds if a transaction +cannot proceed. Calling this function will remove any busy handler set +by db:busy_handler(); calling it with an argument +less than or equal to 0 will turn off all busy handlers.

+

+

db:changes

+
+        db:changes()
+

This function returns the number of database rows that were changed (or +inserted or deleted) by the most recent SQL statement. Only changes that +are directly specified by INSERT, UPDATE, or DELETE statements are +counted. Auxiliary changes caused by triggers are not counted. Use +db:total_changes() to find the total number of +changes.

+

+

db:close

+
+        db:close()
+

Closes a database. All SQL statements prepared using +db:prepare() should +have been finalized before this function is called. The function returns +sqlite3.OK on success or else a numerical error code (see the list of +Numerical error and result codes).

+

+

db:close_vm

+
+        db:close_vm(temponly)
+

Finalizes all statements that have not been explicitly finalized. If +temponly is true, only internal, temporary statements are finalized. +This function returns nothing.

+

+

db:create_aggregate

+
+        db:create_aggregate(name,nargs,step,final)
+

This function creates an aggregate callback function. Aggregates perform +an operation over all rows in a query. name is a string with the name +of the aggregate function as given in an SQL statement; nargs is the +number of arguments this call will provide. step is the actual Lua +function that gets called once for every row; it should accept a function +context (see Methods for callback contexts) plus the same number of +parameters as given in nargs. final is a function that is called +once after all rows have been processed; it receives one argument, the +function context.

+

The function context can be used inside the two callback functions to +communicate with SQLite3. Here is a simple example:

+
+        db:exec[=[
+          CREATE TABLE numbers(num1,num2);
+          INSERT INTO numbers VALUES(1,11);
+          INSERT INTO numbers VALUES(2,22);
+          INSERT INTO numbers VALUES(3,33);
+        ]=]
+        local num_sum=0
+        local function oneRow(context,num)  -- add one column in all rows
+          num_sum=num_sum+num
+        end
+        local function afterLast(context)   -- return sum after last row has been processed
+          context:result_number(num_sum)
+          num_sum=0
+        end
+        db:create_aggregate("do_the_sums",1,oneRow,afterLast)
+        for sum in db:urows('SELECT do_the_sums(num1) FROM numbers') do print("Sum of col 1:",sum) end
+        for sum in db:urows('SELECT do_the_sums(num2) FROM numbers') do print("Sum of col 2:",sum) end
+

This prints:

+
+        Sum of col 1:   6
+        Sum of col 2:   66
+

+

db:create_collation

+
+        db:create_collation(name,func)
+

This creates a collation callback. A collation callback is used to +establish a collation order, mostly for string comparisons and sorting +purposes. name is a string with the name of the collation to be created; +func is a function that accepts two string arguments, compares them +and returns 0 if both strings are identical, -1 if the first argument is +lower in the collation order than the second and 1 if the first argument +is higher in the collation order than the second. A simple example:

+
+        local function collate(s1,s2)
+          s1=s1:lower()
+          s2=s2:lower()
+          if s1==s2 then return 0
+          elseif s1<s2 then return -1
+          else return 1 end
+        end
+        db:exec[=[
+          CREATE TABLE test(id INTEGER PRIMARY KEY,content COLLATE CINSENS);
+          INSERT INTO test VALUES(NULL,'hello world');
+          INSERT INTO test VALUES(NULL,'Buenos dias');
+          INSERT INTO test VALUES(NULL,'HELLO WORLD');
+        ]=]
+        db:create_collation('CINSENS',collate)
+        for row in db:nrows('SELECT * FROM test') do print(row.id,row.content) end
+

+

db:create_function

+
+        db:create_function(name,nargs,func)
+

This function creates a callback function. Callback function are called +by SQLite3 once for every row in a query. name is a string with the +name of the callback function as given in an SQL statement; nargs is +the number of arguments this call will provide. func is the actual Lua +function that gets called once for every row; it should accept a +function context (see Methods for callback contexts) plus the same +number of parameters as given in nargs. Here is an example:

+
+        db:exec'CREATE TABLE test(col1,col2,col3)'
+        db:exec'INSERT INTO test VALUES(1,2,4)'
+        db:exec'INSERT INTO test VALUES(2,4,9)'
+        db:exec'INSERT INTO test VALUES(3,6,16)'
+        db:create_function('sum_cols',3,function(ctx,a,b,c)
+          ctx:result_number(a+b+c)
+        end))
+        for col1,col2,col3,sum in db:urows('SELECT *,sum_cols(col1,col2,col3) FROM test') do
+          util.printf('%2i+%2i+%2i=%2i\n',col1,col2,col3,sum)
+        end
+

+

db:errcode

+
+        db:errcode()
+        db:error_code()
+

Returns the numerical result code (or extended result code) for the most +recent failed call associated with database db. See +Numerical error and result codes for details.

+

+

db:errmsg

+
+        db:errmsg()
+        db:error_message()
+

Returns a string that contains an error message for the most recent +failed call associated with database db.

+

+

db:exec

+
+        db:exec(sql[,func[,udata]])
+        db:execute(sql[,func[,udata]])
+

Compiles and executes the SQL statement(s) given in string sql. The +statements are simply executed one after the other and not stored. The +function returns sqlite3.OK on success or else a numerical error code +(see Numerical error and result codes).

+

If one or more of the SQL statements are queries, then the callback +function specified in func is invoked once for each row of the query +result (if func is nil, no callback is invoked). The callback receives +four arguments: udata (the third parameter of the db:exec() call), +the number of columns in the row, a table with the column values and +another table with the column names. The callback function should return +0. If the callback returns a non-zero value then the query is aborted, +all subsequent SQL statements are skipped and db:exec() returns +sqlite3.ABORT. Here is a simple example:

+
+        sql=[=[
+          CREATE TABLE numbers(num1,num2,str);
+          INSERT INTO numbers VALUES(1,11,"ABC");
+          INSERT INTO numbers VALUES(2,22,"DEF");
+          INSERT INTO numbers VALUES(3,33,"UVW");
+          INSERT INTO numbers VALUES(4,44,"XYZ");
+          SELECT * FROM numbers;
+        ]=]
+        function showrow(udata,cols,values,names)
+          assert(udata=='test_udata')
+          print('exec:')
+          for i=1,cols do print('',names[i],values[i]) end
+          return 0
+        end
+        db:exec(sql,showrow,'test_udata')
+

+

db:interrupt

+
+        db:interrupt()
+

This function causes any pending database operation to abort and return +at the next opportunity. This function returns nothing.

+

+

db:isopen

+
+        db:isopen()
+

Returns true if database db is open, false otherwise.

+

+

db:last_insert_rowid

+
+        db:last_insert_rowid()
+

This function returns the rowid of the most recent INSERT into the +database. If no inserts have ever occurred, 0 is returned. (Each row in +an SQLite table has a unique 64-bit signed integer key called the +'rowid'. This id is always available as an undeclared column named +ROWID, OID, or _ROWID_. If the table has a column of type INTEGER +PRIMARY KEY then that column is another alias for the rowid.)

+

If an INSERT occurs within a trigger, then the rowid of the inserted row +is returned as long as the trigger is running. Once the trigger +terminates, the value returned reverts to the last value inserted before +the trigger fired.

+

+

db:nrows

+
+        db:nrows(sql)
+

Creates an iterator that returns the successive rows selected by the SQL +statement given in string sql. Each call to the iterator returns a +table in which the named fields correspond to the columns in the database. +Here is an example:

+
+        db:exec[=[
+          CREATE TABLE numbers(num1,num2);
+          INSERT INTO numbers VALUES(1,11);
+          INSERT INTO numbers VALUES(2,22);
+          INSERT INTO numbers VALUES(3,33);
+        ]=]
+        for a in db:nrows('SELECT * FROM numbers') do table.print(a) end
+

This script prints:

+
+        num2: 11
+        num1: 1
+        num2: 22
+        num1: 2
+        num2: 33
+        num1: 3
+

+

db:prepare

+
+        db:prepare(sql)
+

This function compiles the SQL statement in string sql into an internal +representation and returns this as userdata. The returned object should +be used for all further method calls in connection with this specific +SQL statement (see Methods for prepared statements).

+

+

db:progress_handler

+
+        db:progress_handler(n,func,udata)
+

This function installs a callback function func that is invoked +periodically during long-running calls to db:exec() +or stmt:step(). The +progress callback is invoked once for every n internal operations, +where n is the first argument to this function. udata is passed to +the progress callback function each time it is invoked. If a call to +db:exec() or stmt:step() results in fewer than n operations +being executed, then the progress callback is never invoked. Only a +single progress callback function may be registered for each opened +database and a call to this function will overwrite any previously set +callback function. To remove the progress callback altogether, pass nil +as the second argument.

+

If the progress callback returns a result other than 0, then the current +query is immediately terminated, any database changes are rolled back +and the containing db:exec() or stmt:step() call returns +sqlite3.INTERRUPT. This feature can be used to cancel long-running +queries.

+

+

db:rows

+
+        db:rows(sql)
+

Creates an iterator that returns the successive rows selected by the SQL +statement given in string sql. Each call to the iterator returns a table +in which the numerical indices 1 to n correspond to the selected columns +1 to n in the database. Here is an example:

+
+        db:exec[=[
+          CREATE TABLE numbers(num1,num2);
+          INSERT INTO numbers VALUES(1,11);
+          INSERT INTO numbers VALUES(2,22);
+          INSERT INTO numbers VALUES(3,33);
+        ]=]
+        for a in db:rows('SELECT * FROM numbers') do table.print(a) end
+

This script prints:

+
+        1: 1
+        2: 11
+        1: 2
+        2: 22
+        1: 3
+        2: 33
+

+

db:total_changes

+
+        db:total_changes()
+

This function returns the number of database rows that have been +modified by INSERT, UPDATE or DELETE statements since the database was +opened. This includes UPDATE, INSERT and DELETE statements executed as +part of trigger programs. All changes are counted as soon as the +statement that produces them is completed by calling either +stmt:reset() or stmt:finalize().

+

+

db:trace

+
+        db:trace(func,udata)
+

This function installs a trace callback handler. func is a Lua +function that is called by SQLite3 just before the evaluation of an SQL +statement. This callback receives two arguments: the first is the +udata argument used when the callback was installed; the second is a +string with the SQL statement about to be executed.

+

+

db:urows

+
+        db:urows(sql)
+

Creates an iterator that returns the successive rows selected by the SQL +statement given in string sql. Each call to the iterator returns the +values that correspond to the columns in the currently selected row. +Here is an example:

+
+        db:exec[=[
+          CREATE TABLE numbers(num1,num2);
+          INSERT INTO numbers VALUES(1,11);
+          INSERT INTO numbers VALUES(2,22);
+          INSERT INTO numbers VALUES(3,33);
+        ]=]
+        for num1,num2 in db:urows('SELECT * FROM numbers') do print(num1,num2) end
+

This script prints:

+
+        1       11
+        2       22
+        3       33
+

+


+

Methods for prepared statements

+

After creating a prepared statement with db:prepare() +the returned statement object should be used for all further calls in +connection with that statement. Statement objects support the following +methods.

+

+

stmt:bind

+
+        stmt:bind(n[,value])
+

Binds value to statement parameter n. If the type of value is string +or number, it is bound as text or double, respectively. If value is a +boolean or nil or missing, any previous binding is removed. The function +returns sqlite3.OK on success or else a numerical error code (see +Numerical error and result codes).

+

+

stmt:bind_blob

+
+        stmt:bind_blob(n,blob)
+

Binds string blob (which can be a binary string) as a blob to +statement parameter n. The function returns sqlite3.OK on success +or else a numerical error code (see Numerical error and result codes).

+

+

stmt:bind_names

+
+        stmt:bind_names(nametable)
+

Binds the values in nametable to statement parameters. If the +statement parameters are named (i.e., of the form ``:AAA'' or ``$AAA'') +then this function looks for appropriately named fields in nametable; +if the statement parameters are +not named, it looks for numerical fields 1 to the number of statement +parameters. The function returns sqlite3.OK on success or else a +numerical error code (see Numerical error and result codes).

+

+

stmt:bind_parameter_count

+
+        stmt:bind_parameter_count()
+

Returns the largest statement parameter index in prepared statement +stmt. When the statement parameters are of the forms ``:AAA'' or ``?'', +then they are assigned sequentially increasing numbers beginning with +one, so the value returned is the number of parameters. However if the +same statement parameter name is used multiple times, each occurrence +is given the same number, so the value returned is the number of unique +statement parameter names.

+

If statement parameters of the form ``?NNN'' are used (where NNN is an +integer) then there might be gaps in the numbering and the value +returned by this interface is the index of the statement parameter with +the largest index value.

+

+

stmt:bind_parameter_name

+
+        stmt:bind_parameter_name(n)
+

Returns the name of the n-th parameter in prepared statement stmt. +Statement parameters of the form ``:AAA'' or ``@AAA'' or ``$VVV'' have a name +which is the string ``:AAA'' or ``@AAA'' or ``$VVV''. In other words, the +initial ``:'' or ``$'' or ``@'' is included as part of the name. Parameters +of the form ``?'' or ``?NNN'' have no name. The first bound parameter has +an index of 1. +If the value n is out of range or if the n-th parameter is +nameless, then nil is returned. The function returns sqlite3.OK on +success or else a numerical error code (see +Numerical error and result codes)

+

+

stmt:bind_values

+
+        stmt:bind_values(value1,value2,...,valueN)
+

Binds the given values to statement parameters. The function returns +sqlite3.OK on success or else a numerical error code (see +Numerical error and result codes).

+

+

stmt:columns

+
+        stmt:columns()
+

Returns the number of columns in the result set returned by statement +stmt or 0 if the statement does not return data (for example an UPDATE).

+

+

stmt:finalize

+
+        stmt:finalize()
+

This function frees prepared statement stmt. If the statement was +executed successfully, or not executed at all, then sqlite3.OK is +returned. If execution of the statement failed then an error code is +returned.

+

+

stmt:get_name

+
+        stmt:get_name(n)
+

Returns the name of column n in the result set of statement stmt. (The +left-most column is number 0.)

+

+

stmt:get_named_types

+
+        stmt:get_named_types()
+

Returns a table with the names and types of all columns in the result +set of statement stmt.

+

+

stmt:get_named_values

+
+        stmt:get_named_values()
+

This function returns a table with names and values of all columns in +the current result row of a query.

+

+

stmt:get_names

+
+        stmt:get_names()
+

This function returns an array with the names of all columns in the +result set returned by statement stmt.

+

+

stmt:get_type

+
+        stmt:get_type(n)
+

Returns the type of column n in the result set of statement stmt. (The +left-most column is number 0.)

+

+

stmt:get_types

+
+        stmt:get_types()
+

This function returns an array with the types of all columns in the +result set returned by statement stmt.

+

+

stmt:get_unames

+
+        stmt:get_unames()
+

This function returns a list with the names of all columns in the result +set returned by statement stmt.

+

+

stmt:get_utypes

+
+        stmt:get_utypes()
+

This function returns a list with the types of all columns in the result +set returned by statement stmt.

+

+

stmt:get_uvalues

+
+        stmt:get_uvalues()
+

This function returns a list with the values of all columns in the +current result row of a query.

+

+

stmt:get_value

+
+        stmt:get_value(n)
+

Returns the value of column n in the result set of statement stmt. (The +left-most column is number 0.)

+

+

stmt:get_values

+
+        stmt:get_values()
+

This function returns an array with the values of all columns in the +result set returned by statement stmt.

+

+

stmt:isopen

+
+        stmt:isopen()
+

Returns true if stmt has not yet been finalized, false otherwise.

+

+

stmt:nrows

+
+        stmt:nrows()
+

Returns an function that iterates over the names and values of the +result set of statement stmt. Each iteration returns a table with the +names and values for the current row. +This is the prepared statement equivalent of db:nrows().

+

+

stmt:reset

+
+        stmt:reset()
+

This function resets SQL statement stmt, so that it is ready to be +re-executed. Any statement variables that had values bound to them using +the stmt:bind*() functions retain their values.

+

+

stmt:rows

+
+        stmt:rows()
+

Returns an function that iterates over the values of the result set of +statement stmt. Each iteration returns an array with the values for the +current row. +This is the prepared statement equivalent of db:rows().

+

+

stmt:step

+
+        stmt:step()
+

This function must be called to evaluate the (next iteration of the) +prepared statement stmt. It will return one of the following values:

+
    +
  • +sqlite3.BUSY: the engine was unable to acquire the locks needed. If the +statement is a COMMIT or occurs outside of an explicit transaction, then +you can retry the statement. If the statement is not a COMMIT and occurs +within a explicit transaction then you should rollback the transaction +before continuing. +

    +
  • +sqlite3.DONE: the statement has finished executing successfully. +stmt:step() should not be called again on this statement +without first calling stmt:reset() to reset the virtual +machine back to the initial state. +

    +
  • +sqlite3.ROW: this is returned each time a new row of data is ready for +processing by the caller. The values may be accessed using the column +access functions. stmt:step() can be called again to +retrieve the next row of data. +

    +
  • +sqlite3.ERROR: a run-time error (such as a constraint violation) has +occurred. stmt:step() should not be called again. More +information may be found by calling db:errmsg(). A more +specific error +code (can be obtained by calling stmt:reset(). +

    +
  • +sqlite3.MISUSE: the function was called inappropriately, perhaps +because the statement has already been finalized or a previous call to +stmt:step() has returned sqlite3.ERROR or +sqlite3.DONE. +

+

+

stmt:urows

+
+        stmt:urows()
+

Returns an function that iterates over the values of the result set of +statement stmt. Each iteration returns the values for the current row. +This is the prepared statement equivalent of db:urows().

+

+


+

Methods for callback contexts

+

A callback context is available as a parameter inside the callback +functions db:create_aggregate() and +db:create_function(). It can be used +to get further information about the state of a query.

+

+

context:aggregate_count

+
+        context:aggregate_count()
+

Returns the number of calls to the aggregate step function.

+

+

context:get_aggregate_data

+
+        context:get_aggregate_data()
+

Returns the user-definable data field for callback funtions.

+

+

context:set_aggregate_data

+
+        context:set_aggregate_data(udata)
+

Set the user-definable data field for callback funtions to udata.

+

+

context:result

+
+        context:result(res)
+

This function sets the result of a callback function to res. The type of +the result depends on the type of res and is either a number or a string +or nil. All other values will raise an error message.

+

+

context:result_null

+
+        context:result_null()
+

This function sets the result of a callback function to nil. It returns +nothing.

+

+

context:result_number

+
+        context:result_number(number)
+        context:result_double(number)
+

This function sets the result of a callback function to the value +number. It returns nothing.

+

+

context:result_int

+
+        context:result_int(number)
+

This function sets the result of a callback function to the integer +value in number. It returns nothing.

+

+

context:result_text

+
+        context:result_text(str)
+

This function sets the result of a callback function to the string in +str. It returns nothing.

+

+

context:result_blob

+
+        context:result_blob(blob)
+

This function sets the result of a callback function to the binary +string in blob. It returns nothing.

+

+

context:result_error

+
+        context:result_error(err)
+

This function sets the result of a callback function to the error value +in err. It returns nothing.

+

+

context:user_data

+
+        context:user_data()
+

Returns the userdata parameter given in the call to install the callback +function (see db:create_aggregate() and +db:create_function() for details).

+

+


+

Numerical error and result codes

+

The following constants are defined by module sqlite3:

+
+        OK: 0          ERROR: 1       INTERNAL: 2    PERM: 3        ABORT: 4
+        BUSY: 5        LOCKED: 6      NOMEM: 7       READONLY: 8    INTERRUPT: 9
+        IOERR: 10      CORRUPT: 11    NOTFOUND: 12   FULL: 13       CANTOPEN: 14
+        PROTOCOL: 15   EMPTY: 16      SCHEMA: 17     TOOBIG: 18     CONSTRAINT: 19
+        MISMATCH: 20   MISUSE: 21     NOLFS: 22      FORMAT: 24     RANGE: 25
+        NOTADB: 26     ROW: 100       DONE: 101
+

For details about their exact meaning please see the SQLite3 +documentation http://www.sqlite.org/.

+

+


+

VERSION

+

This is lsqlite3 subversion 6, also known as ``devel-0.6''.

+

+


+

CREDITS

+

lsqlite3 was developed by Tiago Dionizio and Doug Currie with +contributions from Thomas Lauer and Michael Roth.

+

This documentation is based on the ``(very) preliminary'' documents +for the Idle-SQLite3 database module. Thanks to Thomas Lauer for +making it available.

+

+


+

LICENSE

+
+    /************************************************************************
+    * lsqlite3                                                              *
+    * Copyright (C) 2002-2007 Tiago Dionizio, Doug Currie                   *
+    * All rights reserved.                                                  *
+    * Author    : Tiago Dionizio <tiago.dionizio@ist.utl.pt>                *
+    * Author    : Doug Currie <doug.currie@alum.mit.edu>                    *
+    * Library   : lsqlite3 - a SQLite 3 database binding for Lua 5          *
+    *                                                                       *
+    * Permission is hereby granted, free of charge, to any person obtaining *
+    * a copy of this software and associated documentation files (the       *
+    * "Software"), to deal in the Software without restriction, including   *
+    * without limitation the rights to use, copy, modify, merge, publish,   *
+    * distribute, sublicense, and/or sell copies of the Software, and to    *
+    * permit persons to whom the Software is furnished to do so, subject to *
+    * the following conditions:                                             *
+    *                                                                       *
+    * The above copyright notice and this permission notice shall be        *
+    * included in all copies or substantial portions of the Software.       *
+    *                                                                       *
+    * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       *
+    * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    *
+    * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*
+    * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  *
+    * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  *
+    * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     *
+    * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                *
+    ************************************************************************/
+ + + + diff --git a/cosmic rage/docs/lua_license.txt b/cosmic rage/docs/lua_license.txt new file mode 100644 index 0000000..9a30174 --- /dev/null +++ b/cosmic rage/docs/lua_license.txt @@ -0,0 +1,13 @@ +Lua 5.0 license + +Copyright 2003-2004 Tecgraf, PUC-Rio. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +http://www.lua.org + diff --git a/cosmic rage/docs/luacom.pdf b/cosmic rage/docs/luacom.pdf new file mode 100644 index 0000000..24e1a52 Binary files /dev/null and b/cosmic rage/docs/luacom.pdf differ diff --git a/cosmic rage/docs/mersenne_twister.txt b/cosmic rage/docs/mersenne_twister.txt new file mode 100644 index 0000000..16cefbc --- /dev/null +++ b/cosmic rage/docs/mersenne_twister.txt @@ -0,0 +1,156 @@ +What is Mersenne Twister (MT)? + +Mersenne Twister(MT) is a pseudorandom number generating algorithm developped by Makoto Matsumoto and Takuji Nishimura (alphabetical order) in 1996/1997. An improvement on initialization was given on 2002 Jan. + +MT has the following merits: + +* It is designed with consideration on the flaws of various existing generators. + +* The algorithm is coded into a C-source downloadable below. + +* Far longer period and far higher order of equidistribution than any other implemented generators. (It is proved that the period is 2^19937-1, and 623-dimensional equidistribution property is assured.) + +* Fast generation. (Although it depends on the system, it is reported that MT is sometimes faster than the standard ANSI-C library in a system with pipeline and cache memory.) (Note added in 2004/3: on 1998, usually MT was much faster than rand(), but the algorithm for rand() has been substituted, and now there are no much difference in speed.) + +* Efficient use of the memory. (The implemented C-code mt19937.c consumes only 624 words of working area.) + +------- +Copyright notice from source code. +------- + + A C-program for MT19937, with initialization improved 2002/1/26. + Coded by Takuji Nishimura and Makoto Matsumoto. + + Before using, initialize the state by using init_genrand(seed) + or init_by_array(init_key, key_length). + + Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. The names of its contributors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + Any feedback is very welcome. + http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html + email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space) + +----------- +Note re the period. Using the "bc" program under Linux, we can see that the MT algorithm repeats itself every + +2^19937-1 => + +43154247973881626480552355163379198390539350432267115051652505414033\ +30680137658091130451362931858466554526993825764883531790221733458441\ +39095282691546091680190078753437413962968019201144864809026614143184\ +43276980300066728104984095451588176077132969843762134621790396391341\ +28520562761960051310664637664861599423667548653748024196435029593516\ +86623639090479483476923139783013778207857124190544743328445291831729\ +73242310888265081321626469451077707812282829444775022680488057820028\ +76465939916476626520090056149580034405435369038986289406179287201112\ +08336148084474829135473283672778795656483078469091169458662301697024\ +01260240187028746650033445774570315431292996025187780790119375902863\ +17108414964247337898626750330896137490576634090528957229001603800057\ +16308751913739795550474681543332534749910462481325045163417965514705\ +75481459200859472614836213875557116864445789750886277996487304308450\ +48422342062926651855602433933919084436892101842484467704272766460185\ +29149252772809226975384267702573339289544012054658956103476588553866\ +33902546289962132643282425748035786233580608154696546932563833327670\ +76989943977488852668727852745100296305914696387571542573553447597973\ +44631006783673933274021499309687782967413915145996023742136298987206\ +11431410402147238998090962818915890645693934483330994169632295877995\ +84899336674701487176349480554999616305154122540346529700772114623135\ +57040814930986630657336771911728539870957481678162560842128233801686\ +25334586431254034670806135273543270714478876861861983320777280644806\ +69112571319726258176315131359642954776357636783701934983517846214429\ +49607571909180546251141436663841894338525764522893476524546315357404\ +68786228945885654608562058042468987372436921445092315377698407168198\ +37653823774861419620704154810637936512319281799900662176646716711347\ +16327154817958770053826943934004030617004576911353491878748889234293\ +49340145170571716181125795888889277495426977149914549623916394014822\ +98502533165151143127880200905680845650681887726660983163688388490562\ +18222629339865486456690806721917047404088913498356856624280632311985\ +20436826329415290752972798343429446509992206368781367154091702655772\ +72739132942427752934908260058588476652315095741707783191001616847568\ +56586731928608820701797603072698499873548360423717346602576943472355\ +06301744118874141292438958141549100609752216882230887611431996472330\ +84238013711092744948355781503758684964458574991777286992674421836962\ +11376751010832785437940817490940910430840967741447084363242794768920\ +56200427227961638669149805489831121244676399931955371484012886360748\ +70647956866904857478285521705474011394592962217750257556581106745220\ +14489819919686359653615516812739827407601388996388203187763036687627\ +30157584640042798880691862640268612686180883874939573818125022279689\ +93026744625577395954246983163786300017127922715140603412990218157065\ +96505326007758236773981821290873944498591827499990072235924233345678\ +50671186568839186747704960016277540625331440619019129983789914712515\ +36520033605799350860167880768756856237785709525554130490292719222018\ +41725023571244499118702106426945650613849193734743245039662677990384\ +02386781686809962015879090586549423504699190743519551043722544515740\ +96782908433602593822578073088027385526155197204407562032678062444880\ +34909982321612316877947156134057932495455095280525180101230872587789\ +74115817048245588971438596754408081313438375502988726739523375296641\ +61550140609160798322923982724061478325289247971651993698951918780868\ +12211916417477109024806334910917048274412282811866324459071457871383\ +51234842261380074621914004818152386666043133344875067903582838283562\ +68808323657548206847963954638381953217452250268237244136327576587560\ +91197836532983120667082171493167735643403792897243939867441398918554\ +16612295739356668612658271234696438377122838998040199739078061443675\ +41567107846340467370240377765347817336708484473470205686663615813800\ +36922533822099094664695919301616260979205087421756703065051395428607\ +50806159835357541032147095084278461056701367739794932024202998707731\ +01769258204621070221251412042932253043178961626704777611512359793540\ +41470848709854654265027720573009003338479053342506041195030300017040\ +02887892941404603345869926367501355094942750552591581639980523190679\ +61078499358089668329929768126244231400865703342186809455174050644882\ +90392073167113076951318922965935090186230948105575195603052407871638\ +09219164433754514863301000915916985856242176563624771328981678548246\ +29737624953025136036341276836645617507703197745753491280643317653999\ +59943433081184701471587128161493944212766142282629099500557469810532\ +06610001560295784656616193252269412026831159508949671513845195883217\ +14798274887926185141781997903441728559860772722086667768042609030875\ +48238033454465663056192413083744527546681430154877108777280110860043\ +25892262259413968285283497045571062757701421761565262725153407407625\ +40514993198949445910641466053430537857670986252004986488096114486925\ +86034737143636591940139627063668513892996928694918051725568185082988\ +24954954815796063169517658741420159798754273428026723452481263569157\ +30721315373978104162765371507859850415479728766312294671134815852941\ +88164328250444666927811374744948983850643757875073764963451486253063\ +83391555145690087891955315994462944493235248817599907119135755933382\ +12170619147718505493663221115722292033114850248756330311801880568507\ +35698415805181187107786539535712960143729408652704070219243831672903\ +23231567912289419486240594039074452321678019381871219092155460768444\ +57357855951361330424220615135645751393727093900970723782710124585383\ +76783381610233975868548942306960915402499879074534613119239638529507\ +54758058205625956600817743007191746812655955021747670922460866747744\ +52087560785906233475062709832859348006778945616960249439281376349565\ +75998474857735539909575573132008090408300364464922194099340969487305\ +47494301216165686750735749555882340303989874672975455060957736921559\ +19548081551403591570712993005702711728625284319741331230761788679750\ +67842601954367603059903407084814646072789554954877421407535706212171\ +98252192978869786916734625618430175454903864111585429504569920905636\ +741539030968041471 + +bytes. \ No newline at end of file diff --git a/cosmic rage/docs/re.html b/cosmic rage/docs/re.html new file mode 100644 index 0000000..fefacd8 --- /dev/null +++ b/cosmic rage/docs/re.html @@ -0,0 +1,418 @@ + + + + LPeg.re - Regex syntax for LPEG + + + + + + + +
+ +
+ +
LPeg.re
+
+ Regex syntax for LPEG +
+
+ +
+ + + +
+ +

The re Module

+ +

+The re module +(provided by file re.lua in the distribution) +supports a somewhat conventional regex syntax +for pattern usage within LPeg. +

+ +

+The next table summarizes re's syntax. +A p represents an arbitrary pattern; +num represents a number ([0-9]+); +name represents an identifier +([a-zA-Z][a-zA-Z0-9_]*). +Constructions are listed in order of decreasing precedence. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SyntaxDescription
( p ) grouping
'string' literal string
"string" literal string
[class] character class
. any character
%namepattern defs[name] or a pre-defined pattern
namenon terminal
<name>non terminal
{} position capture
{ p } simple capture
{: p :} anonymous group capture
{:name: p :} named group capture
{~ p ~} substitution capture
=name back reference +
p ? optional match
p * zero or more repetitions
p + one or more repetitions
p^num exactly n repetitions
p^+numat least n repetitions
p^-numat most n repetitions
p -> 'string' string capture
p -> "string" string capture
p -> {} table capture
p -> name function/query/string capture +equivalent to p / defs[name]
p => name match-time capture +equivalent to lpeg.Cmt(p, defs[name])
& p and predicate
! p not predicate
p1 p2 concatenation
p1 / p2 ordered choice
(name <- p)+ grammar
+

+Any space appearing in a syntax description can be +replaced by zero or more space characters and Lua-style comments +(-- until end of line). +

+ +

+Character classes define sets of characters. +An initial ^ complements the resulting set. +A range x-y includes in the set +all characters with codes between the codes of x and y. +A pre-defined class %name includes all +characters of that class. +A simple character includes itself in the set. +The only special characters inside a class are ^ +(special only if it is the first character); +] +(can be included in the set as the first character, +after the optional ^); +% (special only if followed by a letter); +and - +(can be included in the set as the first or the last character). +

+ +

+Currently the pre-defined classes are similar to those from the +Lua's string library +(%a for letters, +%A for non letters, etc.). +There is also a class %nl +containing only the newline character, +which is particularly handy for grammars written inside long strings, +as long strings do not interpret escape sequences like \n. +

+ + +

Functions

+ +

re.compile (string, [, defs])

+

+Compiles the given string and +returns an equivalent LPeg pattern. +The given string may define either an expression or a grammar. +The optional defs table provides extra Lua values +to be used by the pattern. +

+ +

re.find (subject, pattern [, init])

+

+Searches the given pattern in the given subject. +If it finds a match, +returns the index where this occurrence starts, +plus the captures made by the pattern (if any). +Otherwise, returns nil. +

+ +

+An optional numeric argument init makes the search +starts at that position in the subject string. +As usual in Lua libraries, +a negative value counts from the end. +

+ +

re.match (subject, pattern)

+

+Matches the given pattern against the given subject. +

+ +

re.updatelocale ()

+

+Updates the pre-defined character classes to the current locale. +

+ + +

Some Examples

+ +

A complete simple program

+

+The next code shows a simple complete Lua program using +the re module: +

+
+local re = require"re"
+
+-- find the position of the first number in a string
+print(re.find("the number 423 is odd", "[0-9]+"))  --> 12
+
+-- similar, but also captures (and returns) the number
+print(re.find("the number 423 is odd", "{[0-9]+}"))  --> 12    423
+
+-- returns all words in a string
+print(re.match("the number 423 is odd", "({%a+} / .)*"))
+--> the    number    is    odd
+
+ + +

Balanced parentheses

+

+The following call will produce the same pattern produced by the +Lua expression in the +balanced parentheses example: +

+
+b = re.compile[[  balanced <- "(" ([^()] / balanced)* ")"  ]]
+
+ +

String reversal

+

+The next example reverses a string: +

+
+rev = re.compile[[ R <- (!.) -> '' / ({.} R) -> '%2%1']]
+print(rev:match"0123456789")   --> 9876543210
+
+ +

CSV decoder

+

+The next example replicates the CSV decoder: +

+
+record = re.compile[[
+  record <- ( field (',' field)* ) -> {} (%nl / !.)
+  field <- escaped / nonescaped
+  nonescaped <- { [^,"%nl]* }
+  escaped <- '"' {~ ([^"] / '""' -> '"')* ~} '"'
+]]
+
+ +

Lua's long strings

+

+The next example matches Lua long strings: +

+
+c = re.compile([[
+  longstring <- ('[' {:eq: '='* :} '[' close) -> void
+  close <- ']' =eq ']' / . close
+]], {void = function () end})
+
+print(c:match'[==[]]===]]]]==]===[]')   --> 17
+
+ +

Indented blocks

+

+This example breaks indented blocks into tables, +respecting the indentation: +

+
+p = re.compile[[
+  block <- ({:ident:' '*:} line
+           ((=ident !' ' line) / &(=ident ' ') block)*) -> {}
+  line <- {[^%nl]*} %nl
+]]
+
+

+As an example, +consider the following text: +

+
+t = p:match[[
+first line
+  subline 1
+  subline 2
+second line
+third line
+  subline 3.1
+    subline 3.1.1
+  subline 3.2
+]]
+
+

+The resulting table t will be like this: +

+
+   {'first line'; {'subline 1'; 'subline 2'; ident = '  '};
+    'second line';
+    'third line'; { 'subline 3.1'; {'subline 3.1.1'; ident = '    '};
+                    'subline 3.2'; ident = '  '};
+    ident = ''}
+
+ +

Macro expander

+

+This example implements a simple macro expander. +Macros must be defined as part of the pattern, +following some simple rules: +

+
+p = re.compile[[
+      text <- {~ item* ~}
+      item <- macro / [^()] / '(' item* ')'
+      arg <- ' '* {~ (!',' item)* ~}
+      args <- '(' arg (',' arg)* ')'
+      -- now we define some macros
+      macro <- ('apply' args) -> '%1(%2)'
+             / ('add' args) -> '%1 + %2'
+             / ('mul' args) -> '%1 * %2'
+]]
+
+print(p:match"add(mul(a,b), apply(f,x))")   --> a * b + f(x)
+
+

+A text is a sequence of items, +wherein we apply a substitution capture to expand any macros. +An item is either a macro, +any character different from parentheses, +or a parenthesized expression. +A macro argument (arg) is a sequence +of items different from a comma. +(Note that a comma may appear inside an item, +e.g., inside a parenthesized expression.) +Again we do a substitution capture to expand any macro +in the argument before expanding the outer macro. +args is a list of arguments separated by commas. +Finally we define the macros. +Each macro is a string substitution; +it replaces the macro name and its arguments by its corresponding string, +with each %n replaced by the n-th argument. +

+ +

Patterns

+

+This example shows the complete syntax +of patterns accepted by re. +

+
+p = [=[
+
+pattern         <- exp !.
+exp             <- S (alternative / grammar)
+
+alternative     <- seq ('/' S seq)*
+seq             <- prefix*
+prefix          <- '&' S prefix / '!' S prefix / suffix
+suffix          <- primary S (([+*?]
+                            / '^' [+-]? num
+                            / '->' S (string / '{}' / name)
+                            / '=>' S name) S)*
+
+primary         <- '(' exp ')' / string / class / defined
+                 / '{:' (name ':')? exp ':}'
+                 / '=' name
+                 / '{}'
+                 / '{~' exp '~}'
+                 / '{' exp '}'
+                 / '.'
+                 / name S !arrow
+                 / '<' name '>'          -- old-style non terminals
+
+grammar         <- definition+
+definition      <- name S arrow exp
+
+class           <- '[' '^'? item (!']' item)* ']'
+item            <- defined / range / .
+range           <- . '-' [^]]
+
+S               <- (%s / '--' [^%nl]*)*   -- spaces and comments
+name            <- [A-Za-z][A-Za-z0-9_]*
+arrow           <- '<-'
+num             <- [0-9]+
+string          <- '"' [^"]* '"' / "'" [^']* "'"
+defined         <- '%' name
+
+]=]
+
+print(re.match(p, p))   -- a self description must match itself
+
+ + + +

License

+ +

+Copyright © 2008-2010 Lua.org, PUC-Rio. +

+

+Permission is hereby granted, free of charge, +to any person obtaining a copy of this software and +associated documentation files (the "Software"), +to deal in the Software without restriction, +including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, +and to permit persons to whom the Software is +furnished to do so, +subject to the following conditions: +

+ +

+The above copyright notice and this permission notice +shall be included in all copies or substantial portions of the Software. +

+ +

+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +

+ +
+ +
+ +
+

+$Id: re.html,v 1.15 2010/11/05 12:53:43 roberto Exp $ +

+
+ +
+ + + diff --git a/cosmic rage/dolapi.dll b/cosmic rage/dolapi.dll new file mode 100644 index 0000000..850a91b Binary files /dev/null and b/cosmic rage/dolapi.dll differ diff --git a/cosmic rage/fonts/banner.flf b/cosmic rage/fonts/banner.flf new file mode 100644 index 0000000..8fc3489 --- /dev/null +++ b/cosmic rage/fonts/banner.flf @@ -0,0 +1,2494 @@ +flf2a$ 8 7 54 0 12 0 64 185 +banner.flf version 2 by Ryan Youck (youck@cs.uregina.ca) +(From a unix program called banner) +I am not responsible for use of this font +Thanks to Glenn Chappell for his help +Katakana characters by Vinney Thai +Cyrillic characters from "koi8x8" BDF font. +Date: August 11, 1994 + +Merged by John Cowan +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + $ $@ + $ $@ + $ $@ + $ $@ + $ $@ + $ $@ + $ $@ + $ $@@ + ###$@ + ###$@ + ###$@ + # $@ + $@ + ###$@ + ###$@ + $@@ + ### ###$@ + ### ###$@ + # # $@ + $ $@ + $ $@ + $@ + $@ + $@@ + # # $@ + # # $@ + #######$@ + # # $@ + #######$@ + # # $@ + # # $@ + $@@ + ##### $@ + # # #$@ + # # $@ + ##### $@ + # #$@ + # # #$@ + ##### $@ + $@@ + ### #$@ + # # # $@ + ### # $@ + # $@ + # ###$@ + # # #$@ + # ###$@ + $@@ + ## $@ + # # $@ + ## $@ + ### $@ + # # #$@ + # # $@ + ### #$@ + $@@ + ###$@ + ###$@ + # $@ + # $@ + $@ + $@ + $@ + $@@ + ##$@ + # $@ + # $@ + # $@ + # $@ + # $@ + ##$@ + $@@ + ## $@ + # $@ + #$@ + #$@ + #$@ + # $@ + ## $@ + $@@ + $@ + # # $@ + # # $@ + #######$@ + # # $@ + # # $@ + $@ + $@@ + $@ + # $@ + # $@ + #####$@ + # $@ + # $@ + $@ + $@@ + $@ + $@ + $@ + $@ + ###$@ + ###$@ + # $@ + # $@@ + $@ + $@ + $@ + #####$@ + $@ + $@ + $@ + $@@ + $@ + $@ + $@ + $@ + ###$@ + ###$@ + ###$@ + $@@ + #$@ + # $@ + # $@ + # $@ + # $@ + # $@ + # $@ + $@@ + ### $@ + # # $@ + # #$@ + # #$@ + # #$@ + # # $@ + ### $@ + $@@ + # $@ + ## $@ + # # $@ + # $@ + # $@ + # $@ + #####$@ + $@@ + ##### $@ + # #$@ + #$@ + ##### $@ + # $@ + # $@ + #######$@ + $@@ + ##### $@ + # #$@ + #$@ + ##### $@ + #$@ + # #$@ + ##### $@ + $@@ + # $@ + # # $@ + # # $@ + # # $@ + #######$@ + # $@ + # $@ + $@@ + #######$@ + # $@ + # $@ + ###### $@ + #$@ + # #$@ + ##### $@ + $@@ + ##### $@ + # #$@ + # $@ + ###### $@ + # #$@ + # #$@ + ##### $@ + $@@ + #######$@ + # # $@ + # $@ + # $@ + # $@ + # $@ + # $@ + $@@ + ##### $@ + # #$@ + # #$@ + ##### $@ + # #$@ + # #$@ + ##### $@ + $@@ + ##### $@ + # #$@ + # #$@ + ######$@ + #$@ + # #$@ + ##### $@ + $@@ + # $@ + ###$@ + # $@ + $@ + # $@ + ###$@ + # $@ + $@@ + $@ + ###$@ + ###$@ + $@ + ###$@ + ###$@ + # $@ + # $@@ + #$@ + # $@ + # $@ + # $@ + # $@ + # $@ + #$@ + $@@ + $@ + $@ + #####$@ + $@ + #####$@ + $@ + $@ + $@@ + # $@ + # $@ + # $@ + #$@ + # $@ + # $@ + # $@ + $@@ + ##### $@ + # #$@ + #$@ + ### $@ + # $@ + $@ + # $@ + $@@ + ##### $@ + # #$@ + # ### #$@ + # ### #$@ + # #### $@ + # $@ + ##### $@ + $@@ + # $@ + # # $@ + # # $@ + # #$@ + #######$@ + # #$@ + # #$@ + $@@ + ###### $@ + # #$@ + # #$@ + ###### $@ + # #$@ + # #$@ + ###### $@ + $@@ + ##### $@ + # #$@ + # $@ + # $@ + # $@ + # #$@ + ##### $@ + $@@ + ###### $@ + # #$@ + # #$@ + # #$@ + # #$@ + # #$@ + ###### $@ + $@@ + #######$@ + # $@ + # $@ + ##### $@ + # $@ + # $@ + #######$@ + $@@ + #######$@ + # $@ + # $@ + ##### $@ + # $@ + # $@ + # $@ + $@@ + ##### $@ + # #$@ + # $@ + # ####$@ + # #$@ + # #$@ + ##### $@ + $@@ + # #$@ + # #$@ + # #$@ + #######$@ + # #$@ + # #$@ + # #$@ + $@@ + ###$@ + # $@ + # $@ + # $@ + # $@ + # $@ + ###$@ + $@@ + #$@ + #$@ + #$@ + #$@ + # #$@ + # #$@ + ##### $@ + $@@ + # #$@ + # # $@ + # # $@ + ### $@ + # # $@ + # # $@ + # #$@ + $@@ + # $@ + # $@ + # $@ + # $@ + # $@ + # $@ + #######$@ + $@@ + # #$@ + ## ##$@ + # # # #$@ + # # #$@ + # #$@ + # #$@ + # #$@ + $@@ + # #$@ + ## #$@ + # # #$@ + # # #$@ + # # #$@ + # ##$@ + # #$@ + $@@ + #######$@ + # #$@ + # #$@ + # #$@ + # #$@ + # #$@ + #######$@ + $@@ + ###### $@ + # #$@ + # #$@ + ###### $@ + # $@ + # $@ + # $@ + $@@ + ##### $@ + # #$@ + # #$@ + # #$@ + # # #$@ + # # $@ + #### #$@ + $@@ + ###### $@ + # #$@ + # #$@ + ###### $@ + # # $@ + # # $@ + # #$@ + $@@ + ##### $@ + # #$@ + # $@ + ##### $@ + #$@ + # #$@ + ##### $@ + $@@ + #######$@ + # $@ + # $@ + # $@ + # $@ + # $@ + # $@ + $@@ + # #$@ + # #$@ + # #$@ + # #$@ + # #$@ + # #$@ + ##### $@ + $@@ + # #$@ + # #$@ + # #$@ + # #$@ + # # $@ + # # $@ + # $@ + $@@ + # #$@ + # # #$@ + # # #$@ + # # #$@ + # # #$@ + # # #$@ + ## ## $@ + $@@ + # #$@ + # # $@ + # # $@ + # $@ + # # $@ + # # $@ + # #$@ + $@@ + # #$@ + # # $@ + # # $@ + # $@ + # $@ + # $@ + # $@ + $@@ + #######$@ + # $@ + # $@ + # $@ + # $@ + # $@ + #######$@ + $@@ + #####$@ + # $@ + # $@ + # $@ + # $@ + # $@ + #####$@ + $@@ + # $@ + # $@ + # $@ + # $@ + # $@ + # $@ + #$@ + $@@ + #####$@ + #$@ + #$@ + #$@ + #$@ + #$@ + #####$@ + $@@ + # $@ + # # $@ + # #$@ + $@ + $@ + $@ + $@ + $@@ + $@ + $@ + $@ + $@ + $@ + $@ + $@ + #######$@@ + ###$@ + ###$@ + # $@ + #$@ + $@ + $@ + $@ + $@@ + $@ + ## $@ + # # $@ + # #$@ + ######$@ + # #$@ + # #$@ + $@@ + $@ + ##### $@ + # #$@ + ##### $@ + # #$@ + # #$@ + ##### $@ + $@@ + $@ + #### $@ + # #$@ + # $@ + # $@ + # #$@ + #### $@ + $@@ + $@ + ##### $@ + # #$@ + # #$@ + # #$@ + # #$@ + ##### $@ + $@@ + $@ + ######$@ + # $@ + ##### $@ + # $@ + # $@ + ######$@ + $@@ + $@ + ######$@ + # $@ + ##### $@ + # $@ + # $@ + # $@ + $@@ + $@ + #### $@ + # #$@ + # $@ + # ###$@ + # #$@ + #### $@ + $@@ + $@ + # #$@ + # #$@ + ######$@ + # #$@ + # #$@ + # #$@ + $@@ + $@ + #$@ + #$@ + #$@ + #$@ + #$@ + #$@ + $@@ + $@ + #$@ + #$@ + #$@ + #$@ + # #$@ + #### $@ + $@@ + $@ + # #$@ + # # $@ + #### $@ + # # $@ + # # $@ + # #$@ + $@@ + $@ + # $@ + # $@ + # $@ + # $@ + # $@ + ######$@ + $@@ + $@ + # #$@ + ## ##$@ + # ## #$@ + # #$@ + # #$@ + # #$@ + $@@ + $@ + # #$@ + ## #$@ + # # #$@ + # # #$@ + # ##$@ + # #$@ + $@@ + $@ + #### $@ + # #$@ + # #$@ + # #$@ + # #$@ + #### $@ + $@@ + $@ + ##### $@ + # #$@ + # #$@ + ##### $@ + # $@ + # $@ + $@@ + $@ + #### $@ + # #$@ + # #$@ + # # #$@ + # # $@ + ### #$@ + $@@ + $@ + ##### $@ + # #$@ + # #$@ + ##### $@ + # # $@ + # #$@ + $@@ + $@ + #### $@ + # $@ + #### $@ + #$@ + # #$@ + #### $@ + $@@ + $@ + #####$@ + # $@ + # $@ + # $@ + # $@ + # $@ + $@@ + $@ + # #$@ + # #$@ + # #$@ + # #$@ + # #$@ + #### $@ + $@@ + $@ + # #$@ + # #$@ + # #$@ + # #$@ + # # $@ + ## $@ + $@@ + $@ + # #$@ + # #$@ + # #$@ + # ## #$@ + ## ##$@ + # #$@ + $@@ + $@ + # #$@ + # # $@ + ## $@ + ## $@ + # # $@ + # #$@ + $@@ + $@ + # #$@ + # # $@ + # $@ + # $@ + # $@ + # $@ + $@@ + $@ + ######$@ + # $@ + # $@ + # $@ + # $@ + ######$@ + $@@ + ###$@ + # $@ + # $@ + ## $@ + # $@ + # $@ + ###$@ + $@@ + #$@ + #$@ + #$@ + $@ + #$@ + #$@ + #$@ + $@@ + ### $@ + # $@ + # $@ + ##$@ + # $@ + # $@ + ### $@ + $@@ + ## $@ + # # #$@ + ## $@ + $@ + $@ + $@ + $@ + $@@ + # # #$@ + # # $@ + # # $@ + # #$@ + #######$@ + # #$@ + # #$@ + $@@ + # #$@ + ##### $@ + # #$@ + # #$@ + # #$@ + # #$@ + ##### $@ + $@@ + # #$@ + $@ + # #$@ + # #$@ + # #$@ + # #$@ + ##### $@ + $@@ + $@ + # #$@ + #### $@ + # #$@ + ######$@ + # #$@ + # #$@ + $@@ + $@ + # #$@ + #### $@ + # #$@ + # #$@ + # #$@ + #### $@ + $@@ + $@ + # #$@ + $@ + # #$@ + # #$@ + # #$@ + #### $@ + $@@ + ###### $@ + # #$@ + # #$@ + ###### $@ + # #$@ + # #$@ + ###### $@ + # $@@ +160 NO-BREAK SPACE + $@ + $@ + $@ + $@ + ########$@ + ## $@ + ## $@ + ## $@@ +169 COPYRIGHT SIGN + $@ + $@ + $@ + $@ + $@ + $@ + $@ + $@@ +176 DEGREE SIGN + $@ + $@ + $@ + $@ + ########$@ + $@ + $@ + $@@ +178 SUPERSCRIPT TWO + ## $@ + ## $@ + ## $@ + ## $@ + ########$@ + ## $@ + ## $@ + ## $@@ +183 MIDDLE DOT + ## $@ + ## $@ + #####$@ + ## $@ + #####$@ + ## $@ + ## $@ + ## $@@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + # # #$@ + # # $@ + # # $@ + # #$@ + #######$@ + # #$@ + # #$@ + $@@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + # #$@ + ##### $@ + # #$@ + # #$@ + # #$@ + # #$@ + ##### $@ + $@@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + # #$@ + $@ + # #$@ + # #$@ + # #$@ + # #$@ + ##### $@ + $@@ +223 LATIN SMALL LETTER SHARP S + ###### $@ + # #$@ + # #$@ + ###### $@ + # #$@ + # #$@ + ###### $@ + # $@@ +228 LATIN SMALL LETTER A WITH DIAERESIS + $@ + # #$@ + #### $@ + # #$@ + ######$@ + # #$@ + # #$@ + $@@ +246 LATIN SMALL LETTER O WITH DIAERESIS + $@ + # #$@ + #### $@ + # #$@ + # #$@ + # #$@ + #### $@ + $@@ +247 DIVISION SIGN + #### $@ + #### $@ + #### $@ + #### $@ + #####$@ + #### $@ + #### $@ + #### $@@ +252 LATIN SMALL LETTER U WITH DIAERESIS + $@ + # #$@ + $@ + # #$@ + # #$@ + # #$@ + #### $@ + $@@ +0x0401 CYRILLIC CAPITAL LETTER IO + ########$@ + ########$@ + ########$@ + ########$@ + ########$@ + ########$@ + ########$@ + ########$@@ +0x0410 CYRILLIC CAPITAL LETTER A + ####$@ + ## ##$@ + ## ##$@ + ## ##$@ + #######$@ + ## ##$@ + ## ##$@ + $@@ +0x0411 CYRILLIC CAPITAL LETTER BE + #######$@ + ## $@ + ## $@ + ###### $@ + ## ##$@ + ## ##$@ + ###### $@ + $@@ +0x0412 CYRILLIC CAPITAL LETTER VE + ###### $@ + ## ##$@ + ## ##$@ + ###### $@ + ## ##$@ + ## ##$@ + ###### $@ + $@@ +0x0413 CYRILLIC CAPITAL LETTER GHE + #######$@ + ## $@ + ## $@ + ## $@ + ## $@ + ## $@ + ## $@ + $@@ +0x0414 CYRILLIC CAPITAL LETTER DE + #### $@ + ## ## $@ + ## ## $@ + ## ## $@ + ## ## $@ + #######$@ + ## ##$@ + $@@ +0x0415 CYRILLIC CAPITAL LETTER IE + #######$@ + ## $@ + ## $@ + ###### $@ + ## $@ + ## $@ + #######$@ + $@@ +0x0416 CYRILLIC CAPITAL LETTER ZHE + ## # ##$@ + # # # $@ + ### $@ + ### $@ + # # # $@ + # # # $@ + ## # ##$@ + $@@ +0x0417 CYRILLIC CAPITAL LETTER ZE + ##### $@ + ## ##$@ + ##$@ + ## $@ + ##$@ + ## ##$@ + ##### $@ + $@@ +0x0418 CYRILLIC CAPITAL LETTER I + ## ##$@ + ## ###$@ + ## ###$@ + ## # ##$@ + ### ##$@ + ## ##$@ + ## ##$@ + $@@ +0x0419 CYRILLIC CAPITAL LETTER SHORT I + ## ## #$@ + ## ##$@ + ## ###$@ + ## # ##$@ + ### ##$@ + ## ##$@ + ## ##$@ + $@@ +0x041A CYRILLIC CAPITAL LETTER KA + ## ##$@ + ## ## $@ + ## ## $@ + ##### $@ + ## ## $@ + ## ##$@ + ## ##$@ + $@@ +0x041B CYRILLIC CAPITAL LETTER EL + #####$@ + ## ##$@ + ## ##$@ + ## ##$@ + ## ##$@ + ## ##$@ + ## ##$@ + $@@ +0x041C CYRILLIC CAPITAL LETTER EM + ## ##$@ + ## ##$@ + ### ###$@ + ## # ##$@ + ## ##$@ + ## ##$@ + ## ##$@ + $@@ +0x041D CYRILLIC CAPITAL LETTER EN + ## ##$@ + ## ##$@ + ## ##$@ + #######$@ + ## ##$@ + ## ##$@ + ## ##$@ + $@@ +0x041E CYRILLIC CAPITAL LETTER O + ##### $@ + ## ##$@ + ## ##$@ + ## ##$@ + ## ##$@ + ## ##$@ + ##### $@ + $@@ +0x041F CYRILLIC CAPITAL LETTER PE + #######$@ + ## ##$@ + ## ##$@ + ## ##$@ + ## ##$@ + ## ##$@ + ## ##$@ + $@@ +0x0420 CYRILLIC CAPITAL LETTER ER + ###### $@ + ## ##$@ + ## ##$@ + ###### $@ + ## $@ + ## $@ + ## $@ + $@@ +0x0421 CYRILLIC CAPITAL LETTER ES + ##### $@ + ## ##$@ + ## $@ + ## $@ + ## $@ + ## ##$@ + ##### $@ + $@@ +0x0422 CYRILLIC CAPITAL LETTER TE + ###### $@ + ## $@ + ## $@ + ## $@ + ## $@ + ## $@ + ## $@ + $@@ +0x0423 CYRILLIC CAPITAL LETTER U + ## ##$@ + ## ##$@ + ## ##$@ + ######$@ + ##$@ + ## ##$@ + ##### $@ + $@@ +0x0424 CYRILLIC CAPITAL LETTER EF + # $@ + ##### $@ + ## # ##$@ + ## # ##$@ + ## # ##$@ + ##### $@ + # $@ + $@@ +0x0425 CYRILLIC CAPITAL LETTER HA + ## ##$@ + ## ## $@ + ### $@ + ### $@ + ### $@ + ## ## $@ + ## ##$@ + $@@ +0x0426 CYRILLIC CAPITAL LETTER TSE + ## ## $@ + ## ## $@ + ## ## $@ + ## ## $@ + ## ## $@ + ## ## $@ + #######$@ + #$@@ +0x0427 CYRILLIC CAPITAL LETTER CHE + ## ##$@ + ## ##$@ + ## ##$@ + ######$@ + ##$@ + ##$@ + ##$@ + $@@ +0x0428 CYRILLIC CAPITAL LETTER SHA + ## # ##$@ + ## # ##$@ + ## # ##$@ + ## # ##$@ + ## # ##$@ + ## # ##$@ + #######$@ + $@@ +0x0429 CYRILLIC CAPITAL LETTER SHCHA + ## # ##$@ + ## # ##$@ + ## # ##$@ + ## # ##$@ + ## # ##$@ + ## # ##$@ + #######$@ + #$@@ +0x042A CYRILLIC CAPITAL LETTER HARD SIGN + ### $@ + ### $@ + ## $@ + ##### $@ + ## ##$@ + ## ##$@ + ##### $@ + $@@ +0x042B CYRILLIC CAPITAL LETTER YERU + ## ##$@ + ## ##$@ + ## ##$@ + #### #$@ + ## # #$@ + ## # #$@ + #### #$@ + $@@ +0x042C CYRILLIC CAPITAL LETTER SOFT SIGN + ## $@ + ## $@ + ## $@ + ###### $@ + ## ##$@ + ## ##$@ + ###### $@ + $@@ +0x042D CYRILLIC CAPITAL LETTER E + ##### $@ + ## ##$@ + ##$@ + #####$@ + ##$@ + ## ##$@ + ##### $@ + $@@ +0x042E CYRILLIC CAPITAL LETTER YU + ## ## $@ + ## # ##$@ + ## # ##$@ + #### ##$@ + ## # ##$@ + ## # ##$@ + ## ## $@ + $@@ +0x042F CYRILLIC CAPITAL LETTER YA + #####$@ + ## ##$@ + ## ##$@ + #####$@ + ## ##$@ + ## ##$@ + ## ##$@ + $@@ +0x0430 CYRILLIC SMALL LETTER A + $@ + $@ + #### $@ + ## $@ + ##### $@ + ## ## $@ + ######$@ + $@@ +0x0431 CYRILLIC SMALL LETTER BE + $@ + ## $@ + #### $@ + ## $@ + ###### $@ + ## ##$@ + ##### $@ + $@@ +0x0432 CYRILLIC SMALL LETTER VE + $@ + $@ + ##### $@ + ## ## $@ + ###### $@ + ## ##$@ + ###### $@ + $@@ +0x0433 CYRILLIC SMALL LETTER GHE + $@ + $@ + ##### $@ + ##$@ + ##### $@ + ## $@ + ######$@ + $@@ +0x0434 CYRILLIC SMALL LETTER DE + $@ + #### $@ + ##$@ + #####$@ + ## ##$@ + ## ##$@ + ##### $@ + $@@ +0x0435 CYRILLIC SMALL LETTER IE + $@ + $@ + ##### $@ + ## ##$@ + ###### $@ + ## $@ + ##### $@ + $@@ +0x0436 CYRILLIC SMALL LETTER ZHE + $@ + $@ + ## # ##$@ + # # # $@ + ### $@ + # # # $@ + ## # ##$@ + $@@ +0x0437 CYRILLIC SMALL LETTER ZE + $@ + $@ + ##### $@ + ## ##$@ + ### $@ + ## ##$@ + ##### $@ + $@@ +0x0438 CYRILLIC SMALL LETTER I + $@ + $@ + ## ##$@ + ## ###$@ + ## # ##$@ + ### ##$@ + ## ##$@ + $@@ +0x0439 CYRILLIC SMALL LETTER SHORT I + $@ + ## $@ + ## ##$@ + ## ###$@ + ## # ##$@ + ### ##$@ + ## ##$@ + $@@ +0x043A CYRILLIC SMALL LETTER KA + $@ + $@ + ## ##$@ + ## ## $@ + ##### $@ + ## ## $@ + ## ##$@ + $@@ +0x043B CYRILLIC SMALL LETTER EL + $@ + $@ + #####$@ + ## ##$@ + ## ##$@ + ## ##$@ + ## ##$@ + $@@ +0x043C CYRILLIC SMALL LETTER EM + $@ + $@ + ## ##$@ + ### ###$@ + ## # ##$@ + ## ##$@ + ## ##$@ + $@@ +0x043D CYRILLIC SMALL LETTER EN + $@ + $@ + ## ##$@ + ## ##$@ + #######$@ + ## ##$@ + ## ##$@ + $@@ +0x043E CYRILLIC SMALL LETTER O + $@ + $@ + ##### $@ + ## ##$@ + ## ##$@ + ## ##$@ + ##### $@ + $@@ +0x043F CYRILLIC SMALL LETTER PE + $@ + $@ + ###### $@ + ## ##$@ + ## ##$@ + ## ##$@ + ## ##$@ + $@@ +0x0440 CYRILLIC SMALL LETTER ER + $@ + $@ + ###### $@ + ## ##$@ + ###### $@ + ## $@ + ## $@ + $@@ +0x0441 CYRILLIC SMALL LETTER ES + $@ + $@ + ##### $@ + ## $@ + ## $@ + ## $@ + ##### $@ + $@@ +0x0442 CYRILLIC SMALL LETTER TE + $@ + $@ + ###### $@ + ## $@ + ## $@ + ## $@ + ## $@ + $@@ +0x0443 CYRILLIC SMALL LETTER U + $@ + $@ + ## ##$@ + ## ##$@ + ## ##$@ + ######$@ + ##$@ + ##### $@@ +0x0444 CYRILLIC SMALL LETTER EF + $@ + # $@ + ##### $@ + ## # ##$@ + ## # ##$@ + ##### $@ + # $@ + $@@ +0x0445 CYRILLIC SMALL LETTER HA + $@ + $@ + ## ##$@ + ## ## $@ + ### $@ + ## ## $@ + ## ##$@ + $@@ +0x0446 CYRILLIC SMALL LETTER TSE + $@ + $@ + ## ##$@ + ## ##$@ + ## ##$@ + ## ## $@ + ### ##$@ + #$@@ +0x0447 CYRILLIC SMALL LETTER CHE + $@ + $@ + ## ##$@ + ## ##$@ + ######$@ + ##$@ + ##$@ + $@@ +0x0448 CYRILLIC SMALL LETTER SHA + $@ + $@ + ## # ##$@ + ## # ##$@ + ## # ##$@ + ## # ##$@ + #######$@ + $@@ +0x0449 CYRILLIC SMALL LETTER SHCHA + $@ + $@ + ## # ##$@ + ## # ##$@ + ## # ##$@ + ## # ##$@ + #######$@ + #$@@ +0x044A CYRILLIC SMALL LETTER HARD SIGN + $@ + $@ + ### $@ + ## $@ + ##### $@ + ## ##$@ + ##### $@ + $@@ +0x044B CYRILLIC SMALL LETTER YERU + $@ + $@ + ## ##$@ + ## ##$@ + #### #$@ + ## # #$@ + #### #$@ + $@@ +0x044C CYRILLIC SMALL LETTER SOFT SIGN + $@ + $@ + ## $@ + ## $@ + ###### $@ + ## ##$@ + ###### $@ + $@@ +0x044D CYRILLIC SMALL LETTER E + $@ + $@ + ###### $@ + ##$@ + #####$@ + ##$@ + ###### $@ + $@@ +0x044E CYRILLIC SMALL LETTER YU + $@ + $@ + # ### $@ + # ## ##$@ + #### ##$@ + # ## ##$@ + # ### $@ + $@@ +0x044F CYRILLIC SMALL LETTER YA + $@ + $@ + #####$@ + ## ##$@ + #####$@ + ## ##$@ + ## ##$@ + $@@ +0x0451 CYRILLIC SMALL LETTER IO + $@ + $@ + ########$@ + $@ + #### ###$@ + ## ## $@ + ## ## $@ + ## ## $@@ +0x2219 BULLET OPERATOR + ## ##$@ + ## ##$@ + ## ##$@ + ## ##$@ + #######$@ + $@ + $@ + $@@ +0x221A SQUARE ROOT + ## $@ + ## $@ + ##### $@ + ## $@ + ##### $@ + $@ + $@ + $@@ +0x2248 ALMOST EQUAL TO + $@ + $@ + $@ + $@ + ##### $@ + ## $@ + ## $@ + ## $@@ +0x2264 LESS-THAN OR EQUAL TO + ## $@ + ## $@ + ## $@ + ## $@ + #####$@ + $@ + $@ + $@@ +0x2265 GREATER-THAN OR EQUAL TO + ## $@ + ## $@ + ## $@ + ## $@ + ########$@ + $@ + $@ + $@@ +0x2320 TOP HALF INTEGRAL + $@ + $@ + #######$@ + ##$@ + #### ##$@ + ## ##$@ + ## ##$@ + ## ##$@@ +0x2321 BOTTOM HALF INTEGRAL + ## $@ + ## $@ + ## $@ + ## $@ + #####$@ + ## $@ + ## $@ + ## $@@ +0x2500 BOX DRAWINGS LIGHT HORIZONTAL + ## $@ + $@ + ## $@ + ## $@ + ## $@ + ## ##$@ + #### $@ + $@@ +0x2502 BOX DRAWINGS LIGHT VERTICAL + $@ + $@ + $@ + ######$@ + ## $@ + ## $@ + $@ + $@@ +0x250C BOX DRAWINGS LIGHT DOWN AND RIGHT + $@ + $@ + $@ + ######$@ + ##$@ + ##$@ + $@ + $@@ +0x2510 BOX DRAWINGS LIGHT DOWN AND LEFT + ## ##$@ + ## ## $@ + ## ## $@ + ## #### $@ + ## ##$@ + ## ## $@ + ## ## $@ + ####$@@ +0x2514 BOX DRAWINGS LIGHT UP AND RIGHT + ## ##$@ + ## ## $@ + ## ## $@ + ## ## ##$@ + ## ###$@ + ## ####$@ + ## ####$@ + ##$@@ +0x2518 BOX DRAWINGS LIGHT UP AND LEFT + ## $@ + ## $@ + $@ + ## $@ + ## $@ + ## $@ + ## $@ + $@@ +0x251C BOX DRAWINGS LIGHT VERTICAL AND RIGHT + $@ + ## ##$@ + ## ## $@ + ## ## $@ + ## ## $@ + ## ##$@ + $@ + $@@ +0x2524 BOX DRAWINGS LIGHT VERTICAL AND LEFT + $@ + ## ## $@ + ## ## $@ + ## ##$@ + ## ## $@ + ## ## $@ + $@ + $@@ +0x252C BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + # #$@ + # # $@ + # #$@ + # # $@ + # #$@ + # # $@ + # #$@ + # # $@@ +0x2534 BOX DRAWINGS LIGHT UP AND HORIZONTAL + # # # #$@ + # # # # $@ + # # # #$@ + # # # # $@ + # # # #$@ + # # # # $@ + # # # #$@ + # # # # $@@ +0x253C BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + ## ## ##$@ + ### ###$@ + ## ## ##$@ + ### ### $@ + ## ## ##$@ + ### ###$@ + ## ## ##$@ + ### ### $@@ +0x2550 BOX DRAWINGS DOUBLE HORIZONTAL + ## ## $@ + ## ## $@ + ## ###$@ + ## $@ + ######$@ + $@ + $@ + $@@ +0x2551 BOX DRAWINGS DOUBLE VERTICAL + $@ + $@ + ######$@ + ## $@ + ## ###$@ + ## ## $@ + ## ## $@ + ## ## $@@ +0x2552 BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + ## ## $@ + ## ## $@ + #### ###$@ + $@ + ########$@ + $@ + $@ + $@@ +0x2553 BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + #### $@ + #### $@ + #####$@ + ## $@ + #####$@ + #### $@ + #### $@ + #### $@@ +0x2554 BOX DRAWINGS DOUBLE DOWN AND RIGHT + $@ + $@ + ########$@ + $@ + ########$@ + $@ + $@ + $@@ +0x2555 BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + #### $@ + #### $@ + #######$@ + $@ + #######$@ + #### $@ + #### $@ + #### $@@ +0x2556 BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + ## $@ + ## $@ + ########$@ + $@ + ########$@ + $@ + $@ + $@@ +0x2557 BOX DRAWINGS DOUBLE DOWN AND LEFT + ## ## $@ + ## ## $@ + ## ## $@ + ## ## $@ + ########$@ + $@ + $@ + $@@ +0x2558 BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + $@ + $@ + ########$@ + $@ + ########$@ + ## $@ + ## $@ + ## $@@ +0x2559 BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + $@ + $@ + $@ + $@ + ########$@ + ## ## $@ + ## ## $@ + ## ## $@@ +0x255A BOX DRAWINGS DOUBLE UP AND RIGHT + ## ## $@ + ## ## $@ + ## ## $@ + ## ## $@ + ######$@ + $@ + $@ + $@@ +0x255B BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + ## $@ + ## $@ + #####$@ + ## $@ + #####$@ + $@ + $@ + $@@ +0x255C BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + $@ + $@ + #####$@ + ## $@ + #####$@ + ## $@ + ## $@ + ## $@@ +0x255D BOX DRAWINGS DOUBLE UP AND LEFT + $@ + $@ + $@ + $@ + ######$@ + ## ## $@ + ## ## $@ + ## ## $@@ +0x255E BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + ## ## $@ + ## ## $@ + ## ## $@ + ## ## $@ + ########$@ + ## ## $@ + ## ## $@ + ## ## $@@ +0x255F BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + ## $@ + ## $@ + ########$@ + ## $@ + ########$@ + ## $@ + ## $@ + ## $@@ +0x2560 BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + ## $@ + ## $@ + ## $@ + ## $@ + ##### $@ + $@ + $@ + $@@ +0x2561 BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + $@ + $@ + $@ + $@ + #####$@ + ## $@ + ## $@ + ## $@@ +0x2562 BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + $@ + $@ + $@ + $@ + ########$@ + ########$@ + ########$@ + ########$@@ +0x2563 BOX DRAWINGS DOUBLE VERTICAL AND LEFT + #### $@ + #### $@ + #### $@ + #### $@ + #### $@ + #### $@ + #### $@ + #### $@@ +0x2564 BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + ####$@ + ####$@ + ####$@ + ####$@ + ####$@ + ####$@ + ####$@ + ####$@@ +0x2565 BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + ########$@ + ########$@ + ########$@ + ########$@ + $@ + $@ + $@ + $@@ +0x2566 BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + ### $@ + ## ## $@ + ## ## $@ + ### $@ + $@ + $@ + $@ + $@@ +0x2567 BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + $@ + $@ + $@ + ## $@ + ## $@ + $@ + $@ + $@@ +0x2568 BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + $@ + $@ + $@ + $@ + ## $@ + $@ + $@ + $@@ +0x2569 BOX DRAWINGS DOUBLE UP AND HORIZONTAL + ####$@ + ## $@ + ## $@ + ## $@ + ### ## $@ + ## ## $@ + #### $@ + ### $@@ +0x256A BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + #### $@ + ## ## $@ + ## ## $@ + ## ## $@ + ## ## $@ + $@ + $@ + $@@ +0x256B BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE + ### $@ + ## $@ + ## $@ + ## $@ + #### $@ + $@ + $@ + $@@ +0x256C BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + $@ + $@ + #### $@ + #### $@ + #### $@ + #### $@ + $@ + $@@ +0x2580 UPPER HALF BLOCK + ## $@ + ## $@ + ## $@ + ## $@ + ## $@ + ## $@ + ## $@ + ## $@@ +0x2584 LOWER HALF BLOCK + ## $@ + ## $@ + ## $@ + ## $@ + ##### $@ + ## $@ + ## $@ + ## $@@ +0x2588 FULL BLOCK + ## $@ + ## $@ + ##### $@ + ## $@ + ##### $@ + ## $@ + ## $@ + ## $@@ +0x258C LEFT HALF BLOCK + ####$@ + ####$@ + ####$@ + ####$@ + ######$@ + ####$@ + ####$@ + ####$@@ +0x2590 RIGHT HALF BLOCK + $@ + $@ + $@ + $@ + #######$@ + ## ##$@ + ## ##$@ + ## ##$@@ +0x2591 LIGHT SHADE + $@ + $@ + ##### $@ + ## $@ + ##### $@ + ## $@ + ## $@ + ## $@@ +0x2592 MEDIUM SHADE + ####$@ + ####$@ + ######$@ + ##$@ + ######$@ + ####$@ + ####$@ + ####$@@ +0x2593 DARK SHADE + ####$@ + ####$@ + ####$@ + ####$@ + ####$@ + ####$@ + ####$@ + ####$@@ +0x25A0 BLACK SQUARE + ## ##$@ + ## ##$@ + #### ##$@ + ##$@ + #######$@ + $@ + $@ + $@@ +0x30A2 A + ##########$@ + ### $@ + # $@ + # $@ + # $@ + # $@ + # $@ + $@@ +0x30A4 I + ##$@ + ## $@ + ## # $@ + ## # $@ + # $@ + # $@ + # $@ + $@@ +0x30A6 U + # $@ + ##########$@ + # #$@ + ## $@ + ## $@ + ## $@ + ## $@ + $@@ +0x30A8 E + $@ + ####### $@ + # $@ + # $@ + # $@ + # $@ + ##########$@ + $@@ +0x30AA O + # $@ + ##########$@ + ## $@ + ## # $@ + ## # $@ + ## ## $@ + # $@ + $@@ +0x30AB KA + # $@ + ##########$@ + # #$@ + # #$@ + # #$@ + # # # $@ + # # $@ + $@@ +0x30AD KI + # # $@ + # # $@ + # # # $@ + # $@ + # # $@ + # # $@ + #$@ + $@@ +0x30AF KU + # $@ + ########$@ + # #$@ + # ## $@ + ## $@ + ## $@ + ## $@ + $@@ +0x30B1 KE + # $@ + ########$@ + # # $@ + # # $@ + # $@ + # $@ + # $@ + $@@ +0x30B3 KO + $@ + ##########$@ + #$@ + #$@ + #$@ + #$@ + ######### $@ + $@@ +0x30B5 SA + # # $@ + ##########$@ + # # $@ + # $@ + # $@ + # $@ + # $@ + $@@ +0x30B7 SI (SHI) + # #$@ + # # # $@ + # # $@ + ## $@ + ## $@ + ## $@ + ## $@ + $@@ +0x30B9 SU + ########$@ + #$@ + # $@ + ## $@ + ## # $@ + ## # $@ + # #$@ + $@@ +0x30BB SE + # $@ + # $@ + ##########$@ + # # $@ + # $@ + # $@ + ###### $@ + $@@ +0x30BD SO + # #$@ + # #$@ + # $@ + # $@ + ## $@ + ## $@ + ## $@ + $@@ +0x30BF TA + # $@ + #######$@ + # # $@ + # # # $@ + ### $@ + ## $@ + ## $@ + $@@ +0x30C1 TI (CHI) + ## $@ + ###### $@ + # $@ + ##########$@ + # $@ + # $@ + ## $@ + $@@ +0x30C4 TU (TSU) + # # #$@ + # # #$@ + # $@ + # $@ + ## $@ + ## $@ + ## $@ + $@@ +0x30C6 TE + ###### $@ + $@ + ##########$@ + # $@ + # $@ + # $@ + ## $@ + $@@ +0x30C8 TO + # $@ + # $@ + ## $@ + # # $@ + # #$@ + # $@ + # $@ + $@@ +0x30CA NA + # $@ + ##########$@ + # $@ + # $@ + # $@ + # $@ + ## $@ + $@@ +0x30CB NI + $@ + $@ + ###### $@ + $@ + $@ + ##########$@ + $@ + $@@ +0x30CC NU + ##########$@ + #$@ + # # $@ + # ## $@ + ## $@ + ## # $@ + ## # $@ + $@@ +0x30CD NE + # $@ + ##########$@ + # $@ + ### $@ + ###### $@ + ## # ##$@ + # $@ + $@@ +0x30CE NO + #$@ + #$@ + # $@ + # $@ + ## $@ + ## $@ + ## $@ + $@@ +0x30CF HA + $@ + $@ + # # $@ + # # $@ + # #$@ + # $@ + $@ + $@@ +0x30D2 HI + # $@ + # ### $@ + #### $@ + # $@ + # $@ + # $@ + #######$@ + $@@ +0x30D5 HU (FU) + ########$@ + #$@ + #$@ + # $@ + ## $@ + ## $@ + ## $@ + $@@ +0x30D8 HE + $@ + $@ + ## $@ + # ## $@ + # ## $@ + ##$@ + $@ + $@@ +0x30DB HO + # $@ + ##########$@ + # $@ + # # # $@ + # # # $@ + # ## #$@ + # $@ + $@@ +0x30DE MA + $@ + ##########$@ + # $@ + # $@ + # # $@ + # $@ + # $@ + $@@ +0x30DF MI + #### $@ + ##$@ + ### $@ + ###$@ + $@ + ### $@ + ###$@ + $@@ +0x30E0 MU + # $@ + # $@ + # $@ + # $@ + # # $@ + ######### $@ + #$@ + $@@ +0x30E1 ME + #$@ + # $@ + # # $@ + # # $@ + # $@ + ## # $@ + ## # $@ + $@@ +0x30E2 MO + ###### $@ + # $@ + ##########$@ + # $@ + # $@ + # $@ + #### $@ + $@@ +0x30E4 YA + # ## $@ + # ## # $@ + ### $@ + # # $@ + # $@ + # $@ + # $@ + $@@ +0x30E6 YU + $@ + ###### $@ + # $@ + # $@ + # $@ + ##########$@ + $@ + $@@ +0x30E8 YO + $@ + ###### $@ + # $@ + # $@ + # $@ + ##########$@ + $@ + $@@ +0x30E9 RA + ###### $@ + $@ + ##########$@ + # #$@ + ## $@ + ## $@ + ## $@ + $@@ +0x30EA RI + # #$@ + # #$@ + # #$@ + # #$@ + # $@ + # $@ + ## $@ + $@@ +0x30EB RU + # # $@ + # # $@ + # # $@ + # # #$@ + # # # $@ + # # # $@ + # ## $@ + $@@ +0x30EC RE + # $@ + # $@ + # $@ + # ##$@ + # ## $@ + # ## $@ + ## $@ + $@@ +0x30ED RO + $@ + #########$@ + # #$@ + # #$@ + # #$@ + #########$@ + $@ + $@@ +0x30EF WA + ##########$@ + # #$@ + # $@ + # $@ + # $@ + ## $@ + ## $@ + $@@ +0x30F0 WI + # $@ + ####### $@ + # # $@ + # # $@ + ##########$@ + # $@ + # $@ + $@@ +0x30F1 WE + #########$@ + #$@ + #$@ + ######## $@ + # $@ + # $@ + ######## $@ + $@@ +0x30F2 WO + ##########$@ + #$@ + # $@ + ######## $@ + ## $@ + ## $@ + ## $@ + $@@ +0x30F3 N + #$@ + # #$@ + # # $@ + # $@ + ## $@ + ## $@ + ## $@ + $@@ +-0x0004 KATAMAP + @ +a-A i-B u-C e-D o-E ka-F ki-G ku-H ke-I ko-J @ +sa-K shi-L su-M se-N so-O ta-P chi-Q tsu-R te-S to-T@ +na-U ni-V nu-W ne-X no-Y ha-Z hi-a fu-b he-c ho-d @ +ma-e mi-f mu-g me-h mo-i ya-j yu-k we-l yo-m @ +ra-n ri-o ru-p re-q ro-r wa-s wi-t wo-u @ +n-v @ + @@ +-0x0006 MOSCOWMAP +a-a, b-b, v-v, g-g, d-d, e-e, zh-j, z-z, i-i@ +short i->, k-k, l-l, m-m, n-n, o-o, p-p, r-r@ +s-s, t-t, u-u, f-f, kh-h, ts-q, ch-c, sh-w @ +shch-x, hard-\, yeru-|, soft-/, reverse e-~ @ +yu-`, ya-y @ +Capitals use Latin capital letters, except: @ +Reverse E-<, Yu-@ @ +No caps for short i, hard, yeru, soft. @@ diff --git a/cosmic rage/fonts/big.flf b/cosmic rage/fonts/big.flf new file mode 100644 index 0000000..07c468c --- /dev/null +++ b/cosmic rage/fonts/big.flf @@ -0,0 +1,2204 @@ +flf2a$ 8 6 59 15 10 0 24463 153 +Big by Glenn Chappell 4/93 -- based on Standard +Includes ISO Latin-1 +Greek characters by Bruce Jakeway +figlet release 2.2 -- November 1996 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + $@ + $@ + $@ + $@ + $@ + $@ + $@ + $@@ + _ @ + | |@ + | |@ + | |@ + |_|@ + (_)@ + @ + @@ + _ _ @ + ( | )@ + V V @ + $ @ + $ @ + $ @ + @ + @@ + _ _ @ + _| || |_ @ + |_ __ _|@ + _| || |_ @ + |_ __ _|@ + |_||_| @ + @ + @@ + _ @ + | | @ + / __)@ + \__ \@ + ( /@ + |_| @ + @ + @@ + _ __@ + (_) / /@ + / / @ + / / @ + / / _ @ + /_/ (_)@ + @ + @@ + @ + ___ @ + ( _ ) @ + / _ \/\@ + | (_> <@ + \___/\/@ + @ + @@ + _ @ + ( )@ + |/ @ + $ @ + $ @ + $ @ + @ + @@ + __@ + / /@ + | | @ + | | @ + | | @ + | | @ + \_\@ + @@ + __ @ + \ \ @ + | |@ + | |@ + | |@ + | |@ + /_/ @ + @@ + _ @ + /\| |/\ @ + \ ` ' / @ + |_ _|@ + / , . \ @ + \/|_|\/ @ + @ + @@ + @ + _ @ + _| |_ @ + |_ _|@ + |_| @ + $ @ + @ + @@ + @ + @ + @ + @ + _ @ + ( )@ + |/ @ + @@ + @ + @ + ______ @ + |______|@ + $ @ + $ @ + @ + @@ + @ + @ + @ + @ + _ @ + (_)@ + @ + @@ + __@ + / /@ + / / @ + / / @ + / / @ + /_/ @ + @ + @@ + ___ @ + / _ \ @ + | | | |@ + | | | |@ + | |_| |@ + \___/ @ + @ + @@ + __ @ + /_ |@ + | |@ + | |@ + | |@ + |_|@ + @ + @@ + ___ @ + |__ \ @ + $) |@ + / / @ + / /_ @ + |____|@ + @ + @@ + ____ @ + |___ \ @ + __) |@ + |__ < @ + ___) |@ + |____/ @ + @ + @@ + _ _ @ + | || | @ + | || |_ @ + |__ _|@ + | | @ + |_| @ + @ + @@ + _____ @ + | ____|@ + | |__ @ + |___ \ @ + ___) |@ + |____/ @ + @ + @@ + __ @ + / / @ + / /_ @ + | '_ \ @ + | (_) |@ + \___/ @ + @ + @@ + ______ @ + |____ |@ + $/ / @ + / / @ + / / @ + /_/ @ + @ + @@ + ___ @ + / _ \ @ + | (_) |@ + > _ < @ + | (_) |@ + \___/ @ + @ + @@ + ___ @ + / _ \ @ + | (_) |@ + \__, |@ + / / @ + /_/ @ + @ + @@ + @ + _ @ + (_)@ + $ @ + _ @ + (_)@ + @ + @@ + @ + _ @ + (_)@ + $ @ + _ @ + ( )@ + |/ @ + @@ + __@ + / /@ + / / @ + < < @ + \ \ @ + \_\@ + @ + @@ + @ + ______ @ + |______|@ + ______ @ + |______|@ + @ + @ + @@ + __ @ + \ \ @ + \ \ @ + > >@ + / / @ + /_/ @ + @ + @@ + ___ @ + |__ \ @ + ) |@ + / / @ + |_| @ + (_) @ + @ + @@ + @ + ____ @ + / __ \ @ + / / _` |@ + | | (_| |@ + \ \__,_|@ + \____/ @ + @@ + @ + /\ @ + / \ @ + / /\ \ @ + / ____ \ @ + /_/ \_\@ + @ + @@ + ____ @ + | _ \ @ + | |_) |@ + | _ < @ + | |_) |@ + |____/ @ + @ + @@ + _____ @ + / ____|@ + | | $ @ + | | $ @ + | |____ @ + \_____|@ + @ + @@ + _____ @ + | __ \ @ + | | | |@ + | | | |@ + | |__| |@ + |_____/ @ + @ + @@ + ______ @ + | ____|@ + | |__ @ + | __| @ + | |____ @ + |______|@ + @ + @@ + ______ @ + | ____|@ + | |__ @ + | __| @ + | | @ + |_| @ + @ + @@ + _____ @ + / ____|@ + | | __ @ + | | |_ |@ + | |__| |@ + \_____|@ + @ + @@ + _ _ @ + | | | |@ + | |__| |@ + | __ |@ + | | | |@ + |_| |_|@ + @ + @@ + _____ @ + |_ _|@ + | | @ + | | @ + _| |_ @ + |_____|@ + @ + @@ + _ @ + | |@ + | |@ + _ | |@ + | |__| |@ + \____/ @ + @ + @@ + _ __@ + | |/ /@ + | ' / @ + | < @ + | . \ @ + |_|\_\@ + @ + @@ + _ @ + | | @ + | | @ + | | @ + | |____ @ + |______|@ + @ + @@ + __ __ @ + | \/ |@ + | \ / |@ + | |\/| |@ + | | | |@ + |_| |_|@ + @ + @@ + _ _ @ + | \ | |@ + | \| |@ + | . ` |@ + | |\ |@ + |_| \_|@ + @ + @@ + ____ @ + / __ \ @ + | | | |@ + | | | |@ + | |__| |@ + \____/ @ + @ + @@ + _____ @ + | __ \ @ + | |__) |@ + | ___/ @ + | | @ + |_| @ + @ + @@ + ____ @ + / __ \ @ + | | | |@ + | | | |@ + | |__| |@ + \___\_\@ + @ + @@ + _____ @ + | __ \ @ + | |__) |@ + | _ / @ + | | \ \ @ + |_| \_\@ + @ + @@ + _____ @ + / ____|@ + | (___ @ + \___ \ @ + ____) |@ + |_____/ @ + @ + @@ + _______ @ + |__ __|@ + | | @ + | | @ + | | @ + |_| @ + @ + @@ + _ _ @ + | | | |@ + | | | |@ + | | | |@ + | |__| |@ + \____/ @ + @ + @@ + __ __@ + \ \ / /@ + \ \ / / @ + \ \/ / @ + \ / @ + \/ @ + @ + @@ + __ __@ + \ \ / /@ + \ \ /\ / / @ + \ \/ \/ / @ + \ /\ / @ + \/ \/ @ + @ + @@ + __ __@ + \ \ / /@ + \ V / @ + > < @ + / . \ @ + /_/ \_\@ + @ + @@ + __ __@ + \ \ / /@ + \ \_/ / @ + \ / @ + | | @ + |_| @ + @ + @@ + ______@ + |___ /@ + $/ / @ + / / @ + / /__ @ + /_____|@ + @ + @@ + ___ @ + | _|@ + | | @ + | | @ + | | @ + | |_ @ + |___|@ + @@ + __ @ + \ \ @ + \ \ @ + \ \ @ + \ \ @ + \_\@ + @ + @@ + ___ @ + |_ |@ + | |@ + | |@ + | |@ + _| |@ + |___|@ + @@ + /\ @ + |/\|@ + $ @ + $ @ + $ @ + $ @ + @ + @@ + @ + @ + @ + @ + @ + $ @ + ______ @ + |______|@@ + _ @ + ( )@ + \|@ + $ @ + $ @ + $ @ + @ + @@ + @ + @ + __ _ @ + / _` |@ + | (_| |@ + \__,_|@ + @ + @@ + _ @ + | | @ + | |__ @ + | '_ \ @ + | |_) |@ + |_.__/ @ + @ + @@ + @ + @ + ___ @ + / __|@ + | (__ @ + \___|@ + @ + @@ + _ @ + | |@ + __| |@ + / _` |@ + | (_| |@ + \__,_|@ + @ + @@ + @ + @ + ___ @ + / _ \@ + | __/@ + \___|@ + @ + @@ + __ @ + / _|@ + | |_ @ + | _|@ + | | @ + |_| @ + @ + @@ + @ + @ + __ _ @ + / _` |@ + | (_| |@ + \__, |@ + __/ |@ + |___/ @@ + _ @ + | | @ + | |__ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @ + @@ + _ @ + (_)@ + _ @ + | |@ + | |@ + |_|@ + @ + @@ + _ @ + (_)@ + _ @ + | |@ + | |@ + | |@ + _/ |@ + |__/ @@ + _ @ + | | @ + | | __@ + | |/ /@ + | < @ + |_|\_\@ + @ + @@ + _ @ + | |@ + | |@ + | |@ + | |@ + |_|@ + @ + @@ + @ + @ + _ __ ___ @ + | '_ ` _ \ @ + | | | | | |@ + |_| |_| |_|@ + @ + @@ + @ + @ + _ __ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @ + @@ + @ + @ + ___ @ + / _ \ @ + | (_) |@ + \___/ @ + @ + @@ + @ + @ + _ __ @ + | '_ \ @ + | |_) |@ + | .__/ @ + | | @ + |_| @@ + @ + @ + __ _ @ + / _` |@ + | (_| |@ + \__, |@ + | |@ + |_|@@ + @ + @ + _ __ @ + | '__|@ + | | @ + |_| @ + @ + @@ + @ + @ + ___ @ + / __|@ + \__ \@ + |___/@ + @ + @@ + _ @ + | | @ + | |_ @ + | __|@ + | |_ @ + \__|@ + @ + @@ + @ + @ + _ _ @ + | | | |@ + | |_| |@ + \__,_|@ + @ + @@ + @ + @ + __ __@ + \ \ / /@ + \ V / @ + \_/ @ + @ + @@ + @ + @ + __ __@ + \ \ /\ / /@ + \ V V / @ + \_/\_/ @ + @ + @@ + @ + @ + __ __@ + \ \/ /@ + > < @ + /_/\_\@ + @ + @@ + @ + @ + _ _ @ + | | | |@ + | |_| |@ + \__, |@ + __/ |@ + |___/ @@ + @ + @ + ____@ + |_ /@ + / / @ + /___|@ + @ + @@ + __@ + / /@ + | | @ + / / @ + \ \ @ + | | @ + \_\@ + @@ + _ @ + | |@ + | |@ + | |@ + | |@ + | |@ + | |@ + |_|@@ + __ @ + \ \ @ + | | @ + \ \@ + / /@ + | | @ + /_/ @ + @@ + /\/|@ + |/\/ @ + $ @ + $ @ + $ @ + $ @ + @ + @@ + _ _ @ + (_)_(_) @ + / \ @ + / _ \ @ + / ___ \ @ + /_/ \_\@ + @ + @@ + _ _ @ + (_)_(_)@ + / _ \ @ + | | | |@ + | |_| |@ + \___/ @ + @ + @@ + _ _ @ + (_) (_)@ + | | | |@ + | | | |@ + | |_| |@ + \___/ @ + @ + @@ + _ _ @ + (_) (_)@ + __ _ @ + / _` |@ + | (_| |@ + \__,_|@ + @ + @@ + _ _ @ + (_) (_)@ + ___ @ + / _ \ @ + | (_) |@ + \___/ @ + @ + @@ + _ _ @ + (_) (_)@ + _ _ @ + | | | |@ + | |_| |@ + \__,_|@ + @ + @@ + ___ @ + / _ \ @ + | | ) |@ + | |< < @ + | | ) |@ + | ||_/ @ + |_| @ + @@ +160 NO-BREAK SPACE + $@ + $@ + $@ + $@ + $@ + $@ + $@ + $@@ +161 INVERTED EXCLAMATION MARK + _ @ + (_)@ + | |@ + | |@ + | |@ + |_|@ + @ + @@ +162 CENT SIGN + @ + _ @ + | | @ + / __)@ + | (__ @ + \ )@ + |_| @ + @@ +163 POUND SIGN + ___ @ + / ,_\ @ + _| |_ @ + |__ __| @ + | |____ @ + (_,_____|@ + @ + @@ +164 CURRENCY SIGN + @ + /\___/\@ + \ _ /@ + | (_) |@ + / ___ \@ + \/ \/@ + @ + @@ +165 YEN SIGN + __ __ @ + \ \ / / @ + _\ V /_ @ + |___ ___|@ + |___ ___|@ + |_| @ + @ + @@ +166 BROKEN BAR + _ @ + | |@ + | |@ + |_|@ + _ @ + | |@ + | |@ + |_|@@ +167 SECTION SIGN + __ @ + _/ _)@ + / \ \ @ + \ \\ \@ + \ \_/@ + (__/ @ + @ + @@ +168 DIAERESIS + _ _ @ + (_) (_)@ + $ $ @ + $ $ @ + $ $ @ + $ $ @ + @ + @@ +169 COPYRIGHT SIGN + ________ @ + / ____ \ @ + / / ___| \ @ + | | | |@ + | | |___ |@ + \ \____| / @ + \________/ @ + @@ +170 FEMININE ORDINAL INDICATOR + __ _ @ + / _` |@ + | (_| |@ + \__,_|@ + |_____|@ + $ @ + @ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + ____@ + / / /@ + / / / @ + < < < @ + \ \ \ @ + \_\_\@ + @ + @@ +172 NOT SIGN + @ + @ + ______ @ + |____ |@ + |_|@ + $ @ + @ + @@ +173 SOFT HYPHEN + @ + @ + _____ @ + |_____|@ + $ @ + $ @ + @ + @@ +174 REGISTERED SIGN + ________ @ + / ____ \ @ + / | _ \ \ @ + | | |_) | |@ + | | _ < |@ + \ |_| \_\ / @ + \________/ @ + @@ +175 MACRON + ______ @ + |______|@ + $ @ + $ @ + $ @ + $ @ + @ + @@ +176 DEGREE SIGN + __ @ + / \ @ + | () |@ + \__/ @ + $ @ + $ @ + @ + @@ +177 PLUS-MINUS SIGN + _ @ + _| |_ @ + |_ _|@ + |_| @ + _____ @ + |_____|@ + @ + @@ +178 SUPERSCRIPT TWO + ___ @ + |_ )@ + / / @ + /___|@ + $ @ + $ @ + @ + @@ +179 SUPERSCRIPT THREE + ____@ + |__ /@ + |_ \@ + |___/@ + $ @ + $ @ + @ + @@ +180 ACUTE ACCENT + __@ + /_/@ + $ @ + $ @ + $ @ + $ @ + @ + @@ +181 MICRO SIGN + @ + @ + _ _ @ + | | | |@ + | |_| |@ + | ._,_|@ + | | @ + |_| @@ +182 PILCROW SIGN + ______ @ + / |@ + | (| || |@ + \__ || |@ + | || |@ + |_||_|@ + @ + @@ +183 MIDDLE DOT + @ + @ + _ @ + (_)@ + $ @ + $ @ + @ + @@ +184 CEDILLA + @ + @ + @ + @ + @ + _ @ + )_)@ + @@ +185 SUPERSCRIPT ONE + _ @ + / |@ + | |@ + |_|@ + $ @ + $ @ + @ + @@ +186 MASCULINE ORDINAL INDICATOR + ___ @ + / _ \ @ + | (_) |@ + \___/ @ + |_____|@ + $ @ + @ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + ____ @ + \ \ \ @ + \ \ \ @ + > > >@ + / / / @ + /_/_/ @ + @ + @@ +188 VULGAR FRACTION ONE QUARTER + _ __ @ + / | / / @ + | |/ / _ @ + |_/ / | | @ + / /|_ _|@ + /_/ |_| @ + @ + @@ +189 VULGAR FRACTION ONE HALF + _ __ @ + / | / / @ + | |/ /__ @ + |_/ /_ )@ + / / / / @ + /_/ /___|@ + @ + @@ +190 VULGAR FRACTION THREE QUARTERS + ____ __ @ + |__ / / / @ + |_ \/ / _ @ + |___/ / | | @ + / /|_ _|@ + /_/ |_| @ + @ + @@ +191 INVERTED QUESTION MARK + _ @ + (_) @ + | | @ + / / @ + | (__ @ + \___|@ + @ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + __ @ + \_\ @ + / \ @ + / _ \ @ + / ___ \ @ + /_/ \_\@ + @ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + __ @ + /_/ @ + / \ @ + / _ \ @ + / ___ \ @ + /_/ \_\@ + @ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + //\ @ + |/_\| @ + / \ @ + / _ \ @ + / ___ \ @ + /_/ \_\@ + @ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + /\/| @ + |/\/ @ + / \ @ + / _ \ @ + / ___ \ @ + /_/ \_\@ + @ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _ _ @ + (_)_(_) @ + / \ @ + / _ \ @ + / ___ \ @ + /_/ \_\@ + @ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + _ @ + (o) @ + / \ @ + / _ \ @ + / ___ \ @ + /_/ \_\@ + @ + @@ +198 LATIN CAPITAL LETTER AE + _______ @ + / ____|@ + / |__ @ + / /| __| @ + / ___ |____ @ + /_/ |______|@ + @ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + _____ @ + / ____|@ + | | $ @ + | | $ @ + | |____ @ + \_____|@ + )_) @ + @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + __ @ + _\_\_ @ + | ____|@ + | _| @ + | |___ @ + |_____|@ + @ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + __ @ + _/_/_ @ + | ____|@ + | _| @ + | |___ @ + |_____|@ + @ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + //\ @ + |/ \| @ + | ____|@ + | _| @ + | |___ @ + |_____|@ + @ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _ _ @ + (_) (_)@ + | ____|@ + | _| @ + | |___ @ + |_____|@ + @ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + __ @ + \_\ @ + |_ _|@ + | | @ + | | @ + |___|@ + @ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + __ @ + /_/ @ + |_ _|@ + | | @ + | | @ + |___|@ + @ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + //\ @ + |/_\|@ + |_ _|@ + | | @ + | | @ + |___|@ + @ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _ _ @ + (_)_(_)@ + |_ _| @ + | | @ + | | @ + |___| @ + @ + @@ +208 LATIN CAPITAL LETTER ETH + _____ @ + | __ \ @ + _| |_ | |@ + |__ __|| |@ + | |__| |@ + |_____/ @ + @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + /\/| @ + |/\/_ @ + | \ | |@ + | \| |@ + | |\ |@ + |_| \_|@ + @ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + __ @ + \_\ @ + / _ \ @ + | | | |@ + | |_| |@ + \___/ @ + @ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + __ @ + /_/ @ + / _ \ @ + | | | |@ + | |_| |@ + \___/ @ + @ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + //\ @ + |/_\| @ + / _ \ @ + | | | |@ + | |_| |@ + \___/ @ + @ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + /\/| @ + |/\/ @ + / _ \ @ + | | | |@ + | |_| |@ + \___/ @ + @ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _ _ @ + (_)_(_)@ + / _ \ @ + | | | |@ + | |_| |@ + \___/ @ + @ + @@ +215 MULTIPLICATION SIGN + @ + @ + /\/\@ + > <@ + \/\/@ + $ @ + @ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + _____ @ + / __// @ + | | // |@ + | |//| |@ + | //_| |@ + //___/ @ + @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + __ @ + _\_\_ @ + | | | |@ + | | | |@ + | |_| |@ + \___/ @ + @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + __ @ + _/_/_ @ + | | | |@ + | | | |@ + | |_| |@ + \___/ @ + @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + //\ @ + |/ \| @ + | | | |@ + | | | |@ + | |_| |@ + \___/ @ + @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ + | | | |@ + | | | |@ + | |_| |@ + \___/ @ + @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + __ @ + __/_/__@ + \ \ / /@ + \ V / @ + | | @ + |_| @ + @ + @@ +222 LATIN CAPITAL LETTER THORN + _ @ + | |___ @ + | __ \ @ + | |__) |@ + | ___/ @ + |_| @ + @ + @@ +223 LATIN SMALL LETTER SHARP S + ___ @ + / _ \ @ + | | ) |@ + | |< < @ + | | ) |@ + | ||_/ @ + |_| @ + @@ +224 LATIN SMALL LETTER A WITH GRAVE + __ @ + \_\ @ + __ _ @ + / _` |@ + | (_| |@ + \__,_|@ + @ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + __ @ + /_/ @ + __ _ @ + / _` |@ + | (_| |@ + \__,_|@ + @ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + //\ @ + |/ \| @ + __ _ @ + / _` |@ + | (_| |@ + \__,_|@ + @ + @@ +227 LATIN SMALL LETTER A WITH TILDE + /\/| @ + |/\/ @ + __ _ @ + / _` |@ + | (_| |@ + \__,_|@ + @ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _ _ @ + (_) (_)@ + __ _ @ + / _` |@ + | (_| |@ + \__,_|@ + @ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + __ @ + (()) @ + __ _ @ + / _` |@ + | (_| |@ + \__,_|@ + @ + @@ +230 LATIN SMALL LETTER AE + @ + @ + __ ____ @ + / _` _ \@ + | (_| __/@ + \__,____|@ + @ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + @ + ___ @ + / __|@ + | (__ @ + \___|@ + )_) @ + @@ +232 LATIN SMALL LETTER E WITH GRAVE + __ @ + \_\ @ + ___ @ + / _ \@ + | __/@ + \___|@ + @ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + __ @ + /_/ @ + ___ @ + / _ \@ + | __/@ + \___|@ + @ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + //\ @ + |/ \|@ + ___ @ + / _ \@ + | __/@ + \___|@ + @ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _ _ @ + (_) (_)@ + ___ @ + / _ \ @ + | __/ @ + \___| @ + @ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + __ @ + \_\@ + _ @ + | |@ + | |@ + |_|@ + @ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + __@ + /_/@ + _ @ + | |@ + | |@ + |_|@ + @ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + //\ @ + |/ \|@ + _ @ + | | @ + | | @ + |_| @ + @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _ _ @ + (_) (_)@ + _ @ + | | @ + | | @ + |_| @ + @ + @@ +240 LATIN SMALL LETTER ETH + /\/\ @ + > < @ + \/\ \ @ + / _` |@ + | (_) |@ + \___/ @ + @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + /\/| @ + |/\/ @ + _ __ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + __ @ + \_\ @ + ___ @ + / _ \ @ + | (_) |@ + \___/ @ + @ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + __ @ + /_/ @ + ___ @ + / _ \ @ + | (_) |@ + \___/ @ + @ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + //\ @ + |/ \| @ + ___ @ + / _ \ @ + | (_) |@ + \___/ @ + @ + @@ +245 LATIN SMALL LETTER O WITH TILDE + /\/| @ + |/\/ @ + ___ @ + / _ \ @ + | (_) |@ + \___/ @ + @ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _ _ @ + (_) (_)@ + ___ @ + / _ \ @ + | (_) |@ + \___/ @ + @ + @@ +247 DIVISION SIGN + _ @ + (_) @ + _______ @ + |_______|@ + _ @ + (_) @ + @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + @ + ____ @ + / _//\ @ + | (//) |@ + \//__/ @ + @ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + __ @ + \_\ @ + _ _ @ + | | | |@ + | |_| |@ + \__,_|@ + @ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + __ @ + /_/ @ + _ _ @ + | | | |@ + | |_| |@ + \__,_|@ + @ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + //\ @ + |/ \| @ + _ _ @ + | | | |@ + | |_| |@ + \__,_|@ + @ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ + _ _ @ + | | | |@ + | |_| |@ + \__,_|@ + @ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + __ @ + /_/ @ + _ _ @ + | | | |@ + | |_| |@ + \__, |@ + __/ |@ + |___/ @@ +254 LATIN SMALL LETTER THORN + _ @ + | | @ + | |__ @ + | '_ \ @ + | |_) |@ + | .__/ @ + | | @ + |_| @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _ _ @ + (_) (_)@ + _ _ @ + | | | |@ + | |_| |@ + \__, |@ + __/ |@ + |___/ @@ +0x02BC MODIFIER LETTER APOSTROPHE + @ + @ + ))@ + @ + @ + @ + @ + @@ +0x02BD MODIFIER LETTER REVERSED COMMA + @ + @ + ((@ + @ + @ + @ + @ + @@ +0x037A GREEK YPOGEGRAMMENI + @ + @ + @ + @ + @ + @ + @ + ||@@ +0x0387 GREEK ANO TELEIA + @ + $ @ + _ @ + (_)@ + @ + $ @ + @ + @@ +0x0391 GREEK CAPITAL LETTER ALPHA + ___ @ + / _ \ @ + | |_| |@ + | _ |@ + | | | |@ + |_| |_|@ + @ + @@ +0x0392 GREEK CAPITAL LETTER BETA + ____ @ + | _ \ @ + | |_) )@ + | _ ( @ + | |_) )@ + |____/ @ + @ + @@ +0x0393 GREEK CAPITAL LETTER GAMMA + _____ @ + | ___)@ + | |$ @ + | |$ @ + | | @ + |_| @ + @ + @@ +0x0394 GREEK CAPITAL LETTER DELTA + @ + /\ @ + / \ @ + / /\ \ @ + / /__\ \ @ + /________\@ + @ + @@ +0x0395 GREEK CAPITAL LETTER EPSILON + _____ @ + | ___)@ + | |_ @ + | _) @ + | |___ @ + |_____)@ + @ + @@ +0x0396 GREEK CAPITAL LETTER ZETA + ______@ + (___ /@ + / / @ + / / @ + / /__ @ + /_____)@ + @ + @@ +0x0397 GREEK CAPITAL LETTER ETA + _ _ @ + | | | |@ + | |_| |@ + | _ |@ + | | | |@ + |_| |_|@ + @ + @@ +0x0398 GREEK CAPITAL LETTER THETA + ____ @ + / __ \ @ + | |__| |@ + | __ |@ + | |__| |@ + \____/ @ + @ + @@ +0x0399 GREEK CAPITAL LETTER IOTA + ___ @ + ( )@ + | | @ + | | @ + | | @ + (___)@ + @ + @@ +0x039A GREEK CAPITAL LETTER KAPPA + _ __@ + | | / /@ + | |/ / @ + | < @ + | |\ \ @ + |_| \_\@ + @ + @@ +0x039B GREEK CAPITAL LETTER LAMDA + @ + /\ @ + / \ @ + / /\ \ @ + / / \ \ @ + /_/ \_\@ + @ + @@ +0x039C GREEK CAPITAL LETTER MU + __ __ @ + | \ / |@ + | v |@ + | |\_/| |@ + | | | |@ + |_| |_|@ + @ + @@ +0x039D GREEK CAPITAL LETTER NU + _ _ @ + | \ | |@ + | \| |@ + | |@ + | |\ |@ + |_| \_|@ + @ + @@ +0x039E GREEK CAPITAL LETTER XI + _____ @ + (_____)@ + ___ @ + (___) @ + _____ @ + (_____)@ + @ + @@ +0x039F GREEK CAPITAL LETTER OMICRON + ___ @ + / _ \ @ + | | | |@ + | | | |@ + | |_| |@ + \___/ @ + @ + @@ +0x03A0 GREEK CAPITAL LETTER PI + _______ @ + ( _ )@ + | | | | @ + | | | | @ + | | | | @ + |_| |_| @ + @ + @@ +0x03A1 GREEK CAPITAL LETTER RHO + ____ @ + | _ \ @ + | |_) )@ + | __/ @ + | | @ + |_| @ + @ + @@ +0x03A3 GREEK CAPITAL LETTER SIGMA + ______ @ + \ ___)@ + \ \ @ + > > @ + / /__ @ + /_____)@ + @ + @@ +0x03A4 GREEK CAPITAL LETTER TAU + _____ @ + (_ _)@ + | | @ + | | @ + | | @ + |_| @ + @ + @@ +0x03A5 GREEK CAPITAL LETTER UPSILON + __ __ @ + (_ \ / _)@ + \ v / @ + | | @ + | | @ + |_| @ + @ + @@ +0x03A6 GREEK CAPITAL LETTER PHI + _ @ + _| |_ @ + / \ @ + ( (| |) )@ + \_ _/ @ + |_| @ + @ + @@ +0x03A7 GREEK CAPITAL LETTER CHI + __ __@ + \ \ / /@ + \ v / @ + > < @ + / ^ \ @ + /_/ \_\@ + @ + @@ +0x03A8 GREEK CAPITAL LETTER PSI + _ _ _ @ + | || || |@ + | \| |/ |@ + \_ _/ @ + | | @ + |_| @ + @ + @@ +0x03A9 GREEK CAPITAL LETTER OMEGA + ____ @ + / __ \ @ + | | | | @ + | | | | @ + _\ \/ /_ @ + (___||___)@ + @ + @@ +0x03B1 GREEK SMALL LETTER ALPHA + @ + @ + __ __@ + / \/ /@ + ( () < @ + \__/\_\@ + @ + @@ +0x03B2 GREEK SMALL LETTER BETA + ___ @ + / _ \ @ + | |_) )@ + | _ < @ + | |_) )@ + | __/ @ + | | @ + |_| @@ +0x03B3 GREEK SMALL LETTER GAMMA + @ + @ + _ _ @ + ( \ / )@ + \ v / @ + | | @ + | | @ + |_| @@ +0x03B4 GREEK SMALL LETTER DELTA + __ @ + / _) @ + \ \ @ + / _ \ @ + ( (_) )@ + \___/ @ + @ + @@ +0x03B5 GREEK SMALL LETTER EPSILON + @ + @ + ___ @ + / __)@ + > _) @ + \___)@ + @ + @@ +0x03B6 GREEK SMALL LETTER ZETA + _____ @ + \__ ) @ + / / @ + / / @ + | |__ @ + \__ \ @ + ) )@ + (_/ @@ +0x03B7 GREEK SMALL LETTER ETA + @ + @ + _ __ @ + | '_ \ @ + | | | |@ + |_| | |@ + | |@ + |_|@@ +0x03B8 GREEK SMALL LETTER THETA + ___ @ + / _ \ @ + | |_| |@ + | _ |@ + | |_| |@ + \___/ @ + @ + @@ +0x03B9 GREEK SMALL LETTER IOTA + @ + @ + _ @ + | | @ + | | @ + \_)@ + @ + @@ +0x03BA GREEK SMALL LETTER KAPPA + @ + @ + _ __@ + | |/ /@ + | < @ + |_|\_\@ + @ + @@ +0x03BB GREEK SMALL LETTER LAMDA + __ @ + \ \ @ + \ \ @ + > \ @ + / ^ \ @ + /_/ \_\@ + @ + @@ +0x03BC GREEK SMALL LETTER MU + @ + @ + _ _ @ + | | | |@ + | |_| |@ + | ._,_|@ + | | @ + |_| @@ +0x03BD GREEK SMALL LETTER NU + @ + @ + _ __@ + | |/ /@ + | / / @ + |__/ @ + @ + @@ +0x03BE GREEK SMALL LETTER XI + \=\__ @ + > __) @ + ( (_ @ + > _) @ + ( (__ @ + \__ \ @ + ) )@ + (_/ @@ +0x03BF GREEK SMALL LETTER OMICRON + @ + @ + ___ @ + / _ \ @ + ( (_) )@ + \___/ @ + @ + @@ +0x03C0 GREEK SMALL LETTER PI + @ + @ + ______ @ + ( __ )@ + | || | @ + |_||_| @ + @ + @@ +0x03C1 GREEK SMALL LETTER RHO + @ + @ + ___ @ + / _ \ @ + | |_) )@ + | __/ @ + | | @ + |_| @@ +0x03C2 GREEK SMALL LETTER FINAL SIGMA + @ + @ + ____ @ + / ___)@ + ( (__ @ + \__ \ @ + _) )@ + (__/ @@ +0x03C3 GREEK SMALL LETTER SIGMA + @ + @ + ____ @ + / ._)@ + ( () ) @ + \__/ @ + @ + @@ +0x03C4 GREEK SMALL LETTER TAU + @ + @ + ___ @ + ( )@ + | | @ + \_)@ + @ + @@ +0x03C5 GREEK SMALL LETTER UPSILON + @ + @ + _ _ @ + | | | |@ + | |_| |@ + \___/ @ + @ + @@ +0x03C6 GREEK SMALL LETTER PHI + _ @ + | | @ + _| |_ @ + / \ @ + ( (| |) )@ + \_ _/ @ + | | @ + |_| @@ +0x03C7 GREEK SMALL LETTER CHI + @ + @ + __ __@ + \ \ / /@ + \ v / @ + > < @ + / ^ \ @ + /_/ \_\@@ +0x03C8 GREEK SMALL LETTER PSI + @ + @ + _ _ _ @ + | || || |@ + | \| |/ |@ + \_ _/ @ + | | @ + |_| @@ +0x03C9 GREEK SMALL LETTER OMEGA + @ + @ + __ __ @ + / / _ \ \ @ + | |_/ \_| |@ + \___^___/ @ + @ + @@ +0x03D1 GREEK THETA SYMBOL + ___ @ + / _ \ @ + ( (_| |_ @ + _ \ _ _)@ + | |___| | @ + \_____/ @ + @ + @@ +0x03D5 GREEK PHI SYMBOL + @ + @ + _ __ @ + | | / \ @ + | || || )@ + \_ _/ @ + | | @ + |_| @@ +0x03D6 GREEK PI SYMBOL + @ + @ + _________ @ + ( _____ )@ + | |_/ \_| |@ + \___^___/ @ + @ + @@ +-0x0005 +alpha = a, beta = b, gamma = g, delta = d, epsilon = e @ +zeta = z, eta = h, theta = q, iota = i, lamda = l, mu = m@ +nu = n, xi = x, omicron = o, pi = p, rho = r, sigma = s @ +phi = f, chi = c, psi = y, omega = w, final sigma = V @ + pi symbol = v, theta symbol = J, phi symbol = j @ + middle dot = :, ypogegrammeni = _ @ + rough breathing = (, smooth breathing = ) @ + acute accent = ', grave accent = `, dialytika = ^ @@ diff --git a/cosmic rage/fonts/block.flf b/cosmic rage/fonts/block.flf new file mode 100644 index 0000000..b1172f0 --- /dev/null +++ b/cosmic rage/fonts/block.flf @@ -0,0 +1,1691 @@ +flf2a$ 8 6 27 0 10 0 576 96 +Block by Glenn Chappell 4/93 -- straight version of Lean +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + +$ $@ +$ $@ +$ $@ +$ $@ +$ $@ +$ $@ +$ $@ +$ $@@ + $$@ + _| $@ + _| $@ + _| $@ + $$@ + _| $@ + $$@ + @@ + _| _| $@ + _| _| $@ + $$@ + $$ @ + $$ @ + $$ @ + @ + @@ + $$ @ + _| _| $@ + _|_|_|_|_| $@ + _| _| $@ + _|_|_|_|_| $@ + _| _| $@ + $$ @ + @@ + $$ @ + _| $@ + _|_|_| $@ + _|_| $@ + _|_| $@ + _|_|_| $@ + _| $@ + $$ @@ + $$@ + _|_| _| $@ + _|_| _| $@ + _| $@ + _| _|_| $@ + _| _|_| $@ + $$@ + @@ + $$ @ + _| $ @ + _| _| $@ + _|_| _| $@ + _| _| $@ + _|_| _| $@ + $$@ + @@ + _| $@ + _| $@ + $$ @ + $$ @ + $$ @ + $$ @ + @ + @@ + _| $@ + _| $@ + _| $ @ + _| $ @ + _| $ @ + _| $@ + _| $@ + $$@@ + _| $@ + _| $@ + _| $@ + _| $@ + _| $@ + _| $@ + _| $@ + $$ @@ + $$@ + _| _| _| $@ + _|_|_| $@ + _|_|_|_|_| $@ + _|_|_| $@ + _| _| _| $@ + $$@ + @@ + $$ @ + _| $ @ + _| $@ + _|_|_|_|_| $@ + _| $@ + _| $ @ + $$ @ + @@ + @ + @ + @ + @ + $$@ + _| $@ + _| $@ + $$ @@ + @ + @ + $$@ + _|_|_|_|_| $@ + $$@ + @ + @ + @@ + @ + @ + @ + @ + $$@ + _| $@ + $$@ + @@ + $$@ + _| $@ + _| $@ + _| $ @ + _| $ @ + _| $ @ + $$ @ + @@ + $$ @ + _| $@ + _| _| $@ + _| _| $@ + _| _| $@ + _| $@ + $$ @ + @@ + $$@ + _| $@ + _|_| $@ + _| $@ + _| $@ + _| $@ + $$@ + @@ + $$ @ + _|_| $@ + _| _| $@ + _| $@ + _| $@ + _|_|_|_| $@ + $$@ + @@ + $$ @ + _|_|_| $@ + _| $@ + _|_| $@ + _| $@ + _|_|_| $@ + $$ @ + @@ + $$ @ + _| _| $ @ + _| _| $@ + _|_|_|_| $@ + _| $@ + _| $ @ + $$ @ + @@ + $$@ + _|_|_|_| $@ + _| $@ + _|_|_| $@ + _| $@ + _|_|_| $@ + $$ @ + @@ + $$@ + _|_|_| $@ + _| $@ + _|_|_| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ + $$@ + _|_|_|_|_| $@ + _| $@ + _| $@ + _| $ @ + _| $ @ + $$ @ + @@ + $$ @ + _|_| $@ + _| _| $@ + _|_| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ + $$ @ + _|_| $@ + _| _| $@ + _|_|_| $@ + _| $@ + _|_|_| $@ + $$ @ + @@ + @ + $$@ + _| $@ + $$@ + $$@ + _| $@ + $$@ + @@ + @ + $$@ + _| $@ + $$@ + $$@ + _| $@ + _| $@ + $$ @@ + $$@ + _| $@ + _| $@ + _| $ @ + _| $@ + _| $@ + $$@ + @@ + @ + $$@ + _|_|_|_|_| $@ + $$@ + _|_|_|_|_| $@ + $$@ + @ + @@ + $$ @ + _| $ @ + _| $@ + _| $@ + _| $@ + _| $ @ + $$ @ + @@ + $$ @ + _|_| $@ + _| $@ + _|_| $@ + $$ @ + _| $ @ + $$ @ + @@ + $$ @ + _|_|_|_|_| $@ + _| _| $@ + _| _|_|_| _| $@ + _| _| _| _| $@ + _| _|_|_|_| $@ + _| $@ + _|_|_|_|_|_| $@@ + $$ @ + _|_| $@ + _| _| $@ + _|_|_|_| $@ + _| _| $@ + _| _| $@ + $$@ + @@ + $$ @ + _|_|_| $@ + _| _| $@ + _|_|_| $@ + _| _| $@ + _|_|_| $@ + $$ @ + @@ + $$@ + _|_|_| $@ + _| $@ + _| $ @ + _| $@ + _|_|_| $@ + $$@ + @@ + $$ @ + _|_|_| $@ + _| _| $@ + _| _| $@ + _| _| $@ + _|_|_| $@ + $$ @ + @@ + $$@ + _|_|_|_| $@ + _| $@ + _|_|_| $ @ + _| $@ + _|_|_|_| $@ + $$@ + @@ + $$@ + _|_|_|_| $@ + _| $@ + _|_|_| $ @ + _| $ @ + _| $ @ + $$ @ + @@ + $$@ + _|_|_| $@ + _| $@ + _| _|_| $@ + _| _| $@ + _|_|_| $@ + $$@ + @@ + $$@ + _| _| $@ + _| _| $@ + _|_|_|_| $@ + _| _| $@ + _| _| $@ + $$@ + @@ + $$@ + _|_|_| $@ + _| $@ + _| $ @ + _| $@ + _|_|_| $@ + $$@ + @@ + $$@ + _| $@ + _| $@ + _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ + $$@ + _| _| $@ + _| _| $@ + _|_| $ @ + _| _| $@ + _| _| $@ + $$@ + @@ + $$ @ + _| $ @ + _| $ @ + _| $ @ + _| $@ + _|_|_|_| $@ + $$@ + @@ + $$@ + _| _| $@ + _|_| _|_| $@ + _| _| _| $@ + _| _| $@ + _| _| $@ + $$@ + @@ + $$@ + _| _| $@ + _|_| _| $@ + _| _| _| $@ + _| _|_| $@ + _| _| $@ + $$@ + @@ + $$ @ + _|_| $@ + _| _| $@ + _| _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ + $$ @ + _|_|_| $@ + _| _| $@ + _|_|_| $@ + _| $ @ + _| $ @ + $$ @ + @@ + $$ @ + _|_| $ @ + _| _| $ @ + _| _|_| $ @ + _| _| $@ + _|_| _| $@ + $$@ + @@ + $$ @ + _|_|_| $@ + _| _| $@ + _|_|_| $@ + _| _| $@ + _| _| $@ + $$@ + @@ + $$@ + _|_|_| $@ + _| $@ + _|_| $@ + _| $@ + _|_|_| $@ + $$ @ + @@ + $$@ + _|_|_|_|_| $@ + _| $@ + _| $ @ + _| $ @ + _| $ @ + $$ @ + @@ + $$@ + _| _| $@ + _| _| $@ + _| _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ + $$@ + _| _| $@ + _| _| $@ + _| _| $@ + _| _| $@ + _| $ @ + $$ @ + @@ + $$@ + _| _| $@ + _| _| $@ + _| _| _| $@ + _| _| _| $@ + _| _| $ @ + $$ @ + @@ + $$@ + _| _| $@ + _| _| $@ + _| $ @ + _| _| $@ + _| _| $@ + $$@ + @@ + $$@ + _| _| $@ + _| _| $@ + _| $ @ + _| $ @ + _| $ @ + $$ @ + @@ + $$@ + _|_|_|_|_| $@ + _| $@ + _| $ @ + _| $@ + _|_|_|_|_| $@ + $$@ + @@ + _|_| $@ + _| $@ + _| $ @ + _| $ @ + _| $ @ + _| $@ + _|_| $@ + $$@@ + $$ @ + _| $ @ + _| $ @ + _| $ @ + _| $@ + _| $@ + $$@ + @@ + _|_| $@ + _| $@ + _| $@ + _| $@ + _| $@ + _| $@ + _|_| $@ + $$@@ + _| $@ + _| _| $@ + $$@ + $$ @ + $$ @ + $$ @ + @ + @@ + @ + @ + $$ @ + $$ @ + $$ @ + $$ @ + $$@ + _|_|_|_|_| $@@ + _| $@ + _| $@ + $$@ + $$ @ + $$ @ + $$ @ + @ + @@ + @ + $$@ + _|_|_| $@ + _| _| $@ + _| _| $@ + _|_|_| $@ + $$@ + @@ + $$ @ + _| $ @ + _|_|_| $@ + _| _| $@ + _| _| $@ + _|_|_| $@ + $$ @ + @@ + @ + $$@ + _|_|_| $@ + _| $@ + _| $@ + _|_|_| $@ + $$@ + @@ + $$@ + _| $@ + _|_|_| $@ + _| _| $@ + _| _| $@ + _|_|_| $@ + $$@ + @@ + @ + $$ @ + _|_| $@ + _|_|_|_| $@ + _| $@ + _|_|_| $@ + $$@ + @@ + $$@ + _|_| $@ + _| $@ + _|_|_|_| $@ + _| $@ + _| $ @ + $$ @ + @@ + @ + $$@ + _|_|_| $@ + _| _| $@ + _| _| $@ + _|_|_| $@ + _| $@ + _|_| $@@ + $$ @ + _| $ @ + _|_|_| $@ + _| _| $@ + _| _| $@ + _| _| $@ + $$@ + @@ + $$@ + _| $@ + $$@ + _| $@ + _| $@ + _| $@ + $$@ + @@ + $$@ + _| $@ + $$@ + _| $@ + _| $@ + _| $@ + _| $@ + _| $@@ + $$ @ + _| $ @ + _| _| $ @ + _|_| $ @ + _| _| $@ + _| _| $@ + $$@ + @@ + $$@ + _| $@ + _| $@ + _| $@ + _| $@ + _| $@ + $$@ + @@ + @ + $$ @ + _|_|_| _|_| $@ + _| _| _| $@ + _| _| _| $@ + _| _| _| $@ + $$@ + @@ + @ + $$ @ + _|_|_| $@ + _| _| $@ + _| _| $@ + _| _| $@ + $$@ + @@ + @ + $$ @ + _|_| $@ + _| _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ + @ + $$ @ + _|_|_| $@ + _| _| $@ + _| _| $@ + _|_|_| $@ + _| $ @ + _| $ @@ + @ + $$@ + _|_|_| $@ + _| _| $@ + _| _| $@ + _|_|_| $@ + _| $@ + _| $@@ + @ + $$@ + _| _|_| $@ + _|_| $@ + _| $ @ + _| $ @ + $$ @ + @@ + @ + $$@ + _|_|_| $@ + _|_| $@ + _|_| $@ + _|_|_| $@ + $$ @ + @@ + $$ @ + _| $@ + _|_|_|_| @ + _| $@ + _| $@ + _|_| $@ + $$@ + @@ + @ + $$@ + _| _| $@ + _| _| $@ + _| _| $@ + _|_|_| $@ + $$@ + @@ + @ + $$@ + _| _| $@ + _| _| $@ + _| _| $@ + _| $ @ + $$ @ + @@ + @ + $$@ + _| _| _| $@ + _| _| _| $@ + _| _| _| _| $@ + _| _| $ @ + $$ @ + @@ + @ + $$@ + _| _| $@ + _|_| $@ + _| _| $@ + _| _| $@ + $$@ + @@ + @ + $$@ + _| _| $@ + _| _| $@ + _| _| $@ + _|_|_| $@ + _| $@ + _|_| $@@ + @ + $$@ + _|_|_|_| $@ + _| $@ + _| $@ + _|_|_|_| $@ + $$@ + @@ + _| $@ + _| $@ + _| $@ + _| $ @ + _| $@ + _| $@ + _| $@ + $$@@ + _| $@ + _| $@ + _| $@ + _| $@ + _| $@ + _| $@ + _| $@ + _| $@@ + _| $ @ + _| $@ + _| $@ + _| $@ + _| $@ + _| $@ + _| $ @ + $$ @@ + _| _| $@ + _| _| $@ + $$ @ + $$ @ + $$ @ + $$ @ + @ + @@ + _| _| $@ + $$@ + _|_| $@ + _| _| $@ + _|_|_|_| $@ + _| _| $@ + $$@ + @@ + _| _| $@ + $$@ + _|_| $@ + _| _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ + _| _| $@ + $$@ + _| _| $@ + _| _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ + _| _| $@ + $$@ + _|_|_| $@ + _| _| $@ + _| _| $@ + _|_|_| $@ + $$@ + @@ + _| _| $@ + $$@ + _|_| $@ + _| _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ + _| _| $@ + $$@ + _| _| $@ + _| _| $@ + _| _| $@ + _|_|_| $@ + $$@ + @@ + $$ @ + _|_| $@ + _| _| $@ + _| _| $@ + _| _| $@ + _| _| $@ + _| $ @ + $$ @@ +160 NO-BREAK SPACE + $ $@ + $ $@ + $ $@ + $ $@ + $ $@ + $ $@ + $ $@ + $ $@@ +161 INVERTED EXCLAMATION MARK + $$@ + _| $@ + $$@ + _| $@ + _| $@ + _| $@ + $$@ + @@ +162 CENT SIGN + $$ @ + _| $@ + _|_|_| $@ + _| _| $@ + _| _| $@ + _|_|_| $@ + _| $@ + $$ @@ +163 POUND SIGN + $$ @ + _|_| $ @ + _| _| $ @ + _|_|_| $ @ + _| $@ + _|_|_| _| $@ + _|_| _|_| $@ + @@ +164 CURRENCY SIGN + $$@ + _| _| $@ + _|_|_|_| $@ + _| _| $ @ + _| _| $ @ + _|_|_|_| $@ + _| _| $@ + $$@@ +165 YEN SIGN + $$@ + _| _| $@ + _| _| $@ + _|_|_|_|_| $@ + _| $@ + _|_|_|_|_| $@ + _| $@ + $$ @@ +166 BROKEN BAR + _| $@ + _| $@ + _| $@ + $$@ + $$@ + _| $@ + _| $@ + _| $@@ +167 SECTION SIGN + _|_| $@ + _| $@ + _| $@ + _| _| $@ + _| $@ + _| $@ + _|_| $@ + $$ @@ +168 DIAERESIS + _| _| $@ + $$@ + $ $ @ + $ $ @ + $ $ @ + $ $ @ + @ + @@ +169 COPYRIGHT SIGN + _|_|_|_| $ @ + _| _| $@ + _| _|_|_| _| $@ + _| _| _| $@ + _| _| _| $@ + _| _|_|_| _| $@ + _| _| $@ + _|_|_|_| $ @@ +170 FEMININE ORDINAL INDICATOR + $$@ + _|_|_| $@ + _| _| $@ + _|_|_| $@ + $$@ + _|_|_|_| $@ + @ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + $$@ + _| _| $@ + _| _| $@ + _| _| $ @ + _| _| $@ + _| _| $@ + $$@ + @@ +172 NOT SIGN + @ + @ + $$@ + _|_|_|_|_| $@ + _| $@ + $$@ + @ + @@ +173 SOFT HYPHEN + @ + @ + $$@ + _|_|_|_| $@ + $$@ + $$ @ + @ + @@ +174 REGISTERED SIGN + _|_|_|_| $ @ + _| _| $@ + _| _|_|_| _| $@ + _| _| _| _| $@ + _| _|_|_| _| $@ + _| _| _| _| $@ + _| _| $@ + _|_|_|_| $ @@ +175 MACRON + _|_|_|_|_| $@ + $$@ + $$ @ + $$ @ + $$ @ + $$ @ + @ + @@ +176 DEGREE SIGN + _| $@ + _| _| $@ + _| $@ + $$ @ + $$ @ + $$ @ + @ + @@ +177 PLUS-MINUS SIGN + $$ @ + _| $ @ + _| $@ + _|_|_|_|_| $@ + _| $@ + _|_|_|_|_| $@ + $$@ + @@ +178 SUPERSCRIPT TWO + $$ @ + _|_| $@ + _| $@ + _| $@ + _|_|_| $@ + $$@ + @ + @@ +179 SUPERSCRIPT THREE + $$@ + _|_|_| $@ + _| $@ + _| $@ + _|_| $@ + $$ @ + @ + @@ +180 ACUTE ACCENT + _| $@ + _| $@ + $$ @ + $$ @ + $$ @ + $$ @ + @ + @@ +181 MICRO SIGN + @ + $$@ + _| _| $@ + _| _| $@ + _| _| $@ + _|_|_|_| $@ + _| $@ + _| $ @@ +182 PILCROW SIGN + $$@ + _|_|_|_| $@ + _|_|_| _| $@ + _|_| _| $@ + _| _| $@ + _| _| $@ + $$@ + @@ +183 MIDDLE DOT + @ + @ + $$@ + _| $@ + $$@ + $$ @ + @ + @@ +184 CEDILLA + @ + @ + @ + @ + @ + $$@ + _| $@ + _|_| $@@ +185 SUPERSCRIPT ONE + $$@ + _| $@ + _|_| $@ + _| $@ + _| $@ + $$@ + @ + @@ +186 MASCULINE ORDINAL INDICATOR + $$ @ + _|_| $@ + _| _| $@ + _|_| $@ + $$@ + _|_|_|_| $@ + @ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + $$ @ + _| _| $ @ + _| _| $@ + _| _| $@ + _| _| $@ + _| _| $ @ + $$ @ + @@ +188 VULGAR FRACTION ONE QUARTER + $$ @ + _| _| $ @ + _|_| _| _| _| $ @ + _| _| _| _| $@ + _| _| _|_|_|_| $@ + _| _| $@ + $$ @ + @@ +189 VULGAR FRACTION ONE HALF + $$ @ + _| _| $ @ + _|_| _| _|_| $@ + _| _| _| $@ + _| _| _| $@ + _| _|_|_| $@ + $$@ + @@ +190 VULGAR FRACTION THREE QUARTERS + $$ @ + _|_|_| _| $ @ + _| _| _| _| $ @ + _| _| _| _| $@ + _|_| _| _|_|_|_| $@ + _| _| $@ + $$ @ + @@ +191 INVERTED QUESTION MARK + $$@ + _| $@ + $$@ + _|_| $@ + _| $@ + _|_| $@ + $$@ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + _| $ @ + _| $ @ + _|_| $@ + _| _| $@ + _|_|_|_| $@ + _| _| $@ + $$@ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + _| $ @ + _| $ @ + _|_| $@ + _| _| $@ + _|_|_|_| $@ + _| _| $@ + $$@ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + _|_| $@ + _| _| $@ + $$@ + _|_| $@ + _|_|_|_| $@ + _| _| $@ + $$@ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + _| _| $@ + _| _| $@ + $$ @ + _|_| $@ + _|_|_|_| $@ + _| _| $@ + $$@ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _| _| $@ + $$@ + _|_| $@ + _| _| $@ + _|_|_|_| $@ + _| _| $@ + $$@ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + _|_| $@ + _| _| $@ + _|_| $@ + _| _| $@ + _|_|_|_| $@ + _| _| $@ + $$@ + @@ +198 LATIN CAPITAL LETTER AE + $$@ + _|_|_|_|_|_| $@ + _| _| $@ + _|_|_|_|_|_| $ @ + _| _| $@ + _| _|_|_|_| $@ + $$@ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + $$@ + _|_|_| $@ + _| $@ + _| $ @ + _| $@ + _|_|_| $@ + _| $@ + _|_| $ @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + _| $ @ + _| $@ + _|_|_|_| $@ + _|_|_| $ @ + _| $@ + _|_|_|_| $@ + $$@ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + _| $ @ + _| $@ + _|_|_|_| $@ + _|_|_| $ @ + _| $@ + _|_|_|_| $@ + $$@ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + _|_| $@ + _| _| $@ + _|_|_|_| $@ + _|_|_| $ @ + _| $@ + _|_|_|_| $@ + $$@ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _| _| $@ + $$@ + _|_|_|_| $@ + _|_|_| $ @ + _| $@ + _|_|_|_| $@ + $$@ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + _| $ @ + _| $@ + _|_|_| $@ + _| $@ + _| $@ + _|_|_| $@ + $$@ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + _| $@ + _| $@ + _|_|_| $@ + _| $@ + _| $@ + _|_|_| $@ + $$@ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + _| $@ + _| _| $@ + _|_|_| $@ + _| $@ + _| $@ + _|_|_| $@ + $$@ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _| _| $@ + $$@ + _|_|_| $@ + _| $@ + _| $@ + _|_|_| $@ + $$@ + @@ +208 LATIN CAPITAL LETTER ETH + $$ @ + _|_|_| $@ + _| _| $@ + _|_|_| _| $@ + _| _| $@ + _|_|_| $@ + $$ @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + _| _| $@ + _| _| $@ + _| _| $@ + _|_| _| $@ + _| _|_| $@ + _| _| $@ + $$@ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + _| $ @ + _| $ @ + _|_| $@ + _| _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + _| $ @ + _| $ @ + _|_| $@ + _| _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + _|_| $@ + _| _| $@ + _|_| $@ + _| _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + _| _| $@ + _| _| $@ + _|_| $@ + _| _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _| _| $@ + $$@ + _|_| $@ + _| _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ +215 MULTIPLICATION SIGN + @ + $$@ + _| _| $@ + _| $@ + _| _| $@ + $$@ + @ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + $$@ + _|_|_|_| $@ + _| _|_| $@ + _| _| _| $@ + _|_| _| $@ + _|_|_|_| $@ + $$ @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + _| $ @ + _| $ @ + $$@ + _| _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + _| $ @ + _| $ @ + $$@ + _| _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + _|_| $@ + _| _| $@ + $$@ + _| _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _| _| $@ + $$@ + _| _| $@ + _| _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + _| $ @ + _| $@ + _| _| $@ + _| _| $@ + _| $ @ + _| $ @ + $$ @ + @@ +222 LATIN CAPITAL LETTER THORN + $$ @ + _| $ @ + _|_|_| $@ + _| _| $@ + _|_|_| $@ + _| $ @ + $$ @ + @@ +223 LATIN SMALL LETTER SHARP S + $$ @ + _|_| $@ + _| _| $@ + _| _| $@ + _| _| $@ + _| _| $@ + _| $ @ + $$ @@ +224 LATIN SMALL LETTER A WITH GRAVE + _| $ @ + _| $ @ + $$@ + _|_|_| $@ + _| _| $@ + _|_|_| $@ + $$@ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + _| $@ + _| $@ + $$@ + _|_|_| $@ + _| _| $@ + _|_|_| $@ + $$@ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + _| $@ + _| _| $@ + $$@ + _|_|_| $@ + _| _| $@ + _|_|_| $@ + $$@ + @@ +227 LATIN SMALL LETTER A WITH TILDE + _| _| $@ + _| _| $@ + $$@ + _|_|_| $@ + _| _| $@ + _|_|_| $@ + $$@ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _| _| $@ + $$@ + _|_|_| $@ + _| _| $@ + _| _| $@ + _|_|_| $@ + $$@ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + _| $@ + _| _| $@ + _| $@ + _|_|_| $@ + _| _| $@ + _|_|_| $@ + $$@ + @@ +230 LATIN SMALL LETTER AE + @ + $$ @ + _|_|_| _|_| $@ + _| _|_|_|_|_| $@ + _| _|_| $@ + _|_|_| _|_|_| $@ + $$@ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + $$@ + _|_|_| $@ + _| $@ + _| $@ + _|_|_| $@ + _| $@ + _|_| $ @@ +232 LATIN SMALL LETTER E WITH GRAVE + _| $@ + _| $ @ + _|_| $@ + _|_|_|_| $@ + _| $@ + _|_|_| $@ + $$@ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + _| $@ + _| $@ + _|_| $@ + _|_|_|_| $@ + _| $@ + _|_|_| $@ + $$@ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + _|_| $@ + _| _| $@ + _|_| $@ + _|_|_|_| $@ + _| $@ + _|_|_| $@ + $$@ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _| _| $@ + $$@ + _|_| $@ + _|_|_|_| $@ + _| $@ + _|_|_| $@ + $$@ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + _| $@ + _| $@ + $$@ + _| $@ + _| $@ + _| $@ + $$@ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + _| $@ + _| $@ + $$ @ + _| $ @ + _| $ @ + _| $ @ + $$ @ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + _| $@ + _| _| $@ + $$@ + _| $ @ + _| $ @ + _| $ @ + $$ @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _| _| $@ + $$@ + _| $ @ + _| $ @ + _| $ @ + _| $ @ + $$ @ + @@ +240 LATIN SMALL LETTER ETH + _| _| $ @ + _| $ @ + _| _| $@ + _|_|_| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + _| _| $@ + _| _| $@ + $$ @ + _|_|_| $@ + _| _| $@ + _| _| $@ + $$@ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + _| $ @ + _| $ @ + $$ @ + _|_| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + _| $ @ + _| $ @ + $$ @ + _|_| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + _|_| $@ + _| _| $@ + $$@ + _|_| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ +245 LATIN SMALL LETTER O WITH TILDE + _|_|_| $@ + _| _| $@ + $$ @ + _|_| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _| _| $@ + $$@ + _|_| $@ + _| _| $@ + _| _| $@ + _|_| $@ + $$ @ + @@ +247 DIVISION SIGN + $$ @ + _| $ @ + $$@ + _|_|_|_|_| $@ + $$@ + _| $ @ + $$ @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + $$@ + _|_|_| $@ + _| _|_| $@ + _|_| _| $@ + _|_|_| $@ + $$ @ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + _| $ @ + _| $ @ + $$@ + _| _| $@ + _| _| $@ + _|_|_| $@ + $$@ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + _| $@ + _| $@ + $$@ + _| _| $@ + _| _| $@ + _|_|_| $@ + $$@ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + _|_| $@ + _| _| $@ + $$@ + _| _| $@ + _| _| $@ + _|_|_| $@ + $$@ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _| _| $@ + $$@ + _| _| $@ + _| _| $@ + _| _| $@ + _|_|_| $@ + $$@ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + _| $ @ + _| $ @ + $$@ + _| _| $@ + _| _| $@ + _|_|_| $@ + _| $@ + _|_| $@@ +254 LATIN SMALL LETTER THORN + $$ @ + _| $ @ + _|_|_| $@ + _| _| $@ + _| _| $@ + _|_|_| $@ + _| $ @ + _| $ @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _| _| $@ + $$@ + _| _| $@ + _| _| $@ + _| _| $@ + _|_|_| $@ + _| $@ + _|_| $@@ diff --git a/cosmic rage/fonts/bubble.flf b/cosmic rage/fonts/bubble.flf new file mode 100644 index 0000000..efd0a71 --- /dev/null +++ b/cosmic rage/fonts/bubble.flf @@ -0,0 +1,1630 @@ +flf2a 4 3 8 15 11 0 10127 242 +Bubble by Glenn Chappell 4/93 +Includes characters 128-255 +Enhanced for Latin-2,3,4 by John Cowan +Latin character sets supported only if your screen font does +figlet release 2.2 -- November 1996 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + @ + @ + @ + @@ + _ @ + / \ @ + ( ! )@ + \_/ @@ + _ @ + / \ @ + ( " )@ + \_/ @@ + _ @ + / \ @ + ( # )@ + \_/ @@ + _ @ + / \ @ + ( $ )@ + \_/ @@ + _ @ + / \ @ + ( % )@ + \_/ @@ + _ @ + / \ @ + ( & )@ + \_/ @@ + _ @ + / \ @ + ( ' )@ + \_/ @@ + _ @ + / \ @ + ( ( )@ + \_/ @@ + _ @ + / \ @ + ( ) )@ + \_/ @@ + _ @ + / \ @ + ( * )@ + \_/ @@ + _ @ + / \ @ + ( + )@ + \_/ @@ + _ @ + / \ @ + ( , )@ + \_/ @@ + _ @ + / \ @ + ( - )@ + \_/ @@ + _ @ + / \ @ + ( . )@ + \_/ @@ + _ @ + / \ @ + ( / )@ + \_/ @@ + _ @ + / \ @ + ( 0 )@ + \_/ @@ + _ @ + / \ @ + ( 1 )@ + \_/ @@ + _ @ + / \ @ + ( 2 )@ + \_/ @@ + _ @ + / \ @ + ( 3 )@ + \_/ @@ + _ @ + / \ @ + ( 4 )@ + \_/ @@ + _ @ + / \ @ + ( 5 )@ + \_/ @@ + _ @ + / \ @ + ( 6 )@ + \_/ @@ + _ @ + / \ @ + ( 7 )@ + \_/ @@ + _ @ + / \ @ + ( 8 )@ + \_/ @@ + _ @ + / \ @ + ( 9 )@ + \_/ @@ + _ @ + / \ @ + ( : )@ + \_/ @@ + _ @ + / \ @ + ( ; )@ + \_/ @@ + _ @ + / \ @ + ( < )@ + \_/ @@ + _ @ + / \ @ + ( = )@ + \_/ @@ + _ @ + / \ @ + ( > )@ + \_/ @@ + _ @ + / \ @ + ( ? )@ + \_/ @@ + _ @ + / \ @ + ( @ )@ + \_/ @@ + _ @ + / \ @ + ( A )@ + \_/ @@ + _ @ + / \ @ + ( B )@ + \_/ @@ + _ @ + / \ @ + ( C )@ + \_/ @@ + _ @ + / \ @ + ( D )@ + \_/ @@ + _ @ + / \ @ + ( E )@ + \_/ @@ + _ @ + / \ @ + ( F )@ + \_/ @@ + _ @ + / \ @ + ( G )@ + \_/ @@ + _ @ + / \ @ + ( H )@ + \_/ @@ + _ @ + / \ @ + ( I )@ + \_/ @@ + _ @ + / \ @ + ( J )@ + \_/ @@ + _ @ + / \ @ + ( K )@ + \_/ @@ + _ @ + / \ @ + ( L )@ + \_/ @@ + _ @ + / \ @ + ( M )@ + \_/ @@ + _ @ + / \ @ + ( N )@ + \_/ @@ + _ @ + / \ @ + ( O )@ + \_/ @@ + _ @ + / \ @ + ( P )@ + \_/ @@ + _ @ + / \ @ + ( Q )@ + \_/ @@ + _ @ + / \ @ + ( R )@ + \_/ @@ + _ @ + / \ @ + ( S )@ + \_/ @@ + _ @ + / \ @ + ( T )@ + \_/ @@ + _ @ + / \ @ + ( U )@ + \_/ @@ + _ @ + / \ @ + ( V )@ + \_/ @@ + _ @ + / \ @ + ( W )@ + \_/ @@ + _ @ + / \ @ + ( X )@ + \_/ @@ + _ @ + / \ @ + ( Y )@ + \_/ @@ + _ @ + / \ @ + ( Z )@ + \_/ @@ + _ @ + / \ @ + ( [ )@ + \_/ @@ + _ @ + / \ @ + ( \ )@ + \_/ @@ + _ @ + / \ @ + ( ] )@ + \_/ @@ + _ @ + / \ @ + ( ^ )@ + \_/ @@ + _ @ + / \ @ + ( _ )@ + \_/ @@ + _ @ + / \ @ + ( ` )@ + \_/ @@ + _ @ + / \ @ + ( a )@ + \_/ @@ + _ @ + / \ @ + ( b )@ + \_/ @@ + _ @ + / \ @ + ( c )@ + \_/ @@ + _ @ + / \ @ + ( d )@ + \_/ @@ + _ @ + / \ @ + ( e )@ + \_/ @@ + _ @ + / \ @ + ( f )@ + \_/ @@ + _ @ + / \ @ + ( g )@ + \_/ @@ + _ @ + / \ @ + ( h )@ + \_/ @@ + _ @ + / \ @ + ( i )@ + \_/ @@ + _ @ + / \ @ + ( j )@ + \_/ @@ + _ @ + / \ @ + ( k )@ + \_/ @@ + _ @ + / \ @ + ( l )@ + \_/ @@ + _ @ + / \ @ + ( m )@ + \_/ @@ + _ @ + / \ @ + ( n )@ + \_/ @@ + _ @ + / \ @ + ( o )@ + \_/ @@ + _ @ + / \ @ + ( p )@ + \_/ @@ + _ @ + / \ @ + ( q )@ + \_/ @@ + _ @ + / \ @ + ( r )@ + \_/ @@ + _ @ + / \ @ + ( s )@ + \_/ @@ + _ @ + / \ @ + ( t )@ + \_/ @@ + _ @ + / \ @ + ( u )@ + \_/ @@ + _ @ + / \ @ + ( v )@ + \_/ @@ + _ @ + / \ @ + ( w )@ + \_/ @@ + _ @ + / \ @ + ( x )@ + \_/ @@ + _ @ + / \ @ + ( y )@ + \_/ @@ + _ @ + / \ @ + ( z )@ + \_/ @@ + _ @ + / \ @ + ( { )@ + \_/ @@ + _ @ + / \ @ + ( | )@ + \_/ @@ + _ @ + / \ @ + ( } )@ + \_/ @@ + _ @ + / \ @ + ( ~ )@ + \_/ @@ + _ @ + / \ @ + ( )@ + \_/ @@ + _ @ + / \ @ + ( )@ + \_/ @@ + _ @ + / \ @ + ( )@ + \_/ @@ + _ @ + / \ @ + ( )@ + \_/ @@ + _ @ + / \ @ + ( )@ + \_/ @@ + _ @ + / \ @ + ( )@ + \_/ @@ + _ @ + / \ @ + ( )@ + \_/ @@ +128 + _ @ + / \ @ + ( )@ + \_/ @@ +129 + _ @ + / \ @ + ( )@ + \_/ @@ +130 + _ @ + / \ @ + ( )@ + \_/ @@ +131 + _ @ + / \ @ + ( )@ + \_/ @@ +132 + _ @ + / \ @ + ( )@ + \_/ @@ +133 + _ @ + / \ @ + ( )@ + \_/ @@ +134 + _ @ + / \ @ + ( )@ + \_/ @@ +135 + _ @ + / \ @ + ( )@ + \_/ @@ +136 + _ @ + / \ @ + ( )@ + \_/ @@ +137 + _ @ + / \ @ + ( )@ + \_/ @@ +138 + _ @ + / \ @ + ( )@ + \_/ @@ +139 + _ @ + / \ @ + ( )@ + \_/ @@ +140 + _ @ + / \ @ + ( )@ + \_/ @@ +141 + _ @ + / \ @ + ( )@ + \_/ @@ +142 + _ @ + / \ @ + ( )@ + \_/ @@ +143 + _ @ + / \ @ + ( )@ + \_/ @@ +144 + _ @ + / \ @ + ( )@ + \_/ @@ +145 + _ @ + / \ @ + ( )@ + \_/ @@ +146 + _ @ + / \ @ + ( )@ + \_/ @@ +147 + _ @ + / \ @ + ( )@ + \_/ @@ +148 + _ @ + / \ @ + ( )@ + \_/ @@ +149 + _ @ + / \ @ + ( )@ + \_/ @@ +150 + _ @ + / \ @ + ( )@ + \_/ @@ +151 + _ @ + / \ @ + ( )@ + \_/ @@ +152 + _ @ + / \ @ + ( )@ + \_/ @@ +153 + _ @ + / \ @ + ( )@ + \_/ @@ +154 + _ @ + / \ @ + ( )@ + \_/ @@ +155 + _ @ + / \ @ + ( )@ + \_/ @@ +156 + _ @ + / \ @ + ( )@ + \_/ @@ +157 + _ @ + / \ @ + ( )@ + \_/ @@ +158 + _ @ + / \ @ + ( )@ + \_/ @@ +159 + _ @ + / \ @ + ( )@ + \_/ @@ +160 NO-BREAK SPACE + _ @ + / \ @ + ( )@ + \_/ @@ +161 INVERTED EXCLAMATION MARK + _ @ + / \ @ + ( )@ + \_/ @@ +162 CENT SIGN + _ @ + / \ @ + ( )@ + \_/ @@ +163 POUND SIGN + _ @ + / \ @ + ( )@ + \_/ @@ +164 CURRENCY SIGN + _ @ + / \ @ + ( )@ + \_/ @@ +165 YEN SIGN + _ @ + / \ @ + ( )@ + \_/ @@ +166 BROKEN BAR + _ @ + / \ @ + ( )@ + \_/ @@ +167 SECTION SIGN + _ @ + / \ @ + ( )@ + \_/ @@ +168 DIAERESIS + _ @ + / \ @ + ( )@ + \_/ @@ +169 COPYRIGHT SIGN + _ @ + / \ @ + ( )@ + \_/ @@ +170 FEMININE ORDINAL INDICATOR + _ @ + / \ @ + ( )@ + \_/ @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + _ @ + / \ @ + ( )@ + \_/ @@ +172 NOT SIGN + _ @ + / \ @ + ( )@ + \_/ @@ +173 SOFT HYPHEN + _ @ + / \ @ + ( )@ + \_/ @@ +174 REGISTERED SIGN + _ @ + / \ @ + ( )@ + \_/ @@ +175 MACRON + _ @ + / \ @ + ( )@ + \_/ @@ +176 DEGREE SIGN + _ @ + / \ @ + ( )@ + \_/ @@ +177 PLUS-MINUS SIGN + _ @ + / \ @ + ( )@ + \_/ @@ +178 SUPERSCRIPT TWO + _ @ + / \ @ + ( )@ + \_/ @@ +179 SUPERSCRIPT THREE + _ @ + / \ @ + ( )@ + \_/ @@ +180 ACUTE ACCENT + _ @ + / \ @ + ( )@ + \_/ @@ +181 MICRO SIGN + _ @ + / \ @ + ( )@ + \_/ @@ +182 PILCROW SIGN + _ @ + / \ @ + ( )@ + \_/ @@ +183 MIDDLE DOT + _ @ + / \ @ + ( )@ + \_/ @@ +184 CEDILLA + _ @ + / \ @ + ( )@ + \_/ @@ +185 SUPERSCRIPT ONE + _ @ + / \ @ + ( )@ + \_/ @@ +186 MASCULINE ORDINAL INDICATOR + _ @ + / \ @ + ( )@ + \_/ @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + _ @ + / \ @ + ( )@ + \_/ @@ +188 VULGAR FRACTION ONE QUARTER + _ @ + / \ @ + ( )@ + \_/ @@ +189 VULGAR FRACTION ONE HALF + _ @ + / \ @ + ( )@ + \_/ @@ +190 VULGAR FRACTION THREE QUARTERS + _ @ + / \ @ + ( )@ + \_/ @@ +191 INVERTED QUESTION MARK + _ @ + / \ @ + ( )@ + \_/ @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + _ @ + / \ @ + ( )@ + \_/ @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + _ @ + / \ @ + ( )@ + \_/ @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + _ @ + / \ @ + ( )@ + \_/ @@ +195 LATIN CAPITAL LETTER A WITH TILDE + _ @ + / \ @ + ( )@ + \_/ @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _ @ + / \ @ + ( )@ + \_/ @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + _ @ + / \ @ + ( )@ + \_/ @@ +198 LATIN CAPITAL LETTER AE + _ @ + / \ @ + ( )@ + \_/ @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + _ @ + / \ @ + ( )@ + \_/ @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + _ @ + / \ @ + ( )@ + \_/ @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + _ @ + / \ @ + ( )@ + \_/ @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + _ @ + / \ @ + ( )@ + \_/ @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _ @ + / \ @ + ( )@ + \_/ @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + _ @ + / \ @ + ( )@ + \_/ @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + _ @ + / \ @ + ( )@ + \_/ @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + _ @ + / \ @ + ( )@ + \_/ @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _ @ + / \ @ + ( )@ + \_/ @@ +208 LATIN CAPITAL LETTER ETH + _ @ + / \ @ + ( )@ + \_/ @@ +209 LATIN CAPITAL LETTER N WITH TILDE + _ @ + / \ @ + ( )@ + \_/ @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + _ @ + / \ @ + ( )@ + \_/ @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + _ @ + / \ @ + ( )@ + \_/ @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + _ @ + / \ @ + ( )@ + \_/ @@ +213 LATIN CAPITAL LETTER O WITH TILDE + _ @ + / \ @ + ( )@ + \_/ @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _ @ + / \ @ + ( )@ + \_/ @@ +215 MULTIPLICATION SIGN + _ @ + / \ @ + ( )@ + \_/ @@ +216 LATIN CAPITAL LETTER O WITH STROKE + _ @ + / \ @ + ( )@ + \_/ @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + _ @ + / \ @ + ( )@ + \_/ @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + _ @ + / \ @ + ( )@ + \_/ @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + _ @ + / \ @ + ( )@ + \_/ @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _ @ + / \ @ + ( )@ + \_/ @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + _ @ + / \ @ + ( )@ + \_/ @@ +222 LATIN CAPITAL LETTER THORN + _ @ + / \ @ + ( )@ + \_/ @@ +223 LATIN SMALL LETTER SHARP S + _ @ + / \ @ + ( )@ + \_/ @@ +224 LATIN SMALL LETTER A WITH GRAVE + _ @ + / \ @ + ( )@ + \_/ @@ +225 LATIN SMALL LETTER A WITH ACUTE + _ @ + / \ @ + ( )@ + \_/ @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + _ @ + / \ @ + ( )@ + \_/ @@ +227 LATIN SMALL LETTER A WITH TILDE + _ @ + / \ @ + ( )@ + \_/ @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _ @ + / \ @ + ( )@ + \_/ @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + _ @ + / \ @ + ( )@ + \_/ @@ +230 LATIN SMALL LETTER AE + _ @ + / \ @ + ( )@ + \_/ @@ +231 LATIN SMALL LETTER C WITH CEDILLA + _ @ + / \ @ + ( )@ + \_/ @@ +232 LATIN SMALL LETTER E WITH GRAVE + _ @ + / \ @ + ( )@ + \_/ @@ +233 LATIN SMALL LETTER E WITH ACUTE + _ @ + / \ @ + ( )@ + \_/ @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + _ @ + / \ @ + ( )@ + \_/ @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _ @ + / \ @ + ( )@ + \_/ @@ +236 LATIN SMALL LETTER I WITH GRAVE + _ @ + / \ @ + ( )@ + \_/ @@ +237 LATIN SMALL LETTER I WITH ACUTE + _ @ + / \ @ + ( )@ + \_/ @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + _ @ + / \ @ + ( )@ + \_/ @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _ @ + / \ @ + ( )@ + \_/ @@ +240 LATIN SMALL LETTER ETH + _ @ + / \ @ + ( )@ + \_/ @@ +241 LATIN SMALL LETTER N WITH TILDE + _ @ + / \ @ + ( )@ + \_/ @@ +242 LATIN SMALL LETTER O WITH GRAVE + _ @ + / \ @ + ( )@ + \_/ @@ +243 LATIN SMALL LETTER O WITH ACUTE + _ @ + / \ @ + ( )@ + \_/ @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + _ @ + / \ @ + ( )@ + \_/ @@ +245 LATIN SMALL LETTER O WITH TILDE + _ @ + / \ @ + ( )@ + \_/ @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _ @ + / \ @ + ( )@ + \_/ @@ +247 DIVISION SIGN + _ @ + / \ @ + ( )@ + \_/ @@ +248 LATIN SMALL LETTER O WITH STROKE + _ @ + / \ @ + ( )@ + \_/ @@ +249 LATIN SMALL LETTER U WITH GRAVE + _ @ + / \ @ + ( )@ + \_/ @@ +250 LATIN SMALL LETTER U WITH ACUTE + _ @ + / \ @ + ( )@ + \_/ @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + _ @ + / \ @ + ( )@ + \_/ @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _ @ + / \ @ + ( )@ + \_/ @@ +253 LATIN SMALL LETTER Y WITH ACUTE + _ @ + / \ @ + ( )@ + \_/ @@ +254 LATIN SMALL LETTER THORN + _ @ + / \ @ + ( )@ + \_/ @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _ @ + / \ @ + ( )@ + \_/ @@ +0x0100 LATIN CAPITAL LETTER A WITH MACRON + _ @ + / \ @ + ( )@ + \_/ @@ +0x0101 LATIN SMALL LETTER A WITH MACRON + _ @ + / \ @ + ( )@ + \_/ @@ +0x0102 LATIN CAPITAL LETTER A WITH BREVE + _ @ + / \ @ + ( )@ + \_/ @@ +0x0103 LATIN SMALL LETTER A WITH BREVE + _ @ + / \ @ + ( )@ + \_/ @@ +0x0104 LATIN CAPITAL LETTER A WITH OGONEK + _ @ + / \ @ + ( )@ + \_/ @@ +0x0105 LATIN SMALL LETTER A WITH OGONEK + _ @ + / \ @ + ( )@ + \_/ @@ +0x0106 LATIN CAPITAL LETTER C WITH ACUTE + _ @ + / \ @ + ( )@ + \_/ @@ +0x0107 LATIN SMALL LETTER C WITH ACUTE + _ @ + / \ @ + ( )@ + \_/ @@ +0x0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX + _ @ + / \ @ + ( )@ + \_/ @@ +0x0109 LATIN SMALL LETTER C WITH CIRCUMFLEX + _ @ + / \ @ + ( )@ + \_/ @@ +0x010A LATIN CAPITAL LETTER C WITH DOT ABOVE + _ @ + / \ @ + ( )@ + \_/ @@ +0x010B LATIN SMALL LETTER C WITH DOT ABOVE + _ @ + / \ @ + ( )@ + \_/ @@ +0x010C LATIN CAPITAL LETTER C WITH CARON + _ @ + / \ @ + ( )@ + \_/ @@ +0x010D LATIN SMALL LETTER C WITH CARON + _ @ + / \ @ + ( )@ + \_/ @@ +0x010E LATIN CAPITAL LETTER D WITH CARON + _ @ + / \ @ + ( )@ + \_/ @@ +0x010F LATIN SMALL LETTER D WITH CARON + _ @ + / \ @ + ( )@ + \_/ @@ +0x0110 LATIN CAPITAL LETTER D WITH STROKE + _ @ + / \ @ + ( )@ + \_/ @@ +0x0111 LATIN SMALL LETTER D WITH STROKE + _ @ + / \ @ + ( )@ + \_/ @@ +0x0112 LATIN CAPITAL LETTER E WITH MACRON + _ @ + / \ @ + ( )@ + \_/ @@ +0x0113 LATIN SMALL LETTER E WITH MACRON + _ @ + / \ @ + ( )@ + \_/ @@ +0x0116 LATIN CAPITAL LETTER E WITH DOT ABOVE + _ @ + / \ @ + ( )@ + \_/ @@ +0x0117 LATIN SMALL LETTER E WITH DOT ABOVE + _ @ + / \ @ + ( )@ + \_/ @@ +0x0118 LATIN CAPITAL LETTER E WITH OGONEK + _ @ + / \ @ + ( )@ + \_/ @@ +0x0119 LATIN SMALL LETTER E WITH OGONEK + _ @ + / \ @ + ( )@ + \_/ @@ +0x011A LATIN CAPITAL LETTER E WITH CARON + _ @ + / \ @ + ( )@ + \_/ @@ +0x011B LATIN SMALL LETTER E WITH CARON + _ @ + / \ @ + ( )@ + \_/ @@ +0x011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX + _ @ + / \ @ + ( )@ + \_/ @@ +0x011D LATIN SMALL LETTER G WITH CIRCUMFLEX + _ @ + / \ @ + ( )@ + \_/ @@ +0x011E LATIN CAPITAL LETTER G WITH BREVE + _ @ + / \ @ + ( )@ + \_/ @@ +0x011F LATIN SMALL LETTER G WITH BREVE + _ @ + / \ @ + ( )@ + \_/ @@ +0x0120 LATIN CAPITAL LETTER G WITH DOT ABOVE + _ @ + / \ @ + ( )@ + \_/ @@ +0x0121 LATIN SMALL LETTER G WITH DOT ABOVE + _ @ + / \ @ + ( )@ + \_/ @@ +0x0122 LATIN CAPITAL LETTER G WITH CEDILLA + _ @ + / \ @ + ( )@ + \_/ @@ +0x0123 LATIN SMALL LETTER G WITH CEDILLA + _ @ + / \ @ + ( )@ + \_/ @@ +0x0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX + _ @ + / \ @ + ( )@ + \_/ @@ +0x0125 LATIN SMALL LETTER H WITH CIRCUMFLEX + _ @ + / \ @ + ( )@ + \_/ @@ +0x0126 LATIN CAPITAL LETTER H WITH STROKE + _ @ + / \ @ + ( )@ + \_/ @@ +0x0127 LATIN SMALL LETTER H WITH STROKE + _ @ + / \ @ + ( )@ + \_/ @@ +0x0128 LATIN CAPITAL LETTER I WITH TILDE + _ @ + / \ @ + ( )@ + \_/ @@ +0x0129 LATIN SMALL LETTER I WITH TILDE + _ @ + / \ @ + ( )@ + \_/ @@ +0x012A LATIN CAPITAL LETTER I WITH MACRON + _ @ + / \ @ + ( )@ + \_/ @@ +0x012B LATIN SMALL LETTER I WITH MACRON + _ @ + / \ @ + ( )@ + \_/ @@ +0x012E LATIN CAPITAL LETTER I WITH OGONEK + _ @ + / \ @ + ( )@ + \_/ @@ +0x012F LATIN SMALL LETTER I WITH OGONEK + _ @ + / \ @ + ( )@ + \_/ @@ +0x0130 LATIN CAPITAL LETTER I WITH DOT ABOVE + _ @ + / \ @ + ( )@ + \_/ @@ +0x0131 LATIN SMALL LETTER DOTLESS I + _ @ + / \ @ + ( )@ + \_/ @@ +0x0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX + _ @ + / \ @ + ( )@ + \_/ @@ +0x0135 LATIN SMALL LETTER J WITH CIRCUMFLEX + _ @ + / \ @ + ( )@ + \_/ @@ +0x0136 LATIN CAPITAL LETTER K WITH CEDILLA + _ @ + / \ @ + ( )@ + \_/ @@ +0x0137 LATIN SMALL LETTER K WITH CEDILLA + _ @ + / \ @ + ( )@ + \_/ @@ +0x0138 LATIN SMALL LETTER KRA + _ @ + / \ @ + ( )@ + \_/ @@ +0x0139 LATIN CAPITAL LETTER L WITH ACUTE + _ @ + / \ @ + ( )@ + \_/ @@ +0x013A LATIN SMALL LETTER L WITH ACUTE + _ @ + / \ @ + ( )@ + \_/ @@ +0x013B LATIN CAPITAL LETTER L WITH CEDILLA + _ @ + / \ @ + ( )@ + \_/ @@ +0x013C LATIN SMALL LETTER L WITH CEDILLA + _ @ + / \ @ + ( )@ + \_/ @@ +0x013D LATIN CAPITAL LETTER L WITH CARON + _ @ + / \ @ + ( )@ + \_/ @@ +0x013E LATIN SMALL LETTER L WITH CARON + _ @ + / \ @ + ( )@ + \_/ @@ +0x0141 LATIN CAPITAL LETTER L WITH STROKE + _ @ + / \ @ + ( )@ + \_/ @@ +0x0142 LATIN SMALL LETTER L WITH STROKE + _ @ + / \ @ + ( )@ + \_/ @@ +0x0143 LATIN CAPITAL LETTER N WITH ACUTE + _ @ + / \ @ + ( )@ + \_/ @@ +0x0144 LATIN SMALL LETTER N WITH ACUTE + _ @ + / \ @ + ( )@ + \_/ @@ +0x0145 LATIN CAPITAL LETTER N WITH CEDILLA + _ @ + / \ @ + ( )@ + \_/ @@ +0x0146 LATIN SMALL LETTER N WITH CEDILLA + _ @ + / \ @ + ( )@ + \_/ @@ +0x0147 LATIN CAPITAL LETTER N WITH CARON + _ @ + / \ @ + ( )@ + \_/ @@ +0x0148 LATIN SMALL LETTER N WITH CARON + _ @ + / \ @ + ( )@ + \_/ @@ +0x014A LATIN CAPITAL LETTER ENG + _ @ + / \ @ + ( )@ + \_/ @@ +0x014B LATIN SMALL LETTER ENG + _ @ + / \ @ + ( )@ + \_/ @@ +0x014C LATIN CAPITAL LETTER O WITH MACRON + _ @ + / \ @ + ( )@ + \_/ @@ +0x014D LATIN SMALL LETTER O WITH MACRON + _ @ + / \ @ + ( )@ + \_/ @@ +0x0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + _ @ + / \ @ + ( )@ + \_/ @@ +0x0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE + _ @ + / \ @ + ( )@ + \_/ @@ +0x0154 LATIN CAPITAL LETTER R WITH ACUTE + _ @ + / \ @ + ( )@ + \_/ @@ +0x0155 LATIN SMALL LETTER R WITH ACUTE + _ @ + / \ @ + ( )@ + \_/ @@ +0x0156 LATIN CAPITAL LETTER R WITH CEDILLA + _ @ + / \ @ + ( )@ + \_/ @@ +0x0157 LATIN SMALL LETTER R WITH CEDILLA + _ @ + / \ @ + ( )@ + \_/ @@ +0x0158 LATIN CAPITAL LETTER R WITH CARON + _ @ + / \ @ + ( )@ + \_/ @@ +0x0159 LATIN SMALL LETTER R WITH CARON + _ @ + / \ @ + ( )@ + \_/ @@ +0x015A LATIN CAPITAL LETTER S WITH ACUTE + _ @ + / \ @ + ( )@ + \_/ @@ +0x015B LATIN SMALL LETTER S WITH ACUTE + _ @ + / \ @ + ( )@ + \_/ @@ +0x015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX + _ @ + / \ @ + ( )@ + \_/ @@ +0x015D LATIN SMALL LETTER S WITH CIRCUMFLEX + _ @ + / \ @ + ( )@ + \_/ @@ +0x015E LATIN CAPITAL LETTER S WITH CEDILLA + _ @ + / \ @ + ( )@ + \_/ @@ +0x015F LATIN SMALL LETTER S WITH CEDILLA + _ @ + / \ @ + ( )@ + \_/ @@ +0x0160 LATIN CAPITAL LETTER S WITH CARON + _ @ + / \ @ + ( )@ + \_/ @@ +0x0161 LATIN SMALL LETTER S WITH CARON + _ @ + / \ @ + ( )@ + \_/ @@ +0x0162 LATIN CAPITAL LETTER T WITH CEDILLA + _ @ + / \ @ + ( )@ + \_/ @@ +0x0163 LATIN SMALL LETTER T WITH CEDILLA + _ @ + / \ @ + ( )@ + \_/ @@ +0x0164 LATIN CAPITAL LETTER T WITH CARON + _ @ + / \ @ + ( )@ + \_/ @@ +0x0165 LATIN SMALL LETTER T WITH CARON + _ @ + / \ @ + ( )@ + \_/ @@ +0x0166 LATIN CAPITAL LETTER T WITH STROKE + _ @ + / \ @ + ( )@ + \_/ @@ +0x0167 LATIN SMALL LETTER T WITH STROKE + _ @ + / \ @ + ( )@ + \_/ @@ +0x0168 LATIN CAPITAL LETTER U WITH TILDE + _ @ + / \ @ + ( )@ + \_/ @@ +0x0169 LATIN SMALL LETTER U WITH TILDE + _ @ + / \ @ + ( )@ + \_/ @@ +0x016A LATIN CAPITAL LETTER U WITH MACRON + _ @ + / \ @ + ( )@ + \_/ @@ +0x016B LATIN SMALL LETTER U WITH MACRON + _ @ + / \ @ + ( )@ + \_/ @@ +0x016C LATIN CAPITAL LETTER U WITH BREVE + _ @ + / \ @ + ( )@ + \_/ @@ +0x016D LATIN SMALL LETTER U WITH BREVE + _ @ + / \ @ + ( )@ + \_/ @@ +0x016E LATIN CAPITAL LETTER U WITH RING ABOVE + _ @ + / \ @ + ( )@ + \_/ @@ +0x016F LATIN SMALL LETTER U WITH RING ABOVE + _ @ + / \ @ + ( )@ + \_/ @@ +0x0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + _ @ + / \ @ + ( )@ + \_/ @@ +0x0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE + _ @ + / \ @ + ( )@ + \_/ @@ +0x0172 LATIN CAPITAL LETTER U WITH OGONEK + _ @ + / \ @ + ( )@ + \_/ @@ +0x0173 LATIN SMALL LETTER U WITH OGONEK + _ @ + / \ @ + ( )@ + \_/ @@ +0x0179 LATIN CAPITAL LETTER Z WITH ACUTE + _ @ + / \ @ + ( )@ + \_/ @@ +0x017A LATIN SMALL LETTER Z WITH ACUTE + _ @ + / \ @ + ( )@ + \_/ @@ +0x017B LATIN CAPITAL LETTER Z WITH DOT ABOVE + _ @ + / \ @ + ( )@ + \_/ @@ +0x017C LATIN SMALL LETTER Z WITH DOT ABOVE + _ @ + / \ @ + ( )@ + \_/ @@ +0x017D LATIN CAPITAL LETTER Z WITH CARON + _ @ + / \ @ + ( )@ + \_/ @@ +0x017E LATIN SMALL LETTER Z WITH CARON + _ @ + / \ @ + ( )@ + \_/ @@ +0x02C7 CARON + _ @ + / \ @ + ( )@ + \_/ @@ +0x02D8 BREVE + _ @ + / \ @ + ( )@ + \_/ @@ +0x02D9 DOT ABOVE + _ @ + / \ @ + ( )@ + \_/ @@ +0x02DB OGONEK + _ @ + / \ @ + ( )@ + \_/ @@ +0x02DD DOUBLE ACUTE ACCENT + _ @ + / \ @ + ( )@ + \_/ @@ diff --git a/cosmic rage/fonts/digital.flf b/cosmic rage/fonts/digital.flf new file mode 100644 index 0000000..6b7a1ca --- /dev/null +++ b/cosmic rage/fonts/digital.flf @@ -0,0 +1,1286 @@ +flf2a 3 2 6 1 11 0 16513 242 +Digital by Glenn Chappell 1/94 -- based on Bubble +Includes characters 128-255 +Enhanced for Latin-2,3,4 by John Cowan +Latin character sets supported only if your screen font does +figlet release 2.2 -- November 1996 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + @ + @ + @@ + +-+@ + |!|@ + +-+@@ + +-+@ + |"|@ + +-+@@ + +-+@ + |#|@ + +-+@@ + +-+@ + |$|@ + +-+@@ + +-+@ + |%|@ + +-+@@ + +-+@ + |&|@ + +-+@@ + +-+@ + |'|@ + +-+@@ + +-+@ + |(|@ + +-+@@ + +-+@ + |)|@ + +-+@@ + +-+@ + |*|@ + +-+@@ + +-+@ + |+|@ + +-+@@ + +-+@ + |,|@ + +-+@@ + +-+@ + |-|@ + +-+@@ + +-+@ + |.|@ + +-+@@ + +-+@ + |/|@ + +-+@@ + +-+@ + |0|@ + +-+@@ + +-+@ + |1|@ + +-+@@ + +-+@ + |2|@ + +-+@@ + +-+@ + |3|@ + +-+@@ + +-+@ + |4|@ + +-+@@ + +-+@ + |5|@ + +-+@@ + +-+@ + |6|@ + +-+@@ + +-+@ + |7|@ + +-+@@ + +-+@ + |8|@ + +-+@@ + +-+@ + |9|@ + +-+@@ + +-+@ + |:|@ + +-+@@ + +-+@ + |;|@ + +-+@@ + +-+@ + |<|@ + +-+@@ + +-+@ + |=|@ + +-+@@ + +-+@ + |>|@ + +-+@@ + +-+@ + |?|@ + +-+@@ + +-+@ + |@|@ + +-+@@ + +-+@ + |A|@ + +-+@@ + +-+@ + |B|@ + +-+@@ + +-+@ + |C|@ + +-+@@ + +-+@ + |D|@ + +-+@@ + +-+@ + |E|@ + +-+@@ + +-+@ + |F|@ + +-+@@ + +-+@ + |G|@ + +-+@@ + +-+@ + |H|@ + +-+@@ + +-+@ + |I|@ + +-+@@ + +-+@ + |J|@ + +-+@@ + +-+@ + |K|@ + +-+@@ + +-+@ + |L|@ + +-+@@ + +-+@ + |M|@ + +-+@@ + +-+@ + |N|@ + +-+@@ + +-+@ + |O|@ + +-+@@ + +-+@ + |P|@ + +-+@@ + +-+@ + |Q|@ + +-+@@ + +-+@ + |R|@ + +-+@@ + +-+@ + |S|@ + +-+@@ + +-+@ + |T|@ + +-+@@ + +-+@ + |U|@ + +-+@@ + +-+@ + |V|@ + +-+@@ + +-+@ + |W|@ + +-+@@ + +-+@ + |X|@ + +-+@@ + +-+@ + |Y|@ + +-+@@ + +-+@ + |Z|@ + +-+@@ + +-+@ + |[|@ + +-+@@ + +-+@ + |\|@ + +-+@@ + +-+@ + |]|@ + +-+@@ + +-+@ + |^|@ + +-+@@ + +-+@ + |_|@ + +-+@@ + +-+@ + |`|@ + +-+@@ + +-+@ + |a|@ + +-+@@ + +-+@ + |b|@ + +-+@@ + +-+@ + |c|@ + +-+@@ + +-+@ + |d|@ + +-+@@ + +-+@ + |e|@ + +-+@@ + +-+@ + |f|@ + +-+@@ + +-+@ + |g|@ + +-+@@ + +-+@ + |h|@ + +-+@@ + +-+@ + |i|@ + +-+@@ + +-+@ + |j|@ + +-+@@ + +-+@ + |k|@ + +-+@@ + +-+@ + |l|@ + +-+@@ + +-+@ + |m|@ + +-+@@ + +-+@ + |n|@ + +-+@@ + +-+@ + |o|@ + +-+@@ + +-+@ + |p|@ + +-+@@ + +-+@ + |q|@ + +-+@@ + +-+@ + |r|@ + +-+@@ + +-+@ + |s|@ + +-+@@ + +-+@ + |t|@ + +-+@@ + +-+@ + |u|@ + +-+@@ + +-+@ + |v|@ + +-+@@ + +-+@ + |w|@ + +-+@@ + +-+@ + |x|@ + +-+@@ + +-+@ + |y|@ + +-+@@ + +-+@ + |z|@ + +-+@@ + +-+@ + |{|@ + +-+@@ + +-+@ + |||@ + +-+@@ + +-+@ + |}|@ + +-+@@ + +-+@ + |~|@ + +-+@@ + +-+@ + ||@ + +-+@@ + +-+@ + ||@ + +-+@@ + +-+@ + ||@ + +-+@@ + +-+@ + ||@ + +-+@@ + +-+@ + ||@ + +-+@@ + +-+@ + ||@ + +-+@@ + +-+@ + ||@ + +-+@@ +128 + +-+@ + ||@ + +-+@@ +129 + +-+@ + ||@ + +-+@@ +130 + +-+@ + ||@ + +-+@@ +131 + +-+@ + ||@ + +-+@@ +132 + +-+@ + ||@ + +-+@@ +133 + +-+@ + ||@ + +-+@@ +134 + +-+@ + ||@ + +-+@@ +135 + +-+@ + ||@ + +-+@@ +136 + +-+@ + ||@ + +-+@@ +137 + +-+@ + ||@ + +-+@@ +138 + +-+@ + ||@ + +-+@@ +139 + +-+@ + ||@ + +-+@@ +140 + +-+@ + ||@ + +-+@@ +141 + +-+@ + ||@ + +-+@@ +142 + +-+@ + ||@ + +-+@@ +143 + +-+@ + ||@ + +-+@@ +144 + +-+@ + ||@ + +-+@@ +145 + +-+@ + ||@ + +-+@@ +146 + +-+@ + ||@ + +-+@@ +147 + +-+@ + ||@ + +-+@@ +148 + +-+@ + ||@ + +-+@@ +149 + +-+@ + ||@ + +-+@@ +150 + +-+@ + ||@ + +-+@@ +151 + +-+@ + ||@ + +-+@@ +152 + +-+@ + ||@ + +-+@@ +153 + +-+@ + ||@ + +-+@@ +154 + +-+@ + ||@ + +-+@@ +155 + +-+@ + ||@ + +-+@@ +156 + +-+@ + ||@ + +-+@@ +157 + +-+@ + ||@ + +-+@@ +158 + +-+@ + ||@ + +-+@@ +159 + +-+@ + ||@ + +-+@@ +160 NO-BREAK SPACE + +-+@ + ||@ + +-+@@ +161 INVERTED EXCLAMATION MARK + +-+@ + ||@ + +-+@@ +162 CENT SIGN + +-+@ + ||@ + +-+@@ +163 POUND SIGN + +-+@ + ||@ + +-+@@ +164 CURRENCY SIGN + +-+@ + ||@ + +-+@@ +165 YEN SIGN + +-+@ + ||@ + +-+@@ +166 BROKEN BAR + +-+@ + ||@ + +-+@@ +167 SECTION SIGN + +-+@ + ||@ + +-+@@ +168 DIAERESIS + +-+@ + ||@ + +-+@@ +169 COPYRIGHT SIGN + +-+@ + ||@ + +-+@@ +170 FEMININE ORDINAL INDICATOR + +-+@ + ||@ + +-+@@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + +-+@ + ||@ + +-+@@ +172 NOT SIGN + +-+@ + ||@ + +-+@@ +173 SOFT HYPHEN + +-+@ + ||@ + +-+@@ +174 REGISTERED SIGN + +-+@ + ||@ + +-+@@ +175 MACRON + +-+@ + ||@ + +-+@@ +176 DEGREE SIGN + +-+@ + ||@ + +-+@@ +177 PLUS-MINUS SIGN + +-+@ + ||@ + +-+@@ +178 SUPERSCRIPT TWO + +-+@ + ||@ + +-+@@ +179 SUPERSCRIPT THREE + +-+@ + ||@ + +-+@@ +180 ACUTE ACCENT + +-+@ + ||@ + +-+@@ +181 MICRO SIGN + +-+@ + ||@ + +-+@@ +182 PILCROW SIGN + +-+@ + ||@ + +-+@@ +183 MIDDLE DOT + +-+@ + ||@ + +-+@@ +184 CEDILLA + +-+@ + ||@ + +-+@@ +185 SUPERSCRIPT ONE + +-+@ + ||@ + +-+@@ +186 MASCULINE ORDINAL INDICATOR + +-+@ + ||@ + +-+@@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + +-+@ + ||@ + +-+@@ +188 VULGAR FRACTION ONE QUARTER + +-+@ + ||@ + +-+@@ +189 VULGAR FRACTION ONE HALF + +-+@ + ||@ + +-+@@ +190 VULGAR FRACTION THREE QUARTERS + +-+@ + ||@ + +-+@@ +191 INVERTED QUESTION MARK + +-+@ + ||@ + +-+@@ +192 LATIN CAPITAL LETTER A WITH GRAVE + +-+@ + ||@ + +-+@@ +193 LATIN CAPITAL LETTER A WITH ACUTE + +-+@ + ||@ + +-+@@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + +-+@ + ||@ + +-+@@ +195 LATIN CAPITAL LETTER A WITH TILDE + +-+@ + ||@ + +-+@@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + +-+@ + ||@ + +-+@@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + +-+@ + ||@ + +-+@@ +198 LATIN CAPITAL LETTER AE + +-+@ + ||@ + +-+@@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + +-+@ + ||@ + +-+@@ +200 LATIN CAPITAL LETTER E WITH GRAVE + +-+@ + ||@ + +-+@@ +201 LATIN CAPITAL LETTER E WITH ACUTE + +-+@ + ||@ + +-+@@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + +-+@ + ||@ + +-+@@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + +-+@ + ||@ + +-+@@ +204 LATIN CAPITAL LETTER I WITH GRAVE + +-+@ + ||@ + +-+@@ +205 LATIN CAPITAL LETTER I WITH ACUTE + +-+@ + ||@ + +-+@@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + +-+@ + ||@ + +-+@@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + +-+@ + ||@ + +-+@@ +208 LATIN CAPITAL LETTER ETH + +-+@ + ||@ + +-+@@ +209 LATIN CAPITAL LETTER N WITH TILDE + +-+@ + ||@ + +-+@@ +210 LATIN CAPITAL LETTER O WITH GRAVE + +-+@ + ||@ + +-+@@ +211 LATIN CAPITAL LETTER O WITH ACUTE + +-+@ + ||@ + +-+@@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + +-+@ + ||@ + +-+@@ +213 LATIN CAPITAL LETTER O WITH TILDE + +-+@ + ||@ + +-+@@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + +-+@ + ||@ + +-+@@ +215 MULTIPLICATION SIGN + +-+@ + ||@ + +-+@@ +216 LATIN CAPITAL LETTER O WITH STROKE + +-+@ + ||@ + +-+@@ +217 LATIN CAPITAL LETTER U WITH GRAVE + +-+@ + ||@ + +-+@@ +218 LATIN CAPITAL LETTER U WITH ACUTE + +-+@ + ||@ + +-+@@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + +-+@ + ||@ + +-+@@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + +-+@ + ||@ + +-+@@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + +-+@ + ||@ + +-+@@ +222 LATIN CAPITAL LETTER THORN + +-+@ + ||@ + +-+@@ +223 LATIN SMALL LETTER SHARP S + +-+@ + ||@ + +-+@@ +224 LATIN SMALL LETTER A WITH GRAVE + +-+@ + ||@ + +-+@@ +225 LATIN SMALL LETTER A WITH ACUTE + +-+@ + ||@ + +-+@@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + +-+@ + ||@ + +-+@@ +227 LATIN SMALL LETTER A WITH TILDE + +-+@ + ||@ + +-+@@ +228 LATIN SMALL LETTER A WITH DIAERESIS + +-+@ + ||@ + +-+@@ +229 LATIN SMALL LETTER A WITH RING ABOVE + +-+@ + ||@ + +-+@@ +230 LATIN SMALL LETTER AE + +-+@ + ||@ + +-+@@ +231 LATIN SMALL LETTER C WITH CEDILLA + +-+@ + ||@ + +-+@@ +232 LATIN SMALL LETTER E WITH GRAVE + +-+@ + ||@ + +-+@@ +233 LATIN SMALL LETTER E WITH ACUTE + +-+@ + ||@ + +-+@@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + +-+@ + ||@ + +-+@@ +235 LATIN SMALL LETTER E WITH DIAERESIS + +-+@ + ||@ + +-+@@ +236 LATIN SMALL LETTER I WITH GRAVE + +-+@ + ||@ + +-+@@ +237 LATIN SMALL LETTER I WITH ACUTE + +-+@ + ||@ + +-+@@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + +-+@ + ||@ + +-+@@ +239 LATIN SMALL LETTER I WITH DIAERESIS + +-+@ + ||@ + +-+@@ +240 LATIN SMALL LETTER ETH + +-+@ + ||@ + +-+@@ +241 LATIN SMALL LETTER N WITH TILDE + +-+@ + ||@ + +-+@@ +242 LATIN SMALL LETTER O WITH GRAVE + +-+@ + ||@ + +-+@@ +243 LATIN SMALL LETTER O WITH ACUTE + +-+@ + ||@ + +-+@@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + +-+@ + ||@ + +-+@@ +245 LATIN SMALL LETTER O WITH TILDE + +-+@ + ||@ + +-+@@ +246 LATIN SMALL LETTER O WITH DIAERESIS + +-+@ + ||@ + +-+@@ +247 DIVISION SIGN + +-+@ + ||@ + +-+@@ +248 LATIN SMALL LETTER O WITH STROKE + +-+@ + ||@ + +-+@@ +249 LATIN SMALL LETTER U WITH GRAVE + +-+@ + ||@ + +-+@@ +250 LATIN SMALL LETTER U WITH ACUTE + +-+@ + ||@ + +-+@@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + +-+@ + ||@ + +-+@@ +252 LATIN SMALL LETTER U WITH DIAERESIS + +-+@ + ||@ + +-+@@ +253 LATIN SMALL LETTER Y WITH ACUTE + +-+@ + ||@ + +-+@@ +254 LATIN SMALL LETTER THORN + +-+@ + ||@ + +-+@@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + +-+@ + ||@ + +-+@@ +0x0100 LATIN CAPITAL LETTER A WITH MACRON + +-+@ + ||@ + +-+@@ +0x0101 LATIN SMALL LETTER A WITH MACRON + +-+@ + ||@ + +-+@@ +0x0102 LATIN CAPITAL LETTER A WITH BREVE + +-+@ + ||@ + +-+@@ +0x0103 LATIN SMALL LETTER A WITH BREVE + +-+@ + ||@ + +-+@@ +0x0104 LATIN CAPITAL LETTER A WITH OGONEK + +-+@ + ||@ + +-+@@ +0x0105 LATIN SMALL LETTER A WITH OGONEK + +-+@ + ||@ + +-+@@ +0x0106 LATIN CAPITAL LETTER C WITH ACUTE + +-+@ + ||@ + +-+@@ +0x0107 LATIN SMALL LETTER C WITH ACUTE + +-+@ + ||@ + +-+@@ +0x0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX + +-+@ + ||@ + +-+@@ +0x0109 LATIN SMALL LETTER C WITH CIRCUMFLEX + +-+@ + ||@ + +-+@@ +0x010A LATIN CAPITAL LETTER C WITH DOT ABOVE + +-+@ + ||@ + +-+@@ +0x010B LATIN SMALL LETTER C WITH DOT ABOVE + +-+@ + ||@ + +-+@@ +0x010C LATIN CAPITAL LETTER C WITH CARON + +-+@ + ||@ + +-+@@ +0x010D LATIN SMALL LETTER C WITH CARON + +-+@ + ||@ + +-+@@ +0x010E LATIN CAPITAL LETTER D WITH CARON + +-+@ + ||@ + +-+@@ +0x010F LATIN SMALL LETTER D WITH CARON + +-+@ + ||@ + +-+@@ +0x0110 LATIN CAPITAL LETTER D WITH STROKE + +-+@ + ||@ + +-+@@ +0x0111 LATIN SMALL LETTER D WITH STROKE + +-+@ + ||@ + +-+@@ +0x0112 LATIN CAPITAL LETTER E WITH MACRON + +-+@ + ||@ + +-+@@ +0x0113 LATIN SMALL LETTER E WITH MACRON + +-+@ + ||@ + +-+@@ +0x0116 LATIN CAPITAL LETTER E WITH DOT ABOVE + +-+@ + ||@ + +-+@@ +0x0117 LATIN SMALL LETTER E WITH DOT ABOVE + +-+@ + ||@ + +-+@@ +0x0118 LATIN CAPITAL LETTER E WITH OGONEK + +-+@ + ||@ + +-+@@ +0x0119 LATIN SMALL LETTER E WITH OGONEK + +-+@ + ||@ + +-+@@ +0x011A LATIN CAPITAL LETTER E WITH CARON + +-+@ + ||@ + +-+@@ +0x011B LATIN SMALL LETTER E WITH CARON + +-+@ + ||@ + +-+@@ +0x011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX + +-+@ + ||@ + +-+@@ +0x011D LATIN SMALL LETTER G WITH CIRCUMFLEX + +-+@ + ||@ + +-+@@ +0x011E LATIN CAPITAL LETTER G WITH BREVE + +-+@ + ||@ + +-+@@ +0x011F LATIN SMALL LETTER G WITH BREVE + +-+@ + ||@ + +-+@@ +0x0120 LATIN CAPITAL LETTER G WITH DOT ABOVE + +-+@ + ||@ + +-+@@ +0x0121 LATIN SMALL LETTER G WITH DOT ABOVE + +-+@ + ||@ + +-+@@ +0x0122 LATIN CAPITAL LETTER G WITH CEDILLA + +-+@ + ||@ + +-+@@ +0x0123 LATIN SMALL LETTER G WITH CEDILLA + +-+@ + ||@ + +-+@@ +0x0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX + +-+@ + ||@ + +-+@@ +0x0125 LATIN SMALL LETTER H WITH CIRCUMFLEX + +-+@ + ||@ + +-+@@ +0x0126 LATIN CAPITAL LETTER H WITH STROKE + +-+@ + ||@ + +-+@@ +0x0127 LATIN SMALL LETTER H WITH STROKE + +-+@ + ||@ + +-+@@ +0x0128 LATIN CAPITAL LETTER I WITH TILDE + +-+@ + ||@ + +-+@@ +0x0129 LATIN SMALL LETTER I WITH TILDE + +-+@ + ||@ + +-+@@ +0x012A LATIN CAPITAL LETTER I WITH MACRON + +-+@ + ||@ + +-+@@ +0x012B LATIN SMALL LETTER I WITH MACRON + +-+@ + ||@ + +-+@@ +0x012E LATIN CAPITAL LETTER I WITH OGONEK + +-+@ + ||@ + +-+@@ +0x012F LATIN SMALL LETTER I WITH OGONEK + +-+@ + ||@ + +-+@@ +0x0130 LATIN CAPITAL LETTER I WITH DOT ABOVE + +-+@ + ||@ + +-+@@ +0x0131 LATIN SMALL LETTER DOTLESS I + +-+@ + ||@ + +-+@@ +0x0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX + +-+@ + ||@ + +-+@@ +0x0135 LATIN SMALL LETTER J WITH CIRCUMFLEX + +-+@ + ||@ + +-+@@ +0x0136 LATIN CAPITAL LETTER K WITH CEDILLA + +-+@ + ||@ + +-+@@ +0x0137 LATIN SMALL LETTER K WITH CEDILLA + +-+@ + ||@ + +-+@@ +0x0138 LATIN SMALL LETTER KRA + +-+@ + ||@ + +-+@@ +0x0139 LATIN CAPITAL LETTER L WITH ACUTE + +-+@ + ||@ + +-+@@ +0x013A LATIN SMALL LETTER L WITH ACUTE + +-+@ + ||@ + +-+@@ +0x013B LATIN CAPITAL LETTER L WITH CEDILLA + +-+@ + ||@ + +-+@@ +0x013C LATIN SMALL LETTER L WITH CEDILLA + +-+@ + ||@ + +-+@@ +0x013D LATIN CAPITAL LETTER L WITH CARON + +-+@ + ||@ + +-+@@ +0x013E LATIN SMALL LETTER L WITH CARON + +-+@ + ||@ + +-+@@ +0x0141 LATIN CAPITAL LETTER L WITH STROKE + +-+@ + ||@ + +-+@@ +0x0142 LATIN SMALL LETTER L WITH STROKE + +-+@ + ||@ + +-+@@ +0x0143 LATIN CAPITAL LETTER N WITH ACUTE + +-+@ + ||@ + +-+@@ +0x0144 LATIN SMALL LETTER N WITH ACUTE + +-+@ + ||@ + +-+@@ +0x0145 LATIN CAPITAL LETTER N WITH CEDILLA + +-+@ + ||@ + +-+@@ +0x0146 LATIN SMALL LETTER N WITH CEDILLA + +-+@ + ||@ + +-+@@ +0x0147 LATIN CAPITAL LETTER N WITH CARON + +-+@ + ||@ + +-+@@ +0x0148 LATIN SMALL LETTER N WITH CARON + +-+@ + ||@ + +-+@@ +0x014A LATIN CAPITAL LETTER ENG + +-+@ + ||@ + +-+@@ +0x014B LATIN SMALL LETTER ENG + +-+@ + ||@ + +-+@@ +0x014C LATIN CAPITAL LETTER O WITH MACRON + +-+@ + ||@ + +-+@@ +0x014D LATIN SMALL LETTER O WITH MACRON + +-+@ + ||@ + +-+@@ +0x0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + +-+@ + ||@ + +-+@@ +0x0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE + +-+@ + ||@ + +-+@@ +0x0154 LATIN CAPITAL LETTER R WITH ACUTE + +-+@ + ||@ + +-+@@ +0x0155 LATIN SMALL LETTER R WITH ACUTE + +-+@ + ||@ + +-+@@ +0x0156 LATIN CAPITAL LETTER R WITH CEDILLA + +-+@ + ||@ + +-+@@ +0x0157 LATIN SMALL LETTER R WITH CEDILLA + +-+@ + ||@ + +-+@@ +0x0158 LATIN CAPITAL LETTER R WITH CARON + +-+@ + ||@ + +-+@@ +0x0159 LATIN SMALL LETTER R WITH CARON + +-+@ + ||@ + +-+@@ +0x015A LATIN CAPITAL LETTER S WITH ACUTE + +-+@ + ||@ + +-+@@ +0x015B LATIN SMALL LETTER S WITH ACUTE + +-+@ + ||@ + +-+@@ +0x015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX + +-+@ + ||@ + +-+@@ +0x015D LATIN SMALL LETTER S WITH CIRCUMFLEX + +-+@ + ||@ + +-+@@ +0x015E LATIN CAPITAL LETTER S WITH CEDILLA + +-+@ + ||@ + +-+@@ +0x015F LATIN SMALL LETTER S WITH CEDILLA + +-+@ + ||@ + +-+@@ +0x0160 LATIN CAPITAL LETTER S WITH CARON + +-+@ + ||@ + +-+@@ +0x0161 LATIN SMALL LETTER S WITH CARON + +-+@ + ||@ + +-+@@ +0x0162 LATIN CAPITAL LETTER T WITH CEDILLA + +-+@ + ||@ + +-+@@ +0x0163 LATIN SMALL LETTER T WITH CEDILLA + +-+@ + ||@ + +-+@@ +0x0164 LATIN CAPITAL LETTER T WITH CARON + +-+@ + ||@ + +-+@@ +0x0165 LATIN SMALL LETTER T WITH CARON + +-+@ + ||@ + +-+@@ +0x0166 LATIN CAPITAL LETTER T WITH STROKE + +-+@ + ||@ + +-+@@ +0x0167 LATIN SMALL LETTER T WITH STROKE + +-+@ + ||@ + +-+@@ +0x0168 LATIN CAPITAL LETTER U WITH TILDE + +-+@ + ||@ + +-+@@ +0x0169 LATIN SMALL LETTER U WITH TILDE + +-+@ + ||@ + +-+@@ +0x016A LATIN CAPITAL LETTER U WITH MACRON + +-+@ + ||@ + +-+@@ +0x016B LATIN SMALL LETTER U WITH MACRON + +-+@ + ||@ + +-+@@ +0x016C LATIN CAPITAL LETTER U WITH BREVE + +-+@ + ||@ + +-+@@ +0x016D LATIN SMALL LETTER U WITH BREVE + +-+@ + ||@ + +-+@@ +0x016E LATIN CAPITAL LETTER U WITH RING ABOVE + +-+@ + ||@ + +-+@@ +0x016F LATIN SMALL LETTER U WITH RING ABOVE + +-+@ + ||@ + +-+@@ +0x0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + +-+@ + ||@ + +-+@@ +0x0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE + +-+@ + ||@ + +-+@@ +0x0172 LATIN CAPITAL LETTER U WITH OGONEK + +-+@ + ||@ + +-+@@ +0x0173 LATIN SMALL LETTER U WITH OGONEK + +-+@ + ||@ + +-+@@ +0x0179 LATIN CAPITAL LETTER Z WITH ACUTE + +-+@ + ||@ + +-+@@ +0x017A LATIN SMALL LETTER Z WITH ACUTE + +-+@ + ||@ + +-+@@ +0x017B LATIN CAPITAL LETTER Z WITH DOT ABOVE + +-+@ + ||@ + +-+@@ +0x017C LATIN SMALL LETTER Z WITH DOT ABOVE + +-+@ + ||@ + +-+@@ +0x017D LATIN CAPITAL LETTER Z WITH CARON + +-+@ + ||@ + +-+@@ +0x017E LATIN SMALL LETTER Z WITH CARON + +-+@ + ||@ + +-+@@ +0x02C7 CARON + +-+@ + ||@ + +-+@@ +0x02D8 BREVE + +-+@ + ||@ + +-+@@ +0x02D9 DOT ABOVE + +-+@ + ||@ + +-+@@ +0x02DB OGONEK + +-+@ + ||@ + +-+@@ +0x02DD DOUBLE ACUTE ACCENT + +-+@ + ||@ + +-+@@ diff --git a/cosmic rage/fonts/lean.flf b/cosmic rage/fonts/lean.flf new file mode 100644 index 0000000..7e53563 --- /dev/null +++ b/cosmic rage/fonts/lean.flf @@ -0,0 +1,1691 @@ +flf2a$ 8 6 27 0 10 0 576 96 +Lean by Glenn Chappell 4/93 -- based on various .sig's +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + + $ $@ + $ $ @ + $ $ @ + $ $ @ + $ $ @ + $ $ @ + $ $ @ +$ $ @@ + $$@ + _/ $ @ + _/ $ @ + _/ $ @ + $$ @ +_/ $ @ + $$ @ + @@ + _/ _/ $@ + _/ _/ $ @ + $$ @ + $$ @ + $$ @ +$$ @ + @ + @@ + $$ @ + _/ _/ $@ + _/_/_/_/_/ $ @ + _/ _/ $ @ +_/_/_/_/_/ $ @ + _/ _/ $ @ + $$ @ + @@ + $$ @ + _/ $@ + _/_/_/ $ @ + _/_/ $ @ + _/_/ $ @ +_/_/_/ $ @ + _/ $ @ + $$ @@ + $$@ + _/_/ _/ $ @ + _/_/ _/ $ @ + _/ $ @ + _/ _/_/ $ @ +_/ _/_/ $ @ + $$ @ + @@ + $$ @ + _/ $ @ + _/ _/ $@ + _/_/ _/ $ @ +_/ _/ $ @ + _/_/ _/ $ @ + $$ @ + @@ + _/ $@ + _/ $ @ + $$ @ + $$ @ + $$ @ +$$ @ + @ + @@ + _/ $@ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + _/ $ @ + $$ @@ + _/ $@ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @@ + $$@ + _/ _/ _/ $ @ + _/_/_/ $ @ + _/_/_/_/_/ $ @ + _/_/_/ $ @ +_/ _/ _/ $ @ + $$ @ + @@ + $$ @ + _/ $ @ + _/ $@ +_/_/_/_/_/ $ @ + _/ $ @ + _/ $ @ + $$ @ + @@ + @ + @ + @ + @ + $$@ + _/ $ @ +_/ $ @ + $$ @@ + @ + @ + $$@ +_/_/_/_/_/ $ @ + $$ @ + @ + @ + @@ + @ + @ + @ + @ + $$@ +_/ $ @ + $$ @ + @@ + $$@ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + $$ @ + _/ $@ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/ $ @ + $$ @ + @@ + $$@ + _/ $ @ + _/_/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + $$ @ + _/_/ $@ + _/ _/ $ @ + _/ $ @ + _/ $ @ +_/_/_/_/ $ @ + $$ @ + @@ + $$ @ + _/_/_/ $@ + _/ $ @ + _/_/ $ @ + _/ $ @ +_/_/_/ $ @ + $$ @ + @@ + $$@ + _/ _/ $ @ + _/ _/ $@ +_/_/_/_/ $ @ + _/ $ @ + _/ $ @ + $$ @ + @@ + $$@ + _/_/_/_/ $ @ + _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/_/ $ @ + $$ @ + @@ + $$@ + _/_/_/ $ @ + _/ $ @ + _/_/_/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ + $$@ + _/_/_/_/_/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + $$ @ + _/_/ $@ + _/ _/ $ @ + _/_/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ + $$ @ + _/_/ $@ + _/ _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/_/ $ @ + $$ @ + @@ + @ + $$@ + _/ $ @ + $$ @ + $$ @ +_/ $ @ + $$ @ + @@ + @ + $$@ + _/ $ @ + $$ @ + $$ @ + _/ $ @ +_/ $ @ + $$ @@ + $$@ + _/ $ @ + _/ $ @ +_/ $ @ + _/ $ @ + _/ $ @ + $$ @ + @@ + @ + $$@ + _/_/_/_/_/ $ @ + $$ @ +_/_/_/_/_/ $ @ + $$ @ + @ + @@ + $$ @ + _/ $ @ + _/ $@ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + $$ @ + _/_/ $@ + _/ $ @ + _/_/ $ @ + $$ @ +_/ $ @ + $$ @ + @@ + $$ @ + _/_/_/_/_/ $@ + _/ _/ $ @ + _/ _/_/_/ _/ $ @ + _/ _/ _/ _/ $ @ +_/ _/_/_/_/ $ @ + _/ $ @ + _/_/_/_/_/_/ $ @@ + $$ @ + _/_/ $@ + _/ _/ $ @ + _/_/_/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ + $$ @ + _/_/_/ $@ + _/ _/ $ @ + _/_/_/ $ @ + _/ _/ $ @ +_/_/_/ $ @ + $$ @ + @@ + $$@ + _/_/_/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + _/_/_/ $ @ + $$ @ + @@ + $$ @ + _/_/_/ $@ + _/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ +_/_/_/ $ @ + $$ @ + @@ + $$@ + _/_/_/_/ $ @ + _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/_/_/ $ @ + $$ @ + @@ + $$@ + _/_/_/_/ $ @ + _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + $$@ + _/_/_/ $ @ + _/ $ @ + _/ _/_/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ + $$@ + _/ _/ $ @ + _/ _/ $ @ + _/_/_/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ + $$@ + _/_/_/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/_/_/ $ @ + $$ @ + @@ + $$@ + _/ $ @ + _/ $ @ + _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ + $$@ + _/ _/ $ @ + _/ _/ $ @ + _/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ + $$ @ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $@ +_/_/_/_/ $ @ + $$ @ + @@ + $$@ + _/ _/ $ @ + _/_/ _/_/ $ @ + _/ _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ + $$@ + _/ _/ $ @ + _/_/ _/ $ @ + _/ _/ _/ $ @ + _/ _/_/ $ @ +_/ _/ $ @ + $$ @ + @@ + $$ @ + _/_/ $@ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ + $$ @ + _/_/_/ $@ + _/ _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + $$ @ + _/_/ $@ + _/ _/ $ @ + _/ _/_/ $ @ +_/ _/ $ @ + _/_/ _/ $ @ + $$ @ + @@ + $$ @ + _/_/_/ $@ + _/ _/ $ @ + _/_/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ + $$@ + _/_/_/ $ @ + _/ $ @ + _/_/ $ @ + _/ $ @ +_/_/_/ $ @ + $$ @ + @@ + $$@ +_/_/_/_/_/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + $$@ + _/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ + $$@ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/ _/ $ @ + _/ $ @ + $$ @ + @@ + $$@ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ _/ $ @ + _/ _/ _/ $ @ + _/ _/ $ @ + $$ @ + @@ + $$@ + _/ _/ $ @ + _/ _/ $ @ + _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ + $$@ +_/ _/ $ @ + _/ _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + $$@ + _/_/_/_/_/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/_/_/_/_/ $ @ + $$ @ + @@ + _/_/ $@ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/_/ $ @ + $$ @@ + $$ @ +_/ $ @ + _/ $ @ + _/ $ @ + _/ $@ + _/ $ @ + $$ @ + @@ + _/_/ $@ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/_/ $ @ + $$ @@ + _/ $@ + _/ _/ $ @ + $$ @ + $$ @ + $$ @ +$$ @ + @ + @@ + @ + @ + @ + @ + @ + $$ @ + $$@ +_/_/_/_/_/ $ @@ + _/ $@ + _/ $ @ + $$ @ + $$ @ + $$ @ +$$ @ + @ + @@ + @ + $$@ + _/_/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ + $$ @ + _/ $ @ + _/_/_/ $@ + _/ _/ $ @ + _/ _/ $ @ +_/_/_/ $ @ + $$ @ + @@ + @ + $$@ + _/_/_/ $ @ + _/ $ @ +_/ $ @ + _/_/_/ $ @ + $$ @ + @@ + $$@ + _/ $ @ + _/_/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ + @ + $$ @ + _/_/ $@ + _/_/_/_/ $ @ +_/ $ @ + _/_/_/ $ @ + $$ @ + @@ + $$@ + _/_/ $ @ + _/ $ @ +_/_/_/_/ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + @ + $$@ + _/_/_/ $ @ + _/ _/ $ @ + _/ _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/ $ @@ + $$ @ + _/ $ @ + _/_/_/ $@ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ + $$@ + _/ $ @ + $$ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + $$@ + _/ $ @ + $$ @ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @@ + $$ @ + _/ $@ + _/ _/ $ @ + _/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ + $$@ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + @ + $$ @ + _/_/_/ _/_/ $@ + _/ _/ _/ $ @ + _/ _/ _/ $ @ +_/ _/ _/ $ @ + $$ @ + @@ + @ + $$ @ + _/_/_/ $@ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ + @ + $$ @ + _/_/ $@ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ + @ + $$ @ + _/_/_/ $@ + _/ _/ $ @ + _/ _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/ $ @@ + @ + $$@ + _/_/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + _/ $ @ + _/ $ @@ + @ + $$@ + _/ _/_/ $ @ + _/_/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ + @ + $$@ + _/_/_/ $ @ + _/_/ $ @ + _/_/ $ @ +_/_/_/ $ @ + $$ @ + @@ + $$ @ + _/ $@ +_/_/_/_/ @ + _/ $ @ +_/ $ @ + _/_/ $ @ + $$ @ + @@ + @ + $$@ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ + @ + $$@ + _/ _/ $ @ +_/ _/ $ @ + _/ _/ $ @ + _/ $ @ + $$ @ + @@ + @ + $$@ + _/ _/ _/ $ @ +_/ _/ _/ $ @ + _/ _/ _/ _/ $ @ + _/ _/ $ @ + $$ @ + @@ + @ + $$@ + _/ _/ $ @ + _/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ + @ + $$@ + _/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/ $ @@ + @ + $$@ + _/_/_/_/ $ @ + _/ $ @ + _/ $ @ +_/_/_/_/ $ @ + $$ @ + @@ + _/ $@ + _/ $ @ + _/ $ @ +_/ $ @ + _/ $ @ +_/ $ @ + _/ $ @ + $$ @@ + _/ $@ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @@ + _/ $ @ + _/ $@ + _/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @@ + _/ _/ $@ +_/ _/ $ @ + $$ @ + $$ @ + $$ @ +$$ @ + @ + @@ + _/ _/ $@ + $$ @ + _/_/ $ @ + _/ _/ $ @ + _/_/_/_/ $ @ +_/ _/ $ @ + $$ @ + @@ + _/ _/ $@ + $$ @ + _/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ + _/ _/ $@ + $$ @ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ + _/ _/ $@ + $$ @ + _/_/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ + _/ _/ $@ + $$ @ + _/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ + _/ _/ $@ + $$ @ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ + $$ @ + _/_/ $@ + _/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ +_/ $ @ + $$ @@ +160 NO-BREAK SPACE + $ $@ + $ $ @ + $ $ @ + $ $ @ + $ $ @ + $ $ @ + $ $ @ +$ $ @@ +161 INVERTED EXCLAMATION MARK + $$@ + _/ $ @ + $$ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ +162 CENT SIGN + $$ @ + _/ $@ + _/_/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + _/ $ @ + $$ @@ +163 POUND SIGN + $$ @ + _/_/ $@ + _/ _/ $ @ + _/_/_/ $ @ + _/ $ @ + _/_/_/ _/ $ @ +_/_/ _/_/ $ @ + @@ +164 CURRENCY SIGN + $$@ + _/ _/ $ @ + _/_/_/_/ $ @ + _/ _/ $ @ + _/ _/ $ @ + _/_/_/_/ $ @ +_/ _/ $ @ + $$ @@ +165 YEN SIGN + $$@ + _/ _/ $ @ + _/ _/ $ @ + _/_/_/_/_/ $ @ + _/ $ @ +_/_/_/_/_/ $ @ + _/ $ @ + $$ @@ +166 BROKEN BAR + _/ $@ + _/ $ @ + _/ $ @ + $$ @ + $$ @ + _/ $ @ + _/ $ @ +_/ $ @@ +167 SECTION SIGN + _/_/ $@ + _/ $ @ + _/ $ @ + _/ _/ $ @ + _/ $ @ + _/ $ @ +_/_/ $ @ + $$ @@ +168 DIAERESIS + _/ _/ $@ + $$ @ + $ $ @ + $ $ @ + $ $ @ +$ $ @ + @ + @@ +169 COPYRIGHT SIGN + _/_/_/_/ $ @ + _/ _/ $@ + _/ _/_/_/ _/ $ @ + _/ _/ _/ $ @ + _/ _/ _/ $ @ +_/ _/_/_/ _/ $ @ + _/ _/ $ @ + _/_/_/_/ $ @@ +170 FEMININE ORDINAL INDICATOR + $$@ + _/_/_/ $ @ + _/ _/ $ @ + _/_/_/ $ @ + $$ @ +_/_/_/_/ $ @ + @ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + $$@ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ + $$ @ + @@ +172 NOT SIGN + @ + @ + $$@ +_/_/_/_/_/ $ @ + _/ $ @ + $$ @ + @ + @@ +173 SOFT HYPHEN + @ + @ + $$@ +_/_/_/_/ $ @ + $$ @ + $$ @ + @ + @@ +174 REGISTERED SIGN + _/_/_/_/ $ @ + _/ _/ $@ + _/ _/_/_/ _/ $ @ + _/ _/ _/ _/ $ @ + _/ _/_/_/ _/ $ @ +_/ _/ _/ _/ $ @ + _/ _/ $ @ + _/_/_/_/ $ @@ +175 MACRON + _/_/_/_/_/ $@ + $$ @ + $$ @ + $$ @ + $$ @ +$$ @ + @ + @@ +176 DEGREE SIGN + _/ $@ + _/ _/ $ @ + _/ $ @ + $$ @ + $$ @ +$$ @ + @ + @@ +177 PLUS-MINUS SIGN + $$ @ + _/ $ @ + _/ $@ + _/_/_/_/_/ $ @ + _/ $ @ +_/_/_/_/_/ $ @ + $$ @ + @@ +178 SUPERSCRIPT TWO + $$ @ + _/_/ $@ + _/ $ @ + _/ $ @ +_/_/_/ $ @ + $$ @ + @ + @@ +179 SUPERSCRIPT THREE + $$@ + _/_/_/ $ @ + _/ $ @ + _/ $ @ +_/_/ $ @ + $$ @ + @ + @@ +180 ACUTE ACCENT + _/ $@ + _/ $ @ + $$ @ + $$ @ + $$ @ +$$ @ + @ + @@ +181 MICRO SIGN + @ + $$@ + _/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ + _/_/_/_/ $ @ + _/ $ @ +_/ $ @@ +182 PILCROW SIGN + $$@ + _/_/_/_/ $ @ +_/_/_/ _/ $ @ + _/_/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ + $$ @ + @@ +183 MIDDLE DOT + @ + @ + $$@ + _/ $ @ + $$ @ +$$ @ + @ + @@ +184 CEDILLA + @ + @ + @ + @ + @ + $$@ + _/ $ @ +_/_/ $ @@ +185 SUPERSCRIPT ONE + $$@ + _/ $ @ +_/_/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @ + @@ +186 MASCULINE ORDINAL INDICATOR + $$ @ + _/_/ $@ + _/ _/ $ @ + _/_/ $ @ + $$ @ +_/_/_/_/ $ @ + @ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + $$ @ + _/ _/ $ @ + _/ _/ $@ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ +188 VULGAR FRACTION ONE QUARTER + $$ @ + _/ _/ $@ +_/_/ _/ _/ _/ $ @ + _/ _/ _/ _/ $@ +_/ _/ _/_/_/_/ $ @ + _/ _/ $ @ + $$ @ + @@ +189 VULGAR FRACTION ONE HALF + $$ @ + _/ _/ $ @ +_/_/ _/ _/_/ $@ + _/ _/ _/ $ @ +_/ _/ _/ $ @ + _/ _/_/_/ $ @ + $$ @ + @@ +190 VULGAR FRACTION THREE QUARTERS + $$ @ + _/_/_/ _/ $@ + _/ _/ _/ _/ $ @ + _/ _/ _/ _/ $@ +_/_/ _/ _/_/_/_/ $ @ + _/ _/ $ @ + $$ @ + @@ +191 INVERTED QUESTION MARK + $$@ + _/ $ @ + $$ @ + _/_/ $ @ +_/ $ @ + _/_/ $ @ + $$ @ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + _/ $@ + _/ $ @ + _/_/ $@ + _/ _/ $ @ + _/_/_/_/ $ @ +_/ _/ $ @ + $$ @ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + _/ $@ + _/ $ @ + _/_/ $@ + _/ _/ $ @ + _/_/_/_/ $ @ +_/ _/ $ @ + $$ @ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + _/_/ $@ + _/ _/ $ @ + $$ @ + _/_/ $ @ + _/_/_/_/ $ @ +_/ _/ $ @ + $$ @ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + _/ _/ $@ + _/ _/ $ @ + $$ @ + _/_/ $ @ + _/_/_/_/ $ @ +_/ _/ $ @ + $$ @ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _/ _/ $@ + $$ @ + _/_/ $ @ + _/ _/ $ @ + _/_/_/_/ $ @ +_/ _/ $ @ + $$ @ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + _/_/ $@ + _/ _/ $ @ + _/_/ $ @ + _/ _/ $ @ + _/_/_/_/ $ @ +_/ _/ $ @ + $$ @ + @@ +198 LATIN CAPITAL LETTER AE + $$@ + _/_/_/_/_/_/ $ @ + _/ _/ $ @ + _/_/_/_/_/_/ $ @ + _/ _/ $ @ +_/ _/_/_/_/ $ @ + $$ @ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + $$@ + _/_/_/ $ @ + _/ $ @ + _/ $ @ + _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/ $ @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + _/ $ @ + _/ $@ + _/_/_/_/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/_/_/ $ @ + $$ @ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + _/ $ @ + _/ $@ + _/_/_/_/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/_/_/ $ @ + $$ @ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + _/_/ $@ + _/ _/ $ @ + _/_/_/_/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/_/_/ $ @ + $$ @ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _/ _/ $@ + $$ @ + _/_/_/_/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/_/_/ $ @ + $$ @ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + _/ $ @ + _/ $@ + _/_/_/ $ @ + _/ $ @ + _/ $ @ +_/_/_/ $ @ + $$ @ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + _/ $@ + _/ $ @ + _/_/_/ $ @ + _/ $ @ + _/ $ @ +_/_/_/ $ @ + $$ @ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + _/ $@ + _/ _/ $ @ + _/_/_/ $ @ + _/ $ @ + _/ $ @ +_/_/_/ $ @ + $$ @ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _/ _/ $@ + $$ @ + _/_/_/ $ @ + _/ $ @ + _/ $ @ +_/_/_/ $ @ + $$ @ + @@ +208 LATIN CAPITAL LETTER ETH + $$ @ + _/_/_/ $@ + _/ _/ $ @ +_/_/_/ _/ $ @ + _/ _/ $ @ +_/_/_/ $ @ + $$ @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + _/ _/ $@ + _/ _/ $ @ + _/ _/ $ @ + _/_/ _/ $ @ + _/ _/_/ $ @ +_/ _/ $ @ + $$ @ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + _/ $@ + _/ $ @ + _/_/ $@ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + _/ $@ + _/ $ @ + _/_/ $@ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + _/_/ $@ + _/ _/ $ @ + _/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + _/ _/ $@ + _/ _/ $ @ + _/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _/ _/ $@ + $$ @ + _/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +215 MULTIPLICATION SIGN + @ + $$@ + _/ _/ $ @ + _/ $ @ +_/ _/ $ @ + $$ @ + @ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + $$@ + _/_/_/_/ $ @ + _/ _/_/ $ @ + _/ _/ _/ $ @ + _/_/ _/ $ @ +_/_/_/_/ $ @ + $$ @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + _/ $@ + _/ $ @ + $$@ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + _/ $@ + _/ $ @ + $$@ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + _/_/ $@ + _/ _/ $ @ + $$ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _/ _/ $@ + $$ @ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + _/ $ @ + _/ $@ +_/ _/ $ @ + _/ _/ $ @ + _/ $ @ + _/ $ @ + $$ @ + @@ +222 LATIN CAPITAL LETTER THORN + $$ @ + _/ $ @ + _/_/_/ $@ + _/ _/ $ @ + _/_/_/ $ @ +_/ $ @ + $$ @ + @@ +223 LATIN SMALL LETTER SHARP S + $$ @ + _/_/ $@ + _/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ +_/ $ @ + $$ @@ +224 LATIN SMALL LETTER A WITH GRAVE + _/ $@ + _/ $ @ + $$@ + _/_/_/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + _/ $@ + _/ $ @ + $$ @ + _/_/_/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + _/ $@ + _/ _/ $ @ + $$ @ + _/_/_/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ +227 LATIN SMALL LETTER A WITH TILDE + _/ _/ $@ + _/ _/ $ @ + $$ @ + _/_/_/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _/ _/ $@ + $$ @ + _/_/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + _/ $@ + _/ _/ $ @ + _/ $ @ + _/_/_/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ +230 LATIN SMALL LETTER AE + @ + $$ @ + _/_/_/ _/_/ $@ + _/ _/_/_/_/_/ $ @ +_/ _/_/ $ @ + _/_/_/ _/_/_/ $ @ + $$ @ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + $$@ + _/_/_/ $ @ + _/ $ @ + _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/ $ @@ +232 LATIN SMALL LETTER E WITH GRAVE + _/ $@ + _/ $ @ + _/_/ $ @ + _/_/_/_/ $ @ +_/ $ @ + _/_/_/ $ @ + $$ @ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + _/ $@ + _/ $ @ + _/_/ $ @ + _/_/_/_/ $ @ +_/ $ @ + _/_/_/ $ @ + $$ @ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + _/_/ $@ + _/ _/ $ @ + _/_/ $ @ + _/_/_/_/ $ @ +_/ $ @ + _/_/_/ $ @ + $$ @ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _/ _/ $@ + $$ @ + _/_/ $ @ + _/_/_/_/ $ @ +_/ $ @ + _/_/_/ $ @ + $$ @ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + _/ $@ + _/ $ @ + $$ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + _/ $@ + _/ $ @ + $$ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + _/ $@ + _/ _/ $ @ + $$ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _/ _/ $@ + $$ @ + _/ $ @ + _/ $ @ + _/ $ @ +_/ $ @ + $$ @ + @@ +240 LATIN SMALL LETTER ETH + _/ _/ $@ + _/ $ @ + _/ _/ $@ + _/_/_/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + _/ _/ $@ + _/ _/ $ @ + $$ @ + _/_/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + $$ @ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + _/ $@ + _/ $ @ + $$ @ + _/_/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + _/ $@ + _/ $ @ + $$ @ + _/_/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + _/_/ $@ + _/ _/ $ @ + $$ @ + _/_/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +245 LATIN SMALL LETTER O WITH TILDE + _/_/_/ $@ + _/ _/ $ @ + $$ @ + _/_/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _/ _/ $@ + $$ @ + _/_/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/ $ @ + $$ @ + @@ +247 DIVISION SIGN + $$ @ + _/ $ @ + $$@ +_/_/_/_/_/ $ @ + $$ @ + _/ $ @ + $$ @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + $$@ + _/_/_/ $ @ + _/ _/_/ $ @ + _/_/ _/ $ @ +_/_/_/ $ @ + $$ @ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + _/ $ @ + _/ $ @ + $$@ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + _/ $@ + _/ $ @ + $$ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + _/_/ $@ + _/ _/ $ @ + $$ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _/ _/ $@ + $$ @ + _/ _/ $ @ + _/ _/ $ @ +_/ _/ $ @ + _/_/_/ $ @ + $$ @ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + _/ $@ + _/ $ @ + $$@ + _/ _/ $ @ + _/ _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/ $ @@ +254 LATIN SMALL LETTER THORN + $$ @ + _/ $ @ + _/_/_/ $@ + _/ _/ $ @ + _/ _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/ $ @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _/ _/ $@ + $$ @ + _/ _/ $ @ + _/ _/ $ @ + _/ _/ $ @ + _/_/_/ $ @ + _/ $ @ +_/_/ $ @@ diff --git a/cosmic rage/fonts/mini.flf b/cosmic rage/fonts/mini.flf new file mode 100644 index 0000000..3b72606 --- /dev/null +++ b/cosmic rage/fonts/mini.flf @@ -0,0 +1,899 @@ +flf2a$ 4 3 10 0 10 0 1920 96 +Mini by Glenn Chappell 4/93 +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + +$$@ +$$@ +$$@ +$$@@ + @ + |$@ + o$@ + @@ + @ + ||$@ + @ + @@ + @ + -|-|-$@ + -|-|-$@ + @@ + _$@ + (|$ @ + _|)$@ + @@ + @ + O/$@ + /O$@ + @@ + @ + ()$ @ + (_X$@ + @@ + @ + /$@ + @ + @@ + @ + /$@ + |$ @ + \$@@ + @ + \$ @ + |$@ + /$ @@ + @ + \|/$@ + /|\$@ + @@ + @ + _|_$@ + |$ @ + @@ + @ + @ + o$@ + /$@@ + @ + __$@ + @ + @@ + @ + @ + o$@ + @@ + @ + /$@ + /$ @ + @@ + _$ @ + / \$@ + \_/$@ + @@ + @ + /|$@ + |$@ + @@ + _$ @ + )$@ + /_$@ + @@ + _$ @ + _)$@ + _)$@ + @@ + @ + |_|_$@ + |$ @ + @@ + _$ @ + |_$ @ + _)$@ + @@ + _$ @ + |_$ @ + |_)$@ + @@ + __$@ + /$@ + /$ @ + @@ + _$ @ + (_)$@ + (_)$@ + @@ + _$ @ + (_|$@ + |$@ + @@ + @ + o$@ + o$@ + @@ + @ + o$@ + o$@ + /$@@ + @ + /$@ + \$@ + @@ + @ + --$@ + --$@ + @@ + @ + \$@ + /$@ + @@ + _$ @ + )$@ + o$ @ + @@ + __$ @ + / \$@ + | (|/$@ + \__$ @@ + @ + /\$ @ + /--\$@ + @@ + _$ @ + |_)$@ + |_)$@ + @@ + _$@ + /$ @ + \_$@ + @@ + _$ @ + | \$@ + |_/$@ + @@ + _$@ + |_$@ + |_$@ + @@ + _$@ + |_$@ + |$ @ + @@ + __$@ + /__$@ + \_|$@ + @@ + @ + |_|$@ + | |$@ + @@ + ___$@ + |$ @ + _|_$@ + @@ + @ + |$@ + \_|$@ + @@ + @ + |/$@ + |\$@ + @@ + @ + |$ @ + |_$@ + @@ + @ + |\/|$@ + | |$@ + @@ + @ + |\ |$@ + | \|$@ + @@ + _$ @ + / \$@ + \_/$@ + @@ + _$ @ + |_)$@ + |$ @ + @@ + _$ @ + / \$@ + \_X$@ + @@ + _$ @ + |_)$@ + | \$@ + @@ + __$@ + (_$ @ + __)$@ + @@ + ___$@ + |$ @ + |$ @ + @@ + @ + | |$@ + |_|$@ + @@ + @ + \ /$@ + \/$ @ + @@ + @ + \ /$@ + \/\/$ @ + @@ + @ + \/$@ + /\$@ + @@ + @ + \_/$@ + |$ @ + @@ + __$@ + /$@ + /_$@ + @@ + _$@ + |$ @ + |_$@ + @@ + @ + \$ @ + \$@ + @@ + _$ @ + |$@ + _|$@ + @@ + /\$@ + @ + @ + @@ + @ + @ + @ + __$@@ + @ + \$@ + @ + @@ + @ + _.$@ + (_|$@ + @@ + @ + |_$ @ + |_)$@ + @@ + @ + _$@ + (_$@ + @@ + @ + _|$@ + (_|$@ + @@ + @ + _$ @ + (/_$@ + @@ + _$@ + _|_$@ + |$ @ + @@ + @ + _$ @ + (_|$@ + _|$@@ + @ + |_$ @ + | |$@ + @@ + @ + o$@ + |$@ + @@ + @ + o$@ + |$@ + _|$@@ + @ + |$ @ + |<$@ + @@ + @ + |$@ + |$@ + @@ + @ + ._ _$ @ + | | |$@ + @@ + @ + ._$ @ + | |$@ + @@ + @ + _$ @ + (_)$@ + @@ + @ + ._$ @ + |_)$@ + |$ @@ + @ + _.$@ + (_|$@ + |$@@ + @ + ._$@ + |$ @ + @@ + @ + _$@ + _>$@ + @@ + @ + _|_$@ + |_$@ + @@ + @ + @ + |_|$@ + @@ + @ + @ + \/$@ + @@ + @ + @ + \/\/$@ + @@ + @ + @ + ><$@ + @@ + @ + @ + \/$@ + /$ @@ + @ + _$ @ + /_$@ + @@ + ,-$@ + _|$ @ + |$ @ + `-$@@ + |$@ + |$@ + |$@ + |$@@ + -.$ @ + |_$@ + |$ @ + -'$ @@ + /\/$@ + @ + @ + @@ + o o$@ + /\$ @ + /--\$@ + @@ + o_o$@ + / \$@ + \_/$@ + @@ + o o$@ + | |$@ + |_|$@ + @@ + o o$@ + _.$@ + (_|$@ + @@ + o o$@ + _$ @ + (_)$@ + @@ + o o$@ + @ + |_|$@ + @@ + _$ @ + | )$@ + | )$@ + |$ @@ +160 NO-BREAK SPACE + $$@ + $$@ + $$@ + $$@@ +161 INVERTED EXCLAMATION MARK + @ + o$@ + |$@ + @@ +162 CENT SIGN + @ + |_$@ + (__$@ + |$ @@ +163 POUND SIGN + _$ @ + _/_`$ @ + |___$@ + @@ +164 CURRENCY SIGN + @ + `o'$@ + ' `$@ + @@ +165 YEN SIGN + @ + _\_/_$@ + --|--$@ + @@ +166 BROKEN BAR + |$@ + |$@ + |$@ + |$@@ +167 SECTION SIGN + _$@ + ($ @ + ()$@ + _)$@@ +168 DIAERESIS + o o$@ + @ + @ + @@ +169 COPYRIGHT SIGN + _$ @ + |C|$@ + `-'$@ + @@ +170 FEMININE ORDINAL INDICATOR + _.$@ + (_|$@ + ---$@ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + @ + //$@ + \\$@ + @@ +172 NOT SIGN + @ + __$ @ + |$@ + @@ +173 SOFT HYPHEN + @ + _$@ + @ + @@ +174 REGISTERED SIGN + _$ @ + |R|$@ + `-'$@ + @@ +175 MACRON + __$@ + @ + @ + @@ +176 DEGREE SIGN + O$@ + @ + @ + @@ +177 PLUS-MINUS SIGN + @ + _|_$@ + _|_$@ + @@ +178 SUPERSCRIPT TWO + 2$@ + @ + @ + @@ +179 SUPERSCRIPT THREE + 3$@ + @ + @ + @@ +180 ACUTE ACCENT + /$@ + @ + @ + @@ +181 MICRO SIGN + @ + @ + |_|$@ + |$ @@ +182 PILCROW SIGN + __$ @ + (| |$@ + | |$@ + @@ +183 MIDDLE DOT + @ + o$@ + @ + @@ +184 CEDILLA + @ + @ + @ + S$@@ +185 SUPERSCRIPT ONE + 1$@ + @ + @ + @@ +186 MASCULINE ORDINAL INDICATOR + _$ @ + (_)$@ + ---$@ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + @ + \\$@ + //$@ + @@ +188 VULGAR FRACTION ONE QUARTER + @ + 1/$@ + /4$@ + @@ +189 VULGAR FRACTION ONE HALF + @ + 1/$@ + /2$@ + @@ +190 VULGAR FRACTION THREE QUARTERS + @ + 3/$@ + /4$@ + @@ +191 INVERTED QUESTION MARK + @ + o$@ + (_$@ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + \$ @ + /\$ @ + /--\$@ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + /$ @ + /\$ @ + /--\$@ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + /\$ @ + /\$ @ + /--\$@ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + /\/$@ + /\$ @ + /--\$@ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + o o$@ + /\$ @ + /--\$@ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + O$ @ + / \$ @ + /---\$@ + @@ +198 LATIN CAPITAL LETTER AE + _$@ + /|_$@ + /-|_$@ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + _$@ + /$ @ + \_$@ + S$@@ +200 LATIN CAPITAL LETTER E WITH GRAVE + \_$@ + |_$@ + |_$@ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + _/$@ + |_$ @ + |_$ @ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + /\$@ + |_$ @ + |_$ @ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + o_o$@ + |_$ @ + |_$ @ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + \__$@ + |$ @ + _|_$@ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + __/$@ + |$ @ + _|_$@ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + /\$@ + ___$@ + _|_$@ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + o_o$@ + |$ @ + _|_$@ + @@ +208 LATIN CAPITAL LETTER ETH + _$ @ + _|_\$@ + |_/$@ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + /\/$@ + |\ |$@ + | \|$@ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + \$ @ + / \$@ + \_/$@ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + /$ @ + / \$@ + \_/$@ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + /\$@ + / \$@ + \_/$@ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + /\/$@ + / \$@ + \_/$@ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + o_o$@ + / \$@ + \_/$@ + @@ +215 MULTIPLICATION SIGN + @ + @ + X$@ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + __$ @ + / /\$@ + \/_/$@ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + \$ @ + | |$@ + |_|$@ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + /$ @ + | |$@ + |_|$@ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + /\$@ + | |$@ + |_|$@ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + o o$@ + | |$@ + |_|$@ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + /$ @ + \_/$@ + |$ @ + @@ +222 LATIN CAPITAL LETTER THORN + |_$ @ + |_)$@ + |$ @ + @@ +223 LATIN SMALL LETTER SHARP S + _$ @ + | )$@ + | )$@ + |$ @@ +224 LATIN SMALL LETTER A WITH GRAVE + \$ @ + _.$@ + (_|$@ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + /$ @ + _.$@ + (_|$@ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + /\$@ + _.$@ + (_|$@ + @@ +227 LATIN SMALL LETTER A WITH TILDE + /\/$@ + _.$@ + (_|$@ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + o o$@ + _.$@ + (_|$@ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + O$ @ + _.$@ + (_|$@ + @@ +230 LATIN SMALL LETTER AE + @ + ___$ @ + (_|/_$@ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + _$@ + (_$@ + S$@@ +232 LATIN SMALL LETTER E WITH GRAVE + \$ @ + _$ @ + (/_$@ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + /$ @ + _$ @ + (/_$@ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + /\$@ + _$ @ + (/_$@ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + o o$@ + _$ @ + (/_$@ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + \$@ + @ + |$@ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + /$@ + @ + |$@ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + /\$@ + @ + |$ @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + o o$@ + @ + |$ @ + @@ +240 LATIN SMALL LETTER ETH + X$ @ + \$ @ + (_|$@ + @@ +241 LATIN SMALL LETTER N WITH TILDE + /\/$@ + ._$ @ + | |$@ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + \$ @ + _$ @ + (_)$@ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + /$ @ + _$ @ + (_)$@ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + /\$@ + _$ @ + (_)$@ + @@ +245 LATIN SMALL LETTER O WITH TILDE + /\/$@ + _$ @ + (_)$@ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + o o$@ + _$ @ + (_)$@ + @@ +247 DIVISION SIGN + o$ @ + ---$@ + o$ @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + _$ @ + (/)$@ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + \$ @ + @ + |_|$@ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + /$ @ + @ + |_|$@ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + /\$@ + @ + |_|$@ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + o o$@ + @ + |_|$@ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + /$@ + @ + \/$@ + /$ @@ +254 LATIN SMALL LETTER THORN + @ + |_$ @ + |_)$@ + |$ @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + oo$@ + @ + \/$@ + /$ @@ diff --git a/cosmic rage/fonts/script.flf b/cosmic rage/fonts/script.flf new file mode 100644 index 0000000..8f2f048 --- /dev/null +++ b/cosmic rage/fonts/script.flf @@ -0,0 +1,1493 @@ +flf2a$ 7 5 16 0 10 0 3904 96 +Script by Glenn Chappell 4/93 +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + +$$@ +$$@ +$$@ +$$@ +$$@ +$$@ +$$@@ + @ + |@ + |@ + |@ + o@ + @ + @@ + oo@ + ||@ + $$@ + $$@ + $$@ + @ + @@ + @ + | | @ + --+--+--@ + --+--+--@ + | | @ + @ + @@ + @ + |_|_@ + (|_| @ + _|_|)@ + | | @ + @ + @@ + @ + () /@ + / @ + / @ + / ()@ + @ + @@ + @ + () @ + /\ @ + / \/@ + \__/\@ + @ + @@ + o@ + /@ + $@ + $@ + $@ + @ + @@ + @ + /@ + | @ + | @ + | @ + \@ + @@ + @ + \ @ + |@ + |@ + |@ + / @ + @@ + @ + @ + \|/ @ + --*--@ + /|\ @ + @ + @@ + @ + @ + | @ + --+--@ + | @ + @ + @@ + @ + @ + @ + @ + o@ + /@ + @@ + @ + @ + @ + -----@ + $ @ + @ + @@ + @ + @ + @ + @ + o@ + @ + @@ + @ + /@ + / @ + / @ + / @ + @ + @@ + __ @ + / \ @ + | |@ + | |@ + \__/ @ + @ + @@ + ,@ + /|@ + |@ + |@ + |@ + @ + @@ + __ @ + / )@ + $/ @ + / @ + /___@ + @ + @@ + ___ @ + / \@ + $__/@ + $ \@ + \___/@ + @ + @@ + @ + | | @ + |__|_@ + | @ + | @ + @ + @@ + ____@ + | @ + |___ @ + $ \@ + \___/@ + @ + @@ + __ @ + /$ @ + | __ @ + |/ \@ + \__/@ + @ + @@ + _____@ + $ /@ + $ / @ + $/ @ + / @ + @ + @@ + __ @ + / \@ + \__/@ + / \@ + \__/@ + @ + @@ + __ @ + / |@ + \_/|@ + |@ + |@ + @ + @@ + @ + o@ + $@ + $@ + o@ + @ + @@ + @ + o@ + $@ + $@ + o@ + /@ + @@ + @ + /@ + / @ + \ @ + \@ + @ + @@ + @ + @ + -----@ + -----@ + @ + @ + @@ + @ + \ @ + \@ + /@ + / @ + @ + @@ + __ @ + / \@ + $_/@ + | @ + o @ + @ + @@ + @ + ____ @ + / __,\ @ + | / | |@ + | \_/|/ @ + \____/ @ + @@ + ___, @ + / | @ + | | @ + | | @ + \__/\_/@ + @ + @@ + , __ @ + /|/ \@ + | __/@ + | \@ + |(__/@ + @ + @@ + ___$@ + / (_)@ + | $ @ + | $ @ + \___/@ + @ + @@ + $____ @ + (| \ @ + | |@ + $_| |@ + (/\___/ @ + @ + @@ + ___$@ + / (_)@ + \__$ @ + / $ @ + \___/@ + @ + @@ + $______@ + (_) |$ @ + _|_$@ + / | |@ + (_/ @ + @ + @@ + @ + () |@ + /\/|@ + / |@ + /(__/ @ + @ + @@ + , @ + /| | @ + |___| @ + | |\@ + | |/@ + @ + @@ + _ @ + | |@ + | |@ + _ |/ @ + \_/\/@ + @ + @@ + @ + /\ @ + | | @ + | | @ + \_|/@ + /| @ + \| @@ + , @ + /| / @ + |__/ @ + | \$ @ + | \_/@ + @ + @@ + $_$ @ + \_|_) @ + |$ @ + $_|$ @ + (/\___/@ + @ + @@ + ,__ __ @ + /| | | @ + | | | @ + | | | @ + | | |_/@ + @ + @@ + , _ @ + /|/ \ @ + | | @ + | | @ + | |_/@ + @ + @@ + __ @ + /\_\/@ + | |@ + | |@ + \__/ @ + @ + @@ + , __ @ + /|/ \@ + |___/@ + | $@ + | $@ + @ + @@ + __ @ + / \ @ + | __ | @ + |/ \| @ + \__/\_/@ + @ + @@ + , __ @ + /|/ \ @ + |___/ @ + | \$ @ + | \_/@ + @ + @@ + @ + () @ + /\ @ + / \@ + /(__/@ + @ + @@ + $______@ + (_) | @ + $ | @ + $_ | @ + (_/ @ + @ + @@ + $_ @ + (_| | @ + | | @ + | | @ + \__/\_/@ + @ + @@ + $_ @ + (_| |_/@ + | | @ + | | @ + \_/ @ + @ + @@ + $_ @ + (_| | |_/@ + | | | @ + | | | @ + \_/ \_/ @ + @ + @@ + $_ @ + (_\ / @ + $\/ @ + $/\ @ + _/ \_/@ + @ + @@ + $_ @ + (_| | @ + | | @ + | | @ + \_/|/@ + /| @ + \| @@ + $__ @ + (_ \ @ + $/ @ + / @ + /__/@ + /| @ + \| @@ + _@ + | @ + | @ + | @ + | @ + |_@ + @@ + @ + \ @ + \ @ + \ @ + \@ + @ + @@ + _ @ + |@ + |@ + |@ + |@ + _|@ + @@ + /\@ + $@ + $@ + $@ + $@ + @ + @@ + @ + @ + @ + @ + $ @ + $ @ + _____@@ + o@ + \@ + $@ + $@ + $@ + @ + @@ + @ + @ + __, @ + / | @ + \_/|_/@ + @ + @@ + $_$ @ + | | @ + | | @ + |/ \_@ + \_/ @ + @ + @@ + @ + @ + __ @ + /$ @ + \___/@ + @ + @@ + @ + | @ + __| @ + / | @ + \_/|_/@ + @ + @@ + @ + @ + _ @ + |/ @ + |__/@ + @ + @@ + $_$ @ + | | @ + | | @ + |/ @ + |__/@ + |\ @ + |/ @@ + @ + @ + __, @ + / | @ + \_/|/@ + /| @ + \| @@ + $_$ @ + | | @ + | | @ + |/ \ @ + | |_/@ + @ + @@ + @ + o @ + @ + | @ + |_/@ + @ + @@ + @ + o @ + @ + | @ + |/@ + /| @ + \| @@ + $_$ @ + | | @ + | | @ + |/_) @ + | \_/@ + @ + @@ + $_$ @ + | | @ + | | @ + |/ @ + |__/@ + @ + @@ + @ + @ + _ _ _ @ + / |/ |/ | @ + $ | | |_/@ + @ + @@ + @ + @ + _ _ @ + / |/ | @ + $ | |_/@ + @ + @@ + @ + @ + __ @ + / \_@ + \__/ @ + @ + @@ + @ + @ + _ @ + |/ \_@ + |__/ @ + /| @ + \| @@ + @ + @ + __, @ + / | @ + \_/|_/@ + |\ @ + |/ @@ + @ + @ + ,_ @ + / | @ + $ |_/@ + @ + @@ + @ + @ + , @ + / \_@ + $\/ @ + @ + @@ + @ + @ + _|_ @ + | @ + |_/@ + @ + @@ + @ + @ + @ + | | @ + $\_/|_/@ + @ + @@ + @ + @ + @ + | |_@ + $\/ @ + @ + @@ + @ + @ + @ + | | |_@ + $\/ \/ @ + @ + @@ + @ + @ + @ + /\/ @ + $/\_/@ + @ + @@ + @ + @ + @ + | | @ + $\_/|/@ + /| @ + \| @@ + @ + @ + __ @ + / / _@ + $/_/ @ + /| @ + \| @@ + @ + /@ + | @ + < @ + | @ + \@ + @@ + |@ + |@ + |@ + |@ + |@ + |@ + |@@ + @ + \ @ + | @ + >@ + | @ + / @ + @@ + /\/@ + $ @ + $ @ + $ @ + $ @ + @ + @@ + o o @ + ___, @ + / | @ + | | @ + \__/\_/@ + @ + @@ + o o @ + __ @ + /\_\/@ + | |@ + \__/ @ + @ + @@ + o o @ + $_ @ + (_| | @ + | | @ + \__/\_/@ + @ + @@ + o o @ + @ + __, @ + / | @ + \_/|_/@ + @ + @@ + o o @ + @ + __ @ + / \_@ + \__/ @ + @ + @@ + o o @ + @ + @ + | | @ + $\_/|_/@ + @ + @@ + _ @ + / \@ + | /@ + | \@ + | _/@ + | @ + @@ +160 NO-BREAK SPACE + $$@ + $$@ + $$@ + $$@ + $$@ + $$@ + $$@@ +161 INVERTED EXCLAMATION MARK + @ + o@ + |@ + |@ + |@ + @ + @@ +162 CENT SIGN + @ + @ + _|_ @ + / | @ + \_|_/@ + | @ + @@ +163 POUND SIGN + _ @ + / \ @ + __|__ @ + _| $ @ + (/ \__/@ + @ + @@ +164 CURRENCY SIGN + @ + \ _ /@ + / \ @ + \_/ @ + / \@ + @ + @@ +165 YEN SIGN + @ + \ /@ + _\_/_@ + __|__@ + | @ + @ + @@ +166 BROKEN BAR + |@ + |@ + |@ + @ + |@ + |@ + |@@ +167 SECTION SIGN + _@ + ( @ + /\@ + \/@ + _)@ + @ + @@ +168 DIAERESIS + o o@ + $ $@ + $ $@ + $ $@ + $ $@ + @ + @@ +169 COPYRIGHT SIGN + ____ @ + / __ \ @ + / / () \ @ + | | |@ + \ \__/ / @ + \____/ @ + @@ +170 FEMININE ORDINAL INDICATOR + __, @ + / | @ + \_/|_@ + ---- @ + $ @ + @ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + @ + //@ + // @ + \\ @ + \\@ + @ + @@ +172 NOT SIGN + @ + ___ @ + |@ + $ @ + $ @ + @ + @@ +173 SOFT HYPHEN + @ + @ + @ + ----@ + $ @ + @ + @@ +174 REGISTERED SIGN + ____ @ + /, _ \ @ + //|/ \ \ @ + | |__/ |@ + \ | \_// @ + \____/ @ + @@ +175 MACRON + _____@ + $ @ + $ @ + $ @ + $ @ + @ + @@ +176 DEGREE SIGN + _ @ + / \@ + \_/@ + @ + $ @ + @ + @@ +177 PLUS-MINUS SIGN + @ + @ + | @ + --+--@ + __|__@ + @ + @@ +178 SUPERSCRIPT TWO + _ @ + )@ + /_@ + @ + $@ + @ + @@ +179 SUPERSCRIPT THREE + ___@ + _/@ + __)@ + @ + $ @ + @ + @@ +180 ACUTE ACCENT + /@ + $@ + $@ + $@ + $@ + @ + @@ +181 MICRO SIGN + @ + @ + @ + | | @ + |\_/|_/@ + | @ + | @@ +182 PILCROW SIGN + ____ @ + / | |@ + \_| |@ + | |@ + | |@ + @ + @@ +183 MIDDLE DOT + @ + @ + $O$@ + $ @ + $ @ + @ + @@ +184 CEDILLA + @ + @ + @ + @ + $ @ + _)@ + @@ +185 SUPERSCRIPT ONE + ,@ + /|@ + |@ + @ + $@ + @ + @@ +186 MASCULINE ORDINAL INDICATOR + __ @ + / \_@ + \__/ @ + ---- @ + $ @ + @ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + @ + \\ @ + \\@ + //@ + // @ + @ + @@ +188 VULGAR FRACTION ONE QUARTER + , @ + /| / @ + |/ @ + /|_|_@ + / | @ + @ + @@ +189 VULGAR FRACTION ONE HALF + , @ + /| / @ + |/_ @ + / )@ + / /_@ + @ + @@ +190 VULGAR FRACTION THREE QUARTERS + ___ @ + _/ / @ + __)/ @ + /|_|_@ + / | @ + @ + @@ +191 INVERTED QUESTION MARK + @ + o @ + _| @ + /$ @ + \__/@ + @ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + \ @ + ___, @ + / | @ + | | @ + \__/\_/@ + @ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + / @ + ___, @ + / | @ + | | @ + \__/\_/@ + @ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + /\ @ + ___, @ + / | @ + | | @ + \__/\_/@ + @ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + /\/ @ + ___, @ + / | @ + | | @ + \__/\_/@ + @ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + o o @ + ___, @ + / | @ + | | @ + \__/\_/@ + @ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + _ @ + (_), @ + / | @ + | | @ + \__/\_/@ + @ + @@ +198 LATIN CAPITAL LETTER AE + ___,___$@ + / | (_)@ + | |__ @ + | | @ + \__/\___/@ + @ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + ___$@ + / (_)@ + | $ @ + | $ @ + \___/@ + _) @ + @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + \ @ + ___$ @ + / (_) @ + >--$ @ + \____/@ + @ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + / @ + ___$ @ + / (_) @ + >--$ @ + \____/@ + @ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + /\ @ + ___$ @ + / (_) @ + >--$ @ + \____/@ + @ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + o o @ + ___$ @ + / (_) @ + >--$ @ + \____/@ + @ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + \ @ + $_$ @ + | | @ + _ |/ @ + \_/\_/@ + @ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + / @ + $_$ @ + | | @ + _ |/ @ + \_/\_/@ + @ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + /\ @ + $_$ @ + | | @ + _ |/ @ + \_/\_/@ + @ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + o o @ + $_$ @ + | | @ + _ |/ @ + \_/\_/@ + @ + @@ +208 LATIN CAPITAL LETTER ETH + $____ @ + (| \ @ + __|__ |@ + $_| |@ + (/\___/ @ + @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + /\/ @ + , _ @ + /|/ \ @ + | | @ + | |_/@ + @ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + \ @ + __ @ + /\_\/@ + | |@ + \__/ @ + @ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + / @ + __ @ + /\_\/@ + | |@ + \__/ @ + @ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + /\ @ + __ @ + /\_\/@ + | |@ + \__/ @ + @ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + /\/ @ + __ @ + /\_\/@ + | |@ + \__/ @ + @ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + o o @ + __ @ + /\_\/@ + | |@ + \__/ @ + @ + @@ +215 MULTIPLICATION SIGN + @ + @ + $\/$@ + $/\$@ + $ $@ + @ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + __ /@ + /\_//@ + | / |@ + | / |@ + /__/ @ + / @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + \ @ + $_ @ + (_| | @ + | | @ + \__/\_/@ + @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + / @ + $_ @ + (_| | @ + | | @ + \__/\_/@ + @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + /\ @ + $_ @ + (_| | @ + | | @ + \__/\_/@ + @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + o o @ + $_ @ + (_| | @ + | | @ + \__/\_/@ + @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + / @ + $_ @ + (_| | @ + | | @ + \_/|/@ + /| @ + \| @@ +222 LATIN CAPITAL LETTER THORN + , @ + | __ @ + /|/ \@ + |___/@ + | $@ + @ + @@ +223 LATIN SMALL LETTER SHARP S + _ @ + / \@ + | /@ + | \@ + | _/@ + | @ + @@ +224 LATIN SMALL LETTER A WITH GRAVE + \ @ + @ + __, @ + / | @ + \_/|_/@ + @ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + / @ + @ + __, @ + / | @ + \_/|_/@ + @ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + /\ @ + @ + __, @ + / | @ + \_/|_/@ + @ + @@ +227 LATIN SMALL LETTER A WITH TILDE + /\/ @ + @ + __, @ + / | @ + \_/|_/@ + @ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + o o @ + @ + __, @ + / | @ + \_/|_/@ + @ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + @ + () @ + __, @ + / | @ + \_/|_/@ + @ + @@ +230 LATIN SMALL LETTER AE + @ + @ + __,_ @ + / |/ @ + \_/|__/@ + @ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + @ + __ @ + / @ + \___/@ + _) @ + @@ +232 LATIN SMALL LETTER E WITH GRAVE + \ @ + @ + _ @ + |/ @ + |__/@ + @ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + / @ + @ + _ @ + |/ @ + |__/@ + @ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + /\ @ + @ + _ @ + |/ @ + |__/@ + @ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + o o @ + @ + _ @ + |/ @ + |__/@ + @ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + \ @ + @ + @ + | @ + |_/@ + @ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + / @ + @ + @ + | @ + |_/@ + @ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + /\ @ + @ + @ + | @ + |_/@ + @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + o o @ + @ + @ + | @ + |__/@ + @ + @@ +240 LATIN SMALL LETTER ETH + @ + \/@ + _'|@ + / |@ + \_/ @ + @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + /\/ @ + @ + _ _ @ + / |/ | @ + $ | |_/@ + @ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + \ @ + @ + __ @ + / \_@ + \__/ @ + @ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + / @ + @ + __ @ + / \_@ + \__/ @ + @ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + /\ @ + @ + __ @ + / \_@ + \__/ @ + @ + @@ +245 LATIN SMALL LETTER O WITH TILDE + /\/ @ + @ + __ @ + / \_@ + \__/ @ + @ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + o o @ + @ + __ @ + / \_@ + \__/ @ + @ + @@ +247 DIVISION SIGN + @ + @ + O @ + -----@ + O @ + @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + @ + __/ @ + / /\_@ + \/_/ @ + / @ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + \ @ + @ + @ + | | @ + $\_/|_/@ + @ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + / @ + @ + @ + | | @ + $\_/|_/@ + @ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + /\ @ + @ + @ + | | @ + $\_/|_/@ + @ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + o o @ + @ + @ + | | @ + $\_/|_/@ + @ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + / @ + @ + @ + | | @ + $\_/|/@ + /| @ + \| @@ +254 LATIN SMALL LETTER THORN + _ @ + | | @ + | | @ + |/ \_@ + |__/ @ + /| @ + \| @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + o o @ + @ + @ + | | @ + $\_/|/@ + /| @ + \| @@ diff --git a/cosmic rage/fonts/shadow.flf b/cosmic rage/fonts/shadow.flf new file mode 100644 index 0000000..2ec9182 --- /dev/null +++ b/cosmic rage/fonts/shadow.flf @@ -0,0 +1,1097 @@ +flf2a$ 5 4 16 0 10 0 4992 96 +Shadow by Glenn Chappell 6/93 -- based on Standard & SmShadow +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + + $$@ + $$@ + $$@ + $$@ + $$@@ + $|$@ + $|$@ + _|$@ + _)$@ + @@ + $| )$@ + V V$ @ + $$ @ + $$ @ + @@ + $| |$ @ + _ |_ |_|$@ + _ |_ |_|$@ + _| _|$ @ + @@ + $|$ @ + $ __)$@ + \__ \$@ + ( /$@ + _|$ @@ + _) /$@ + $/$ @ + $/$ @ + _/ _)$@ + @@ + $ _ )$ @ + $_ \ \$@ + $( ` <$@ + \___/\/$@ + @@ + $)$@ + /$ @ + $$ @ + $$ @ + @@ + $/$@ + $|$ @ + $|$ @ + $|$ @ + \_\$@@ + \ \$ @ + $|$@ + $|$@ + $|$@ + _/$ @@ + $\$ @ + \ /$@ + $_ _\$@ + \/$ @ + @@ + @ + $|$ @ + _ _|$@ + _|$ @ + @@ + @ + @ + @ + $)$@ + /$ @@ + @ + @ + _____|$@ + $$ @ + @@ + @ + @ + @ + _)$@ + @@ + $/$@ + $/$ @ + $/$ @ + _/$ @ + @@ + $_ \$ @ + $| |$@ + $| |$@ + \___/$ @ + @@ + _ |$@ + $|$@ + $|$@ + _|$@ + @@ + ___ \$ @ + ) |$@ + $__/$ @ + _____|$@ + @@ + ___ /$ @ + _ \$ @ + ) |$@ + ____/$ @ + @@ + $| |$ @ + $| |$ @ + ___ __|$@ + _|$ @ + @@ + $___|$ @ + $__ \$ @ + ) |$@ + ____/$ @ + @@ + $/$ @ + $ _ \$ @ + $( |$@ + \___/$ @ + @@ + ___ |$@ + $/$ @ + $/$ @ + _/$ @ + @@ + $ _ )$ @ + $_ \$ @ + $( |$@ + \___/$ @ + @@ + $_ \$ @ + $( |$@ + \__ |$@ + __/$ @ + @@ + @ + _)$@ + $$ @ + _)$@ + @@ + @ + _)$@ + $$ @ + $)$@ + /$ @@ + $/$@ + $/$ @ + \ \$ @ + \_\$@ + @@ + @ + _____|$@ + _____|$@ + @ + @@ + \ \$ @ + \ \$@ + $/$@ + _/$ @ + @@ + __ \$@ + $/$@ + _|$ @ + _)$ @ + @@ + $__ \$ @ + $/ _` |$@ + $| ( |$@ + \ \__,_|$@ + \____/$ @@ + $\$ @ + $_ \$ @ + $___ \$ @ + _/ _\$@ + @@ + $__ )$ @ + $__ \$ @ + $| |$@ + ____/$ @ + @@ + $___|$@ + $|$ @ + $|$ @ + \____|$@ + @@ + $__ \$ @ + $| |$@ + $| |$@ + ____/$ @ + @@ + $____|$@ + $__|$ @ + $|$ @ + _____|$@ + @@ + $____|$@ + $|$ @ + $__|$ @ + _|$ @ + @@ + $___|$@ + $|$ @ + $| |$@ + \____|$@ + @@ + $| |$@ + $| |$@ + $___ |$@ + _| _|$@ + @@ + _ _|$@ + $|$ @ + $|$ @ + ___|$@ + @@ + $|$@ + $|$@ + $\ |$@ + \___/$ @ + @@ + $| /$@ + $' /$ @ + $. \$ @ + _|\_\$@ + @@ + $|$ @ + $|$ @ + $|$ @ + _____|$@ + @@ + $ \ |$@ + $|\/ |$@ + $| |$@ + _| _|$@ + @@ + $ \ |$@ + $ \ |$@ + $|\ |$@ + _| \_|$@ + @@ + $_ \$ @ + $| |$@ + $| |$@ + \___/$ @ + @@ + $ _ \$ @ + $| |$@ + $___/$ @ + _|$ @ + @@ + $_ \$ @ + $| |$@ + $| |$@ + \__\_\$@ + @@ + $ _ \$ @ + $| |$@ + $__ <$ @ + _| \_\$@ + @@ + $___|$ @ + \___ \$ @ + $|$@ + _____/$ @ + @@ + __ __|$@ + $|$ @ + $|$ @ + _|$ @ + @@ + $| |$@ + $| |$@ + $| |$@ + \___/$ @ + @@ + \ \ /$@ + \ \ /$ @ + \ \ /$ @ + \_/$ @ + @@ + \ \ /$@ + \ \ \ /$ @ + \ \ \ /$ @ + \_/\_/$ @ + @@ + \ \ /$@ + \ /$ @ + $ \$ @ + _/\_\$@ + @@ + \ \ /$@ + \ /$ @ + $|$ @ + _|$ @ + @@ + __ /$@ + $/$ @ + $/$ @ + ____|$@ + @@ + $_|$@ + $|$ @ + $|$ @ + $|$ @ + __|$@@ + \ \$ @ + \ \$ @ + \ \$ @ + \_\$@ + @@ + _ |$@ + $|$@ + $|$@ + $|$@ + __|$@@ + /\\$@ + $$ @ + $$ @ + $$ @ + @@ + @ + @ + @ + $$ @ + _____|$@@ + $)$@ + \|$@ + $$ @ + $$ @ + @@ + @ + $_` |$@ + $( |$@ + \__,_|$@ + @@ + $|$ @ + $__ \$ @ + $| |$@ + _.__/$ @ + @@ + @ + $__|$@ + $($ @ + \___|$@ + @@ + $|$@ + $_` |$@ + $( |$@ + \__,_|$@ + @@ + @ + $_ \$@ + $ __/$@ + \___|$@ + @@ + $_|$@ + $|$ @ + $__|$@ + _|$ @ + @@ + @ + $_` |$@ + $( |$@ + \__, |$@ + |___/$ @@ + $|$ @ + $__ \$ @ + $| | |$@ + _| |_|$@ + @@ + _)$@ + $|$@ + $|$@ + _|$@ + @@ + _)$@ + $|$@ + $|$@ + $|$@ + ___/$ @@ + $|$ @ + $| /$@ + $ <$ @ + _|\_\$@ + @@ + $|$@ + $|$@ + $|$@ + _|$@ + @@ + @ + $__ `__ \$ @ + $| | |$@ + _| _| _|$@ + @@ + @ + $__ \$ @ + $| |$@ + _| _|$@ + @@ + @ + $_ \$ @ + $( |$@ + \___/$ @ + @@ + @ + $__ \$ @ + $| |$@ + $.__/$ @ + _|$ @@ + @ + $_` |$@ + $( |$@ + \__, |$@ + _|$@@ + @ + $ __|$@ + $|$ @ + _|$ @ + @@ + @ + $__|$@ + \__ \$@ + ____/$@ + @@ + $|$ @ + $__|$@ + $|$ @ + \__|$@ + @@ + @ + $| |$@ + $| |$@ + \__,_|$@ + @@ + @ + \ \ /$@ + \ \ /$ @ + \_/$ @ + @@ + @ + \ \ \ /$@ + \ \ \ /$ @ + \_/\_/$ @ + @@ + @ + \ \ /$@ + ` <$ @ + _/\_\$@ + @@ + @ + $| |$@ + $| |$@ + \__, |$@ + ____/$ @@ + @ + _ /$@ + $/$ @ + ___|$@ + @@ + $/$@ + $|$ @ + < <$ @ + $|$ @ + \_\$@@ + $|$@ + $|$@ + $|$@ + $|$@ + _|$@@ + \ \$ @ + $|$ @ + ` >$@ + $|$ @ + _/$ @@ + / _/$@ + $$ @ + $$ @ + $$ @ + @@ + _) \ _)$@ + $_ \$ @ + $___ \$ @ + _/ _\$@ + @@ + _) _)$@ + $_ \$ @ + $| |$@ + \___/$ @ + @@ + _) _)$@ + $| |$@ + $| |$@ + \___/$ @ + @@ + _) _)$@ + $_` |$@ + $( |$@ + \__,_|$@ + @@ + _) _)$@ + $_ \$ @ + $( |$@ + \___/$ @ + @@ + _) _)$@ + $| |$@ + $| |$@ + \__,_|$@ + @@ + $_ \$@ + $| /$@ + $|\ \$@ + $|__/$@ + _|$ @@ +160 NO-BREAK SPACE + $ $@ + $ $@ + $ $@ + $ $@ + $ $@@ +161 INVERTED EXCLAMATION MARK + _)$@ + $|$@ + $|$@ + _|$@ + @@ +162 CENT SIGN + $|$ @ + $__)$@ + $($ @ + \ )$@ + _|$ @@ +163 POUND SIGN + $,_\$ @ + _ |_$ @ + $|$ @ + _,____|$@ + @@ +164 CURRENCY SIGN + \ _ /$@ + $( |$@ + $___ \$@ + \/ /$@ + @@ +165 YEN SIGN + \ \ /$ @ + __ __|$@ + __ __|$@ + _|$ @ + @@ +166 BROKEN BAR + $|$@ + _|$@ + @ + $|$@ + _|$@@ +167 SECTION SIGN + $_)$@ + $\ \$ @ + \ \\ \$@ + \ \_/$@ + (__/$ @@ +168 DIAERESIS + _) _)$@ + $ $ @ + $ $ @ + $ $ @ + @@ +169 COPYRIGHT SIGN + $ \$ @ + $ __| \$ @ + $ ( |$@ + \ \___| /$ @ + \_____/$ @@ +170 FEMININE ORDINAL INDICATOR + $_` |$@ + \__,_|$@ + _____|$@ + $$ @ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + $/ /$@ + $/ /$ @ + \ \ \$ @ + \_\_\$@ + @@ +172 NOT SIGN + @ + _____ |$@ + _|$@ + $$ @ + @@ +173 SOFT HYPHEN + @ + @ + _____|$@ + $$ @ + @@ +174 REGISTERED SIGN + $ \$ @ + $ _ \ \$ @ + $ / |$@ + \ _|_\ /$ @ + \_____/$ @@ +175 MACRON + _____|$@ + $$ @ + $$ @ + $$ @ + @@ +176 DEGREE SIGN + $ \$ @ + $( |$@ + \__/$ @ + $$ @ + @@ +177 PLUS-MINUS SIGN + $|$ @ + _ _|$@ + _|$ @ + _____|$@ + @@ +178 SUPERSCRIPT TWO + _ )$@ + $/$ @ + ___|$@ + $$ @ + @@ +179 SUPERSCRIPT THREE + __ /$@ + _ \$@ + ___/$@ + $$ @ + @@ +180 ACUTE ACCENT + _/$@ + $$ @ + $$ @ + $$ @ + @@ +181 MICRO SIGN + @ + $| |$@ + $| |$@ + $._,_|$@ + _|$ @@ +182 PILCROW SIGN + $ |$@ + $( | |$@ + \__ | |$@ + _|_|$@ + @@ +183 MIDDLE DOT + @ + _)$@ + $$ @ + $$ @ + @@ +184 CEDILLA + @ + @ + @ + $$ @ + _)$@@ +185 SUPERSCRIPT ONE + _ |$@ + $|$@ + _|$@ + $$ @ + @@ +186 MASCULINE ORDINAL INDICATOR + $_ \$@ + \___/$@ + ____|$@ + $$ @ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + \ \ \$ @ + \ \ \$@ + $/ /$@ + _/_/$ @ + @@ +188 VULGAR FRACTION ONE QUARTER + _ | /$ @ + $| / | |$ @ + _| / __ _|$@ + _/ _|$ @ + @@ +189 VULGAR FRACTION ONE HALF + _ | /$ @ + $| /_ )$@ + _| / /$ @ + _/ ___|$@ + @@ +190 VULGAR FRACTION THREE QUARTERS + __ / /$ @ + _ \ / | |$ @ + ___/ / __ _|$@ + _/ _|$ @ + @@ +191 INVERTED QUESTION MARK + _)$ @ + $|$ @ + $/$ @ + \___|$@ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + \_\$ @ + $\$ @ + $_ \$ @ + _/ _\$@ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + _/$ @ + $\$ @ + $_ \$ @ + _/ _\$@ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + /\\$ @ + $\$ @ + $_ \$ @ + _/ _\$@ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + / _/$ @ + $\$ @ + $_ \$ @ + _/ _\$@ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _) \ _)$@ + $_ \$ @ + $___ \$ @ + _/ _\$@ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + ( )$ @ + $_ \$ @ + $___ \$ @ + _/ _\$@ + @@ +198 LATIN CAPITAL LETTER AE + $ ____|$@ + $/ __|$ @ + $__ |$ @ + _/ _____|$@ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + $___|$@ + $|$ @ + $|$ @ + \____|$@ + _)$ @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + \_\$ @ + $____|$@ + $ _|$ @ + _____|$@ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + _/$ @ + $____|$@ + $ _|$ @ + _____|$@ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + /\\$ @ + $____|$@ + $ _|_$ @ + _____|$@ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _) _)$@ + $____|$@ + $ _|$ @ + _____|$@ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + \_\$ @ + _ _|$@ + | |$ @ + ___|$@ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + _/$ @ + _ _|$@ + $|$ @ + ___|$@ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + /\\$ @ + _ _|$@ + $|$ @ + ___|$@ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _) _)$@ + _ _|$ @ + $|$ @ + ___|$ @ + @@ +208 LATIN CAPITAL LETTER ETH + __ \$ @ + | |$@ + __ __| |$@ + ____/$ @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + / _/$@ + $ \ |$@ + $. |$@ + _|\_|$@ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + \_\$ @ + $_ \$ @ + $| |$@ + \___/$ @ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + _/$ @ + $_ \$ @ + $| |$@ + \___/$ @ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + /\\$ @ + $_ \$ @ + $| |$@ + \___/$ @ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + / _/$ @ + $_ \$ @ + $| |$@ + \___/$ @ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _) _)$@ + $_ \$ @ + $| |$@ + \___/$ @ + @@ +215 MULTIPLICATION SIGN + @ + \ \$@ + , '$@ + \/\/$@ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + $_ /$ @ + $| / |$@ + $ / |$@ + _/__/$ @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + \_\$ @ + $| |$@ + $| |$@ + \___/$ @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + _/$ @ + $| |$@ + $| |$@ + \___/$ @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + /\\$ @ + $| |$@ + $| |$@ + \___/$ @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _) _)$@ + $| |$@ + $| |$@ + \___/$ @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + _/$ @ + \ \ /$@ + \ /$ @ + _|$ @ + @@ +222 LATIN CAPITAL LETTER THORN + $|$ @ + $ __ \$@ + $ ___/$@ + _|$ @ + @@ +223 LATIN SMALL LETTER SHARP S + $_ \$@ + $| /$@ + $|\ \$@ + $|__/$@ + _|$ @@ +224 LATIN SMALL LETTER A WITH GRAVE + \_\$ @ + $_` |$@ + $( |$@ + \__,_|$@ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + _/_$ @ + $_` |$@ + $( |$@ + \__,_|$@ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + /\\$ @ + $_` |$@ + $( |$@ + \__,_|$@ + @@ +227 LATIN SMALL LETTER A WITH TILDE + / _/$ @ + $_` |$@ + $( |$@ + \__,_|$@ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _) _)$@ + $_` |$@ + $( |$@ + \__,_|$@ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + ( )$ @ + $_ '|$@ + $( |$@ + \__,_|$@ + @@ +230 LATIN SMALL LETTER AE + @ + $_` _ \$@ + $( __/$@ + \__,____|$@ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + $__|$@ + $($ @ + \___|$@ + _)$ @@ +232 LATIN SMALL LETTER E WITH GRAVE + \_\$ @ + $_ \$@ + $ __/$@ + \___|$@ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + _/$ @ + $_ \$@ + $ __/$@ + \___|$@ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + /\\$ @ + $_ \$@ + $ __/$@ + \___|$@ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _) _)$@ + $_ \$ @ + $ __/$ @ + \___|$ @ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + \_\$@ + $|$@ + $|$@ + _|$@ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + _/$@ + $|$@ + $|$@ + _|$@ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + /\\$@ + $|$ @ + $|$ @ + _|$ @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _) _)$@ + $|$ @ + $|$ @ + _|$ @ + @@ +240 LATIN SMALL LETTER ETH + ` <$ @ + \/\ |$@ + $__` |$@ + \____/$ @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + / _/$ @ + $'_ \$ @ + $| |$@ + _| _|$@ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + \_\$ @ + $_ \$ @ + $( |$@ + \___/$ @ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + _/$ @ + $_ \$ @ + $( |$@ + \___/$ @ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + /\\$ @ + $_ \$ @ + $( |$@ + \___/$ @ + @@ +245 LATIN SMALL LETTER O WITH TILDE + / _/$ @ + $_ \$ @ + $( |$@ + \___/$ @ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _) _)$@ + $_ \$ @ + $( |$@ + \___/$ @ + @@ +247 DIVISION SIGN + @ + _)$ @ + _____|$@ + _)$ @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + $_ /\$ @ + $( / |$@ + \_/__/$ @ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + \_\$ @ + $| |$@ + $| |$@ + \__,_|$@ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + _/$ @ + $| |$@ + $| |$@ + \__,_|$@ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + /\\$ @ + $| |$@ + $| |$@ + \__,_|$@ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _) _)$@ + $| |$@ + $| |$@ + \__,_|$@ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + _/$ @ + $| |$@ + $| |$@ + \__, |$@ + ____/$ @@ +254 LATIN SMALL LETTER THORN + $|$ @ + $__ \$ @ + $| |$@ + $.__/$ @ + _|$ @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _) _)$@ + $| |$@ + $| |$@ + \__, |$@ + ____/$ @@ diff --git a/cosmic rage/fonts/slant.flf b/cosmic rage/fonts/slant.flf new file mode 100644 index 0000000..43fe398 --- /dev/null +++ b/cosmic rage/fonts/slant.flf @@ -0,0 +1,1295 @@ +flf2a$ 6 5 16 15 10 0 18319 96 +Slant by Glenn Chappell 3/93 -- based on Standard +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + + $$@ + $$ @ + $$ @ + $$ @ + $$ @ +$$ @@ + __@ + / /@ + / / @ + /_/ @ +(_) @ + @@ + _ _ @ +( | )@ +|/|/ @ + $ @ +$ @ + @@ + __ __ @ + __/ // /_@ + /_ _ __/@ +/_ _ __/ @ + /_//_/ @ + @@ + __@ + _/ /@ + / __/@ + (_ ) @ +/ _/ @ +/_/ @@ + _ __@ + (_)_/_/@ + _/_/ @ + _/_/_ @ +/_/ (_) @ + @@ + ___ @ + ( _ ) @ + / __ \/|@ +/ /_/ < @ +\____/\/ @ + @@ + _ @ + ( )@ + |/ @ + $ @ +$ @ + @@ + __@ + _/_/@ + / / @ + / / @ +/ / @ +|_| @@ + _ @ + | |@ + / /@ + / / @ + _/_/ @ +/_/ @@ + @ + __/|_@ + | /@ +/_ __| @ + |/ @ + @@ + @ + __ @ + __/ /_@ +/_ __/@ + /_/ @ + @@ + @ + @ + @ + _ @ +( )@ +|/ @@ + @ + @ + ______@ +/_____/@ + $ @ + @@ + @ + @ + @ + _ @ +(_)@ + @@ + __@ + _/_/@ + _/_/ @ + _/_/ @ +/_/ @ + @@ + ____ @ + / __ \@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ + ___@ + < /@ + / / @ + / / @ +/_/ @ + @@ + ___ @ + |__ \@ + __/ /@ + / __/ @ +/____/ @ + @@ + _____@ + |__ /@ + /_ < @ + ___/ / @ +/____/ @ + @@ + __ __@ + / // /@ + / // /_@ +/__ __/@ + /_/ @ + @@ + ______@ + / ____/@ + /___ \ @ + ____/ / @ +/_____/ @ + @@ + _____@ + / ___/@ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ + _____@ +/__ /@ + / / @ + / / @ +/_/ @ + @@ + ____ @ + ( __ )@ + / __ |@ +/ /_/ / @ +\____/ @ + @@ + ____ @ + / __ \@ + / /_/ /@ + \__, / @ +/____/ @ + @@ + @ + _ @ + (_)@ + _ @ +(_) @ + @@ + @ + _ @ + (_)@ + _ @ +( ) @ +|/ @@ + __@ + / /@ +/ / @ +\ \ @ + \_\@ + @@ + @ + _____@ + /____/@ +/____/ @ + $ @ + @@ +__ @ +\ \ @ + \ \@ + / /@ +/_/ @ + @@ + ___ @ + /__ \@ + / _/@ + /_/ @ +(_) @ + @@ + ______ @ + / ____ \@ + / / __ `/@ +/ / /_/ / @ +\ \__,_/ @ + \____/ @@ + ___ @ + / |@ + / /| |@ + / ___ |@ +/_/ |_|@ + @@ + ____ @ + / __ )@ + / __ |@ + / /_/ / @ +/_____/ @ + @@ + ______@ + / ____/@ + / / @ +/ /___ @ +\____/ @ + @@ + ____ @ + / __ \@ + / / / /@ + / /_/ / @ +/_____/ @ + @@ + ______@ + / ____/@ + / __/ @ + / /___ @ +/_____/ @ + @@ + ______@ + / ____/@ + / /_ @ + / __/ @ +/_/ @ + @@ + ______@ + / ____/@ + / / __ @ +/ /_/ / @ +\____/ @ + @@ + __ __@ + / / / /@ + / /_/ / @ + / __ / @ +/_/ /_/ @ + @@ + ____@ + / _/@ + / / @ + _/ / @ +/___/ @ + @@ + __@ + / /@ + __ / / @ +/ /_/ / @ +\____/ @ + @@ + __ __@ + / //_/@ + / ,< @ + / /| | @ +/_/ |_| @ + @@ + __ @ + / / @ + / / @ + / /___@ +/_____/@ + @@ + __ ___@ + / |/ /@ + / /|_/ / @ + / / / / @ +/_/ /_/ @ + @@ + _ __@ + / | / /@ + / |/ / @ + / /| / @ +/_/ |_/ @ + @@ + ____ @ + / __ \@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ + ____ @ + / __ \@ + / /_/ /@ + / ____/ @ +/_/ @ + @@ + ____ @ + / __ \@ + / / / /@ +/ /_/ / @ +\___\_\ @ + @@ + ____ @ + / __ \@ + / /_/ /@ + / _, _/ @ +/_/ |_| @ + @@ + _____@ + / ___/@ + \__ \ @ + ___/ / @ +/____/ @ + @@ + ______@ + /_ __/@ + / / @ + / / @ +/_/ @ + @@ + __ __@ + / / / /@ + / / / / @ +/ /_/ / @ +\____/ @ + @@ + _ __@ +| | / /@ +| | / / @ +| |/ / @ +|___/ @ + @@ + _ __@ +| | / /@ +| | /| / / @ +| |/ |/ / @ +|__/|__/ @ + @@ + _ __@ + | |/ /@ + | / @ + / | @ +/_/|_| @ + @@ +__ __@ +\ \/ /@ + \ / @ + / / @ +/_/ @ + @@ + _____@ +/__ /@ + / / @ + / /__@ +/____/@ + @@ + ___@ + / _/@ + / / @ + / / @ + / / @ +/__/ @@ +__ @ +\ \ @ + \ \ @ + \ \ @ + \_\@ + @@ + ___@ + / /@ + / / @ + / / @ + _/ / @ +/__/ @@ + //|@ + |/||@ + $ @ + $ @ +$ @ + @@ + @ + @ + @ + @ + ______@ +/_____/@@ + _ @ + ( )@ + V @ + $ @ +$ @ + @@ + @ + ____ _@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ + __ @ + / /_ @ + / __ \@ + / /_/ /@ +/_.___/ @ + @@ + @ + _____@ + / ___/@ +/ /__ @ +\___/ @ + @@ + __@ + ____/ /@ + / __ / @ +/ /_/ / @ +\__,_/ @ + @@ + @ + ___ @ + / _ \@ +/ __/@ +\___/ @ + @@ + ____@ + / __/@ + / /_ @ + / __/ @ +/_/ @ + @@ + @ + ____ _@ + / __ `/@ + / /_/ / @ + \__, / @ +/____/ @@ + __ @ + / /_ @ + / __ \@ + / / / /@ +/_/ /_/ @ + @@ + _ @ + (_)@ + / / @ + / / @ +/_/ @ + @@ + _ @ + (_)@ + / / @ + / / @ + __/ / @ +/___/ @@ + __ @ + / /__@ + / //_/@ + / ,< @ +/_/|_| @ + @@ + __@ + / /@ + / / @ + / / @ +/_/ @ + @@ + @ + ____ ___ @ + / __ `__ \@ + / / / / / /@ +/_/ /_/ /_/ @ + @@ + @ + ____ @ + / __ \@ + / / / /@ +/_/ /_/ @ + @@ + @ + ____ @ + / __ \@ +/ /_/ /@ +\____/ @ + @@ + @ + ____ @ + / __ \@ + / /_/ /@ + / .___/ @ +/_/ @@ + @ + ____ _@ + / __ `/@ +/ /_/ / @ +\__, / @ + /_/ @@ + @ + _____@ + / ___/@ + / / @ +/_/ @ + @@ + @ + _____@ + / ___/@ + (__ ) @ +/____/ @ + @@ + __ @ + / /_@ + / __/@ +/ /_ @ +\__/ @ + @@ + @ + __ __@ + / / / /@ +/ /_/ / @ +\__,_/ @ + @@ + @ + _ __@ +| | / /@ +| |/ / @ +|___/ @ + @@ + @ + _ __@ +| | /| / /@ +| |/ |/ / @ +|__/|__/ @ + @@ + @ + _ __@ + | |/_/@ + _> < @ +/_/|_| @ + @@ + @ + __ __@ + / / / /@ + / /_/ / @ + \__, / @ +/____/ @@ + @ + ____@ +/_ /@ + / /_@ +/___/@ + @@ + __@ + _/_/@ + _/_/ @ +< < @ +/ / @ +\_\ @@ + __@ + / /@ + / / @ + / / @ + / / @ +/_/ @@ + _ @ + | |@ + / /@ + _>_>@ + _/_/ @ +/_/ @@ + /\//@ + //\/ @ + $ @ + $ @ +$ @ + @@ + _ _ @ + (_)(_)@ + / _ | @ + / __ | @ +/_/ |_| @ + @@ + _ _ @ + (_)_(_)@ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ + _ _ @ + (_) (_)@ + / / / / @ +/ /_/ / @ +\____/ @ + @@ + _ _ @ + (_)_(_)@ + / __ `/ @ +/ /_/ / @ +\__,_/ @ + @@ + _ _ @ + (_)_(_)@ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ + _ _ @ + (_) (_)@ + / / / / @ +/ /_/ / @ +\__,_/ @ + @@ + ____ @ + / __ \@ + / / / /@ + / /_| | @ + / //__/ @ +/_/ @@ +160 NO-BREAK SPACE + $$@ + $$ @ + $$ @ + $$ @ + $$ @ +$$ @@ +161 INVERTED EXCLAMATION MARK + _ @ + (_)@ + / / @ + / / @ +/_/ @ + @@ +162 CENT SIGN + __@ + __/ /@ + / ___/@ +/ /__ @ +\ _/ @ +/_/ @@ +163 POUND SIGN + ____ @ + / ,__\@ + __/ /_ @ + _/ /___ @ +(_,____/ @ + @@ +164 CURRENCY SIGN + /|___/|@ + | __ / @ + / /_/ / @ + /___ | @ +|/ |/ @ + @@ +165 YEN SIGN + ____@ + _| / /@ + /_ __/@ +/_ __/ @ + /_/ @ + @@ +166 BROKEN BAR + __@ + / /@ + /_/ @ + __ @ + / / @ +/_/ @@ +167 SECTION SIGN + __ @ + _/ _)@ + / | | @ + | || | @ + | |_/ @ +(__/ @@ +168 DIAERESIS + _ _ @ + (_) (_)@ + $ $ @ + $ $ @ +$ $ @ + @@ +169 COPYRIGHT SIGN + ______ @ + / _____\ @ + / / ___/ |@ + / / /__ / @ +| \___/ / @ + \______/ @@ +170 FEMININE ORDINAL INDICATOR + ___ _@ + / _ `/@ + _\_,_/ @ +/____/ @ + $ @ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + ____@ + / / /@ +/ / / @ +\ \ \ @ + \_\_\@ + @@ +172 NOT SIGN + @ + ______@ +/___ /@ + /_/ @ + $ @ + @@ +173 SOFT HYPHEN + @ + @ + _____@ +/____/@ + $ @ + @@ +174 REGISTERED SIGN + ______ @ + / ___ \ @ + / / _ \ |@ + / / , _/ / @ +| /_/|_| / @ + \______/ @@ +175 MACRON + ______@ +/_____/@ + $ @ + $ @ +$ @ + @@ +176 DEGREE SIGN + ___ @ + / _ \@ +/ // /@ +\___/ @ + $ @ + @@ +177 PLUS-MINUS SIGN + __ @ + __/ /_@ + /_ __/@ + __/_/_ @ +/_____/ @ + @@ +178 SUPERSCRIPT TWO + ___ @ + |_ |@ + / __/ @ +/____/ @ + $ @ + @@ +179 SUPERSCRIPT THREE + ____@ + |_ /@ + _/_ < @ +/____/ @ + $ @ + @@ +180 ACUTE ACCENT + __@ + /_/@ + $ @ + $ @ +$ @ + @@ +181 MICRO SIGN + @ + __ __@ + / / / /@ + / /_/ / @ + / ._,_/ @ +/_/ @@ +182 PILCROW SIGN + _______@ + / _ /@ +/ (/ / / @ +\_ / / @ + /_/_/ @ + @@ +183 MIDDLE DOT + @ + _ @ +(_)@ + $ @ +$ @ + @@ +184 CEDILLA + @ + @ + @ + @ + _ @ +/_)@@ +185 SUPERSCRIPT ONE + ___@ + < /@ + / / @ +/_/ @ +$ @ + @@ +186 MASCULINE ORDINAL INDICATOR + ___ @ + / _ \@ + _\___/@ +/____/ @ + $ @ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +____ @ +\ \ \ @ + \ \ \@ + / / /@ +/_/_/ @ + @@ +188 VULGAR FRACTION ONE QUARTER + ___ __ @ + < / _/_/ @ + / /_/_/___@ +/_//_// / /@ + /_/ /_ _/@ + /_/ @@ +189 VULGAR FRACTION ONE HALF + ___ __ @ + < / _/_/__ @ + / /_/_/|_ |@ +/_//_/ / __/ @ + /_/ /____/ @ + @@ +190 VULGAR FRACTION THREE QUARTERS + ____ __ @ + |_ / _/_/ @ + _/_ < _/_/___@ +/____//_// / /@ + /_/ /_ _/@ + /_/ @@ +191 INVERTED QUESTION MARK + _ @ + (_)@ + _/ / @ +/ _/_ @ +\___/ @ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + __ @ + _\_\@ + / _ |@ + / __ |@ +/_/ |_|@ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + __@ + _/_/@ + / _ |@ + / __ |@ +/_/ |_|@ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + //|@ + _|/||@ + / _ | @ + / __ | @ +/_/ |_| @ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + /\//@ + _//\/ @ + / _ | @ + / __ | @ +/_/ |_| @ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _ _ @ + (_)(_)@ + / _ | @ + / __ | @ +/_/ |_| @ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + (())@ + / |@ + / /| |@ + / ___ |@ +/_/ |_|@ + @@ +198 LATIN CAPITAL LETTER AE + __________@ + / ____/@ + / /| __/ @ + / __ /___ @ +/_/ /_____/ @ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + ______@ + / ____/@ + / / @ +/ /___ @ +\____/ @ + /_) @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + __ @ + _\_\@ + / __/@ + / _/ @ +/___/ @ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + __@ + _/_/@ + / __/@ + / _/ @ +/___/ @ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + //|@ + _|/||@ + / __/ @ + / _/ @ +/___/ @ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _ _ @ + (_)(_)@ + / __/ @ + / _/ @ +/___/ @ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + __ @ + _\_\@ + / _/@ + _/ / @ +/___/ @ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + __@ + _/_/@ + / _/@ + _/ / @ +/___/ @ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + //|@ + _|/||@ + / _/ @ + _/ / @ +/___/ @ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _ _ @ + (_)(_)@ + / _/ @ + _/ / @ +/___/ @ + @@ +208 LATIN CAPITAL LETTER ETH + ____ @ + / __ \@ + __/ /_/ /@ +/_ __/ / @ + /_____/ @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + /\//@ + _//\/ @ + / |/ / @ + / / @ +/_/|_/ @ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + __ @ + __\_\@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + __@ + __/_/@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + //|@ + _|/||@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + /\//@ + _//\/ @ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _ _ @ + (_)_(_)@ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ +215 MULTIPLICATION SIGN + @ + @ + /|/|@ + > < @ +|/|/ @ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + _____ @ + / _// \@ + / //// /@ +/ //// / @ +\_//__/ @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + __ @ + __\_\_@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + __ @ + __/_/_@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + //| @ + _|/||_@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ + / / / / @ +/ /_/ / @ +\____/ @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + __ @ +__/_/_@ +\ \/ /@ + \ / @ + /_/ @ + @@ +222 LATIN CAPITAL LETTER THORN + __ @ + / /_ @ + / __ \@ + / ____/@ +/_/ @ + @@ +223 LATIN SMALL LETTER SHARP S + ____ @ + / __ \@ + / / / /@ + / /_| | @ + / //__/ @ +/_/ @@ +224 LATIN SMALL LETTER A WITH GRAVE + __ @ + __\_\_@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + __ @ + __/_/_@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + //| @ + _|/||_@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +227 LATIN SMALL LETTER A WITH TILDE + /\//@ + _//\/_@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _ _ @ + (_)_(_)@ + / __ `/ @ +/ /_/ / @ +\__,_/ @ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + __ @ + __(())@ + / __ `/@ +/ /_/ / @ +\__,_/ @ + @@ +230 LATIN SMALL LETTER AE + @ + ____ ___ @ + / __ ` _ \@ +/ /_/ __/@ +\__,_____/ @ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + _____@ + / ___/@ +/ /__ @ +\___/ @ +/_) @@ +232 LATIN SMALL LETTER E WITH GRAVE + __ @ + _\_\@ + / _ \@ +/ __/@ +\___/ @ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + __@ + _/_/@ + / _ \@ +/ __/@ +\___/ @ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + //|@ + _|/||@ + / _ \ @ +/ __/ @ +\___/ @ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _ _ @ + (_)(_)@ + / _ \ @ +/ __/ @ +\___/ @ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + __ @ + \_\@ + / / @ + / / @ +/_/ @ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + __@ + /_/@ + / / @ + / / @ +/_/ @ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + //|@ + |/||@ + / / @ + / / @ +/_/ @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _ _ @ + (_)_(_)@ + / / @ + / / @ +/_/ @ + @@ +240 LATIN SMALL LETTER ETH + || @ + =||=@ + ___ || @ +/ __` | @ +\____/ @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + /\//@ + _//\/ @ + / __ \ @ + / / / / @ +/_/ /_/ @ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + __ @ + __\_\@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + __@ + __/_/@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + //|@ + _|/||@ + / __ \@ +/ /_/ /@ +\____/ @ + @@ +245 LATIN SMALL LETTER O WITH TILDE + /\//@ + _//\/ @ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _ _ @ + (_)_(_)@ + / __ \ @ +/ /_/ / @ +\____/ @ + @@ +247 DIVISION SIGN + @ + _ @ + __(_)_@ +/_____/@ + (_) @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + _____ @ + / _// \@ +/ //// /@ +\_//__/ @ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + __ @ + __\_\_@ + / / / /@ +/ /_/ / @ +\__,_/ @ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + __ @ + __/_/_@ + / / / /@ +/ /_/ / @ +\__,_/ @ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + //| @ + _|/||_@ + / / / /@ +/ /_/ / @ +\__,_/ @ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ + / / / / @ +/ /_/ / @ +\__,_/ @ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + __ @ + __/_/_@ + / / / /@ + / /_/ / @ + \__, / @ +/____/ @@ +254 LATIN SMALL LETTER THORN + __ @ + / /_ @ + / __ \@ + / /_/ /@ + / .___/ @ +/_/ @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _ _ @ + (_) (_)@ + / / / / @ + / /_/ / @ + \__, / @ +/____/ @@ diff --git a/cosmic rage/fonts/small.flf b/cosmic rage/fonts/small.flf new file mode 100644 index 0000000..c6b5bfc --- /dev/null +++ b/cosmic rage/fonts/small.flf @@ -0,0 +1,1097 @@ +flf2a$ 5 4 13 15 10 0 22415 96 +Small by Glenn Chappell 4/93 -- based on Standard +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + + $@ + $@ + $@ + $@ + $@@ + _ @ + | |@ + |_|@ + (_)@ + @@ + _ _ @ + ( | )@ + V V @ + $ @ + @@ + _ _ @ + _| | |_ @ + |_ . _|@ + |_ _|@ + |_|_| @@ + @ + ||_@ + (_-<@ + / _/@ + || @@ + _ __ @ + (_)/ / @ + / /_ @ + /_/(_)@ + @@ + __ @ + / _|___ @ + > _|_ _|@ + \_____| @ + @@ + _ @ + ( )@ + |/ @ + $ @ + @@ + __@ + / /@ + | | @ + | | @ + \_\@@ + __ @ + \ \ @ + | |@ + | |@ + /_/ @@ + @ + _/\_@ + > <@ + \/ @ + @@ + _ @ + _| |_ @ + |_ _|@ + |_| @ + @@ + @ + @ + _ @ + ( )@ + |/ @@ + @ + ___ @ + |___|@ + $ @ + @@ + @ + @ + _ @ + (_)@ + @@ + __@ + / /@ + / / @ + /_/ @ + @@ + __ @ + / \ @ + | () |@ + \__/ @ + @@ + _ @ + / |@ + | |@ + |_|@ + @@ + ___ @ + |_ )@ + / / @ + /___|@ + @@ + ____@ + |__ /@ + |_ \@ + |___/@ + @@ + _ _ @ + | | | @ + |_ _|@ + |_| @ + @@ + ___ @ + | __|@ + |__ \@ + |___/@ + @@ + __ @ + / / @ + / _ \@ + \___/@ + @@ + ____ @ + |__ |@ + / / @ + /_/ @ + @@ + ___ @ + ( _ )@ + / _ \@ + \___/@ + @@ + ___ @ + / _ \@ + \_, /@ + /_/ @ + @@ + _ @ + (_)@ + _ @ + (_)@ + @@ + _ @ + (_)@ + _ @ + ( )@ + |/ @@ + __@ + / /@ + < < @ + \_\@ + @@ + @ + ___ @ + |___|@ + |___|@ + @@ + __ @ + \ \ @ + > >@ + /_/ @ + @@ + ___ @ + |__ \@ + /_/@ + (_) @ + @@ + ____ @ + / __ \ @ + / / _` |@ + \ \__,_|@ + \____/ @@ + _ @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ + ___ @ + | _ )@ + | _ \@ + |___/@ + @@ + ___ @ + / __|@ + | (__ @ + \___|@ + @@ + ___ @ + | \ @ + | |) |@ + |___/ @ + @@ + ___ @ + | __|@ + | _| @ + |___|@ + @@ + ___ @ + | __|@ + | _| @ + |_| @ + @@ + ___ @ + / __|@ + | (_ |@ + \___|@ + @@ + _ _ @ + | || |@ + | __ |@ + |_||_|@ + @@ + ___ @ + |_ _|@ + | | @ + |___|@ + @@ + _ @ + _ | |@ + | || |@ + \__/ @ + @@ + _ __@ + | |/ /@ + | ' < @ + |_|\_\@ + @@ + _ @ + | | @ + | |__ @ + |____|@ + @@ + __ __ @ + | \/ |@ + | |\/| |@ + |_| |_|@ + @@ + _ _ @ + | \| |@ + | .` |@ + |_|\_|@ + @@ + ___ @ + / _ \ @ + | (_) |@ + \___/ @ + @@ + ___ @ + | _ \@ + | _/@ + |_| @ + @@ + ___ @ + / _ \ @ + | (_) |@ + \__\_\@ + @@ + ___ @ + | _ \@ + | /@ + |_|_\@ + @@ + ___ @ + / __|@ + \__ \@ + |___/@ + @@ + _____ @ + |_ _|@ + | | @ + |_| @ + @@ + _ _ @ + | | | |@ + | |_| |@ + \___/ @ + @@ + __ __@ + \ \ / /@ + \ V / @ + \_/ @ + @@ + __ __@ + \ \ / /@ + \ \/\/ / @ + \_/\_/ @ + @@ + __ __@ + \ \/ /@ + > < @ + /_/\_\@ + @@ + __ __@ + \ \ / /@ + \ V / @ + |_| @ + @@ + ____@ + |_ /@ + / / @ + /___|@ + @@ + __ @ + | _|@ + | | @ + | | @ + |__|@@ + __ @ + \ \ @ + \ \ @ + \_\@ + @@ + __ @ + |_ |@ + | |@ + | |@ + |__|@@ + /\ @ + |/\|@ + $ @ + $ @ + @@ + @ + @ + @ + ___ @ + |___|@@ + _ @ + ( )@ + \|@ + $ @ + @@ + @ + __ _ @ + / _` |@ + \__,_|@ + @@ + _ @ + | |__ @ + | '_ \@ + |_.__/@ + @@ + @ + __ @ + / _|@ + \__|@ + @@ + _ @ + __| |@ + / _` |@ + \__,_|@ + @@ + @ + ___ @ + / -_)@ + \___|@ + @@ + __ @ + / _|@ + | _|@ + |_| @ + @@ + @ + __ _ @ + / _` |@ + \__, |@ + |___/ @@ + _ @ + | |_ @ + | ' \ @ + |_||_|@ + @@ + _ @ + (_)@ + | |@ + |_|@ + @@ + _ @ + (_)@ + | |@ + _/ |@ + |__/ @@ + _ @ + | |__@ + | / /@ + |_\_\@ + @@ + _ @ + | |@ + | |@ + |_|@ + @@ + @ + _ __ @ + | ' \ @ + |_|_|_|@ + @@ + @ + _ _ @ + | ' \ @ + |_||_|@ + @@ + @ + ___ @ + / _ \@ + \___/@ + @@ + @ + _ __ @ + | '_ \@ + | .__/@ + |_| @@ + @ + __ _ @ + / _` |@ + \__, |@ + |_|@@ + @ + _ _ @ + | '_|@ + |_| @ + @@ + @ + ___@ + (_-<@ + /__/@ + @@ + _ @ + | |_ @ + | _|@ + \__|@ + @@ + @ + _ _ @ + | || |@ + \_,_|@ + @@ + @ + __ __@ + \ V /@ + \_/ @ + @@ + @ + __ __ __@ + \ V V /@ + \_/\_/ @ + @@ + @ + __ __@ + \ \ /@ + /_\_\@ + @@ + @ + _ _ @ + | || |@ + \_, |@ + |__/ @@ + @ + ___@ + |_ /@ + /__|@ + @@ + __@ + / /@ + _| | @ + | | @ + \_\@@ + _ @ + | |@ + | |@ + | |@ + |_|@@ + __ @ + \ \ @ + | |_@ + | | @ + /_/ @@ + /\/|@ + |/\/ @ + $ @ + $ @ + @@ + _ _ @ + (_)(_)@ + /--\ @ + /_/\_\@ + @@ + _ _ @ + (_)(_)@ + / __ \@ + \____/@ + @@ + _ _ @ + (_) (_)@ + | |_| |@ + \___/ @ + @@ + _ _ @ + (_)(_)@ + / _` |@ + \__,_|@ + @@ + _ _ @ + (_)_(_)@ + / _ \ @ + \___/ @ + @@ + _ _ @ + (_)(_)@ + | || |@ + \_,_|@ + @@ + ___ @ + / _ \@ + | |< <@ + | ||_/@ + |_| @@ +160 NO-BREAK SPACE + $@ + $@ + $@ + $@ + $@@ +161 INVERTED EXCLAMATION MARK + _ @ + (_)@ + | |@ + |_|@ + @@ +162 CENT SIGN + @ + || @ + / _)@ + \ _)@ + || @@ +163 POUND SIGN + __ @ + _/ _\ @ + |_ _|_ @ + (_,___|@ + @@ +164 CURRENCY SIGN + /\_/\@ + \ . /@ + / _ \@ + \/ \/@ + @@ +165 YEN SIGN + __ __ @ + \ V / @ + |__ __|@ + |__ __|@ + |_| @@ +166 BROKEN BAR + _ @ + | |@ + |_|@ + | |@ + |_|@@ +167 SECTION SIGN + __ @ + / _)@ + /\ \ @ + \ \/ @ + (__/ @@ +168 DIAERESIS + _ _ @ + (_)(_)@ + $ $ @ + $ $ @ + @@ +169 COPYRIGHT SIGN + ____ @ + / __ \ @ + / / _| \@ + \ \__| /@ + \____/ @@ +170 FEMININE ORDINAL INDICATOR + __ _ @ + / _` |@ + \__,_|@ + |____|@ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + ____@ + / / /@ + < < < @ + \_\_\@ + @@ +172 NOT SIGN + ____ @ + |__ |@ + |_|@ + $ @ + @@ +173 SOFT HYPHEN + @ + __ @ + |__|@ + $ @ + @@ +174 REGISTERED SIGN + ____ @ + / __ \ @ + / | -) \@ + \ ||\\ /@ + \____/ @@ +175 MACRON + ___ @ + |___|@ + $ @ + $ @ + @@ +176 DEGREE SIGN + _ @ + /.\@ + \_/@ + $ @ + @@ +177 PLUS-MINUS SIGN + _ @ + _| |_ @ + |_ _|@ + _|_|_ @ + |_____|@@ +178 SUPERSCRIPT TWO + __ @ + |_ )@ + /__|@ + $ @ + @@ +179 SUPERSCRIPT THREE + ___@ + |_ /@ + |__)@ + $ @ + @@ +180 ACUTE ACCENT + __@ + /_/@ + $ @ + $ @ + @@ +181 MICRO SIGN + @ + _ _ @ + | || |@ + | .,_|@ + |_| @@ +182 PILCROW SIGN + ____ @ + / |@ + \_ | |@ + |_|_|@ + @@ +183 MIDDLE DOT + @ + _ @ + (_)@ + $ @ + @@ +184 CEDILLA + @ + @ + @ + _ @ + )_)@@ +185 SUPERSCRIPT ONE + _ @ + / |@ + |_|@ + $ @ + @@ +186 MASCULINE ORDINAL INDICATOR + ___ @ + / _ \@ + \___/@ + |___|@ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + ____ @ + \ \ \ @ + > > >@ + /_/_/ @ + @@ +188 VULGAR FRACTION ONE QUARTER + _ __ @ + / |/ /__ @ + |_/ /_' |@ + /_/ |_|@ + @@ +189 VULGAR FRACTION ONE HALF + _ __ @ + / |/ /_ @ + |_/ /_ )@ + /_//__|@ + @@ +190 VULGAR FRACTION THREE QUARTERS + ___ __ @ + |_ // /__ @ + |__) /_' |@ + /_/ |_|@ + @@ +191 INVERTED QUESTION MARK + _ @ + (_) @ + / /_ @ + \___|@ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + __ @ + \_\ @ + /--\ @ + /_/\_\@ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + __ @ + /_/ @ + /--\ @ + /_/\_\@ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + /\ @ + |/\| @ + /--\ @ + /_/\_\@ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + /\/|@ + |/\/ @ + /--\ @ + /_/\_\@ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _ _ @ + (_)(_)@ + /--\ @ + /_/\_\@ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + __ @ + (()) @ + /--\ @ + /_/\_\@ + @@ +198 LATIN CAPITAL LETTER AE + ____ @ + /, __|@ + / _ _| @ + /_/|___|@ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + ___ @ + / __|@ + | (__ @ + \___|@ + )_) @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + __ @ + \_\@ + | -<@ + |__<@ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + __@ + /_/@ + | -<@ + |__<@ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + /\ @ + |/\|@ + | -<@ + |__<@ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _ _ @ + (_)(_)@ + | -< @ + |__< @ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + __ @ + \_\ @ + |_ _|@ + |___|@ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + __ @ + /_/ @ + |_ _|@ + |___|@ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + //\ @ + |/_\|@ + |_ _|@ + |___|@ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _ _ @ + (_)_(_)@ + |_ _| @ + |___| @ + @@ +208 LATIN CAPITAL LETTER ETH + ____ @ + | __ \ @ + |_ _|) |@ + |____/ @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + /\/|@ + |/\/ @ + | \| |@ + |_|\_|@ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + __ @ + \_\_ @ + / __ \@ + \____/@ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + __ @ + _/_/ @ + / __ \@ + \____/@ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + /\ @ + |/\| @ + / __ \@ + \____/@ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + /\/|@ + |/\/ @ + / __ \@ + \____/@ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _ _ @ + (_)(_)@ + / __ \@ + \____/@ + @@ +215 MULTIPLICATION SIGN + @ + /\/\@ + > <@ + \/\/@ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + ____ @ + / _//\ @ + | (//) |@ + \//__/ @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + __ @ + _\_\_ @ + | |_| |@ + \___/ @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + __ @ + _/_/_ @ + | |_| |@ + \___/ @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + //\ @ + |/ \| @ + | |_| |@ + \___/ @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ + | |_| |@ + \___/ @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + __ @ + _/_/_@ + \ V /@ + |_| @ + @@ +222 LATIN CAPITAL LETTER THORN + _ @ + | |_ @ + | -_)@ + |_| @ + @@ +223 LATIN SMALL LETTER SHARP S + ___ @ + / _ \@ + | |< <@ + | ||_/@ + |_| @@ +224 LATIN SMALL LETTER A WITH GRAVE + __ @ + \_\_ @ + / _` |@ + \__,_|@ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + __ @ + _/_/ @ + / _` |@ + \__,_|@ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + /\ @ + |/\| @ + / _` |@ + \__,_|@ + @@ +227 LATIN SMALL LETTER A WITH TILDE + /\/|@ + |/\/ @ + / _` |@ + \__,_|@ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _ _ @ + (_)(_)@ + / _` |@ + \__,_|@ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + __ @ + (()) @ + / _` |@ + \__,_|@ + @@ +230 LATIN SMALL LETTER AE + @ + __ ___ @ + / _` -_)@ + \__,___|@ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + __ @ + / _|@ + \__|@ + )_)@@ +232 LATIN SMALL LETTER E WITH GRAVE + __ @ + \_\ @ + / -_)@ + \___|@ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + __ @ + /_/ @ + / -_)@ + \___|@ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + //\ @ + |/_\|@ + / -_)@ + \___|@ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _ _ @ + (_)_(_)@ + / -_) @ + \___| @ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + __ @ + \_\@ + | |@ + |_|@ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + __@ + /_/@ + | |@ + |_|@ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + //\ @ + |/_\|@ + | | @ + |_| @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _ _ @ + (_)_(_)@ + | | @ + |_| @ + @@ +240 LATIN SMALL LETTER ETH + \\/\ @ + \/\\ @ + / _` |@ + \___/ @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + /\/| @ + |/\/ @ + | ' \ @ + |_||_|@ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + __ @ + \_\ @ + / _ \@ + \___/@ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + __ @ + /_/ @ + / _ \@ + \___/@ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + //\ @ + |/_\|@ + / _ \@ + \___/@ + @@ +245 LATIN SMALL LETTER O WITH TILDE + /\/|@ + |/\/ @ + / _ \@ + \___/@ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _ _ @ + (_)_(_)@ + / _ \ @ + \___/ @ + @@ +247 DIVISION SIGN + _ @ + (_) @ + |___|@ + (_) @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + ___ @ + / //\@ + \//_/@ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + __ @ + \_\_ @ + | || |@ + \_,_|@ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + __ @ + _/_/ @ + | || |@ + \_,_|@ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + /\ @ + |/\| @ + | || |@ + \_,_|@ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _ _ @ + (_)(_)@ + | || |@ + \_,_|@ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + __ @ + _/_/ @ + | || |@ + \_, |@ + |__/ @@ +254 LATIN SMALL LETTER THORN + _ @ + | |__ @ + | '_ \@ + | .__/@ + |_| @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _ _ @ + (_)(_)@ + | || |@ + \_, |@ + |__/ @@ diff --git a/cosmic rage/fonts/smscript.flf b/cosmic rage/fonts/smscript.flf new file mode 100644 index 0000000..32a8a39 --- /dev/null +++ b/cosmic rage/fonts/smscript.flf @@ -0,0 +1,1097 @@ +flf2a$ 5 4 13 0 10 0 3904 96 +SmScript by Glenn Chappell 4/93 -- based on Script +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + +$ $@ +$ $@ +$ $@ +$ $@ +$ $@@ + @ + |@ + |@ + o@ + @@ + oo@ + ||@ + $@ + $@ + @@ + @ + _|_|_@ + _|_|_@ + | | @ + @@ + @ + |_|_@ + (|_| @ + _|_|)@ + | | @@ + @ + () / @ + / @ + / ()@ + @@ + @ + () @ + /\/@ + \/\@ + @@ + o@ + /@ + $@ + $@ + @@ + @ + /@ + | @ + | @ + \@@ + @ + \ @ + |@ + |@ + / @@ + @ + \|/ @ + --*--@ + /|\ @ + @@ + @ + | @ + --+--@ + | @ + @@ + @ + @ + @ + o@ + /@@ + @ + @ + ----@ + $ @ + @@ + @ + @ + @ + o@ + @@ + @ + /@ + / @ + / @ + @@ + _ @ + / \ @ + | |@ + \_/ @ + @@ + ,@ + /|@ + |@ + |@ + @@ + _ @ + / )@ + / @ + /__@ + @@ + ____@ + __/@ + $ \@ + \__/@ + @@ + @ + | | @ + |__|_@ + | @ + @@ + ___@ + |__ @ + $ \@ + \__/@ + @@ + _ @ + /_ @ + |/ \@ + \_/@ + @@ + ____@ + $/@ + / @ + / @ + @@ + __ @ + (__)@ + / \@ + \__/@ + @@ + __ @ + / |@ + \_/|@ + |@ + @@ + @ + o@ + $@ + o@ + @@ + @ + o@ + $@ + o@ + /@@ + @ + /@ + < @ + \@ + @@ + @ + ____@ + ____@ + $ @ + @@ + @ + \ @ + >@ + / @ + @@ + __ @ + )@ + | @ + o @ + @@ + ____ @ + / __,\ @ + | / | |@ + | \_/|/ @ + \____/ @@ + __, @ + / | @ + | | @ + \_/\_/@ + @@ + , _ @ + /|/_)@ + | \@ + |(_/@ + @@ + __$ @ + / () @ + | $ @ + \___/@ + @@ + $___ @ + (| \ @ + | |@ + (\__/ @ + @@ + __$ @ + / () @ + >-$ @ + \___/@ + @@ + $_____@ + () |_$@ + /| |@ + (/ @ + @@ + @ + () |@ + /\/|@ + /(_/ @ + @@ + , @ + /| | @ + |--| @ + | |)@ + @@ + @ + |\ @ + _ |/ @ + \_/\/@ + @@ + @ + /| @ + | | @ + \|/@ + (| @@ + , , @ + /|_/ @ + |\ @ + | \_/@ + @@ + $ @ + \_|) @ + | @ + (\__/@ + @@ + ,_ _ @ + /| | | @ + | | | @ + | | |_/@ + @@ + , @ + /|/\ @ + | | @ + | |_/@ + @@ + __ @ + /\_\/@ + | |@ + \__/ @ + @@ + , _ @ + /|/ \@ + |__/@ + | $@ + @@ + __ @ + /__\ @ + |/ \| @ + \__/\_/@ + @@ + , _ @ + /|/ \ @ + |__/ @ + | \_/@ + @@ + @ + () @ + /\ @ + /(_)@ + @@ + $_____@ + () | @ + $| @ + (/ @ + @@ + @ + (| | @ + | | @ + \_/\_/@ + @@ + @ + (| |_/@ + | | @ + \/ @ + @@ + @ + (| | |_/@ + | | | @ + \/ \/ @ + @@ + @ + (\ / @ + >< @ + _/ \_/@ + @@ + @ + (| | @ + | | @ + \/|/@ + (| @@ + _ @ + / ) @ + / @ + /__/@ + (| @@ + _@ + | @ + | @ + | @ + |_@@ + @ + \ @ + \ @ + \@ + @@ + _ @ + |@ + |@ + |@ + _|@@ + /\@ + $@ + $@ + $@ + @@ + @ + @ + @ + $ @ + ____@@ + o@ + \@ + $@ + $@ + @@ + @ + _, @ + / | @ + \/|_/@ + @@ + @ + |) @ + |/\_@ + \/ @ + @@ + @ + _ @ + / @ + \__/@ + @@ + @ + _| @ + / | @ + \/|_/@ + @@ + @ + _ @ + |/ @ + |_/@ + @@ + @ + |\ @ + |/ @ + |_/@ + |) @@ + @ + _, @ + / | @ + \/|/@ + (| @@ + @ + |) @ + |/\ @ + | |/@ + @@ + @ + o @ + | @ + |/@ + @@ + @ + o @ + | @ + |/@ + (| @@ + @ + |) @ + |/) @ + | \/@ + @@ + @ + |\ @ + |/ @ + |_/@ + @@ + @ + @ + /|/|/| @ + $| | |_/@ + @@ + @ + @ + /|/| @ + $| |_/@ + @@ + @ + _ @ + / \_@ + \_/ @ + @@ + @ + @ + |/\_@ + |_/ @ + (| @@ + @ + _, @ + / | @ + \/|_/@ + |) @@ + @ + ,_ @ + / | @ + $ |/@ + @@ + @ + , @ + / \_@ + $\/ @ + @@ + @ + _|_ @ + | @ + |_/@ + @@ + @ + @ + | | @ + $\/|_/@ + @@ + @ + @ + | |_@ + $\/ @ + @@ + @ + @ + | | |_@ + $\/ \/ @ + @@ + @ + @ + /\/ @ + $/\/@ + @@ + @ + @ + | | @ + $\/|/@ + (| @@ + @ + __ @ + / / _@ + $/_/ @ + (| @@ + @ + /@ + _| @ + | @ + \@@ + |@ + |@ + |@ + |@ + |@@ + @ + \ @ + |_@ + | @ + / @@ + /\/@ + $ @ + $ @ + $ @ + @@ + o o @ + __, @ + / | @ + \_/\_/@ + @@ + o o @ + __ @ + /\_\/@ + \__/ @ + @@ + /\/ @ + @ + (| | @ + \_/\_/@ + @@ + o o @ + _, @ + / | @ + \/|_/@ + @@ + o o @ + _ @ + / \_@ + \_/ @ + @@ + o o @ + @ + | | @ + $\/|_/@ + @@ + _ @ + | \@ + | <@ + |_/@ + | @@ +160 NO-BREAK SPACE + $@ + $@ + $@ + $@ + $@@ +161 INVERTED EXCLAMATION MARK + @ + o@ + |@ + |@ + @@ +162 CENT SIGN + @ + _|_ @ + / | @ + \_|_/@ + | @@ +163 POUND SIGN + _ @ + _|_` @ + | @ + (\__/@ + @@ +164 CURRENCY SIGN + \ _ /@ + / \ @ + \_/ @ + / \@ + @@ +165 YEN SIGN + \ /@ + _\_/_@ + __|__@ + | @ + @@ +166 BROKEN BAR + |@ + |@ + @ + |@ + |@@ +167 SECTION SIGN + _@ + ( @ + ()@ + _)@ + @@ +168 DIAERESIS + o o@ + $ $@ + $ $@ + $ $@ + @@ +169 COPYRIGHT SIGN + ____ @ + / __ \ @ + | / () |@ + | \__/ |@ + \____/ @@ +170 FEMININE ORDINAL INDICATOR + _, @ + (_|_@ + --- @ + $ @ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + @ + //@ + << @ + \\@ + @@ +172 NOT SIGN + @ + __ @ + |@ + $ @ + @@ +173 SOFT HYPHEN + @ + @ + ---@ + $ @ + @@ +174 REGISTERED SIGN + ____ @ + / ,_ \ @ + | /|_) |@ + | |\/ |@ + \____/ @@ +175 MACRON + ____@ + $ @ + $ @ + $ @ + @@ +176 DEGREE SIGN + ()@ + $@ + $@ + $@ + @@ +177 PLUS-MINUS SIGN + @ + | @ + --+--@ + __|__@ + @@ +178 SUPERSCRIPT TWO + _ @ + )@ + /_@ + $@ + @@ +179 SUPERSCRIPT THREE + ___@ + _/@ + __)@ + $ @ + @@ +180 ACUTE ACCENT + /@ + $@ + $@ + $@ + @@ +181 MICRO SIGN + @ + @ + | | @ + |\/|_/@ + | @@ +182 PILCROW SIGN + ___ @ + / | |@ + \_| |@ + | |@ + @@ +183 MIDDLE DOT + @ + @ + $O$@ + $ @ + @@ +184 CEDILLA + @ + @ + @ + $ @ + _)@@ +185 SUPERSCRIPT ONE + ,@ + /|@ + |@ + $@ + @@ +186 MASCULINE ORDINAL INDICATOR + __@ + (_)@ + ---@ + $ @ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + @ + \\ @ + >>@ + // @ + @@ +188 VULGAR FRACTION ONE QUARTER + , @ + /| / @ + |/|_|_@ + / | @ + @@ +189 VULGAR FRACTION ONE HALF + , @ + /| /_ @ + |/ )@ + / /_@ + @@ +190 VULGAR FRACTION THREE QUARTERS + ___ @ + _/ / @ + __)/|_|_@ + / | @ + @@ +191 INVERTED QUESTION MARK + @ + o @ + | @ + (__@ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + \ @ + __, @ + / | @ + \_/\_/@ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + / @ + __, @ + / | @ + \_/\_/@ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + /\ @ + __, @ + / | @ + \_/\_/@ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + /\/ @ + __, @ + / | @ + \_/\_/@ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + o o @ + __, @ + / | @ + \_/\_/@ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + _ @ + (_) @ + / | @ + \_/\_/@ + @@ +198 LATIN CAPITAL LETTER AE + __,__$ @ + / | () @ + | |-$ @ + \_/\___/@ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + __$ @ + / () @ + | $ @ + \___/@ + _) @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + \ @ + __$ @ + <_() @ + <___/@ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + / @ + __$ @ + <_() @ + <___/@ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + /\ @ + __$ @ + <_() @ + <___/@ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + o o @ + __$ @ + <_() @ + <___/@ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + \ @ + |\ @ + _ |/ @ + \_/\/@ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + / @ + |\ @ + _ |/ @ + \_/\/@ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + /\ @ + |\ @ + _ |/ @ + \_/\/@ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + o o @ + |\ @ + _ |/ @ + \_/\/@ + @@ +208 LATIN CAPITAL LETTER ETH + ___ @ + (| \ @ + -|- |@ + (\__/ @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + ,/\/ @ + /|/\ @ + | | @ + | |_/@ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + \ @ + __ @ + /\_\/@ + \__/ @ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + / @ + __ @ + /\_\/@ + \__/ @ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + /\ @ + __ @ + /\_\/@ + \__/ @ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + /\/ @ + __ @ + /\_\/@ + \__/ @ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + o o @ + __ @ + /\_\/@ + \__/ @ + @@ +215 MULTIPLICATION SIGN + @ + $\/$@ + $/\$@ + $ $@ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + __/ @ + /\/\/@ + | / |@ + /__/ @ + / @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + \ @ + @ + (| | @ + \_/\_/@ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + / @ + @ + (| | @ + \_/\_/@ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + /\ @ + @ + (| | @ + \_/\_/@ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + /\/ @ + @ + (| | @ + \_/\_/@ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + / @ + @ + (| | @ + \/|/@ + (| @@ +222 LATIN CAPITAL LETTER THORN + , @ + /|__ @ + |__)@ + | $@ + @@ +223 LATIN SMALL LETTER SHARP S + _ @ + | \@ + | <@ + |_/@ + | @@ +224 LATIN SMALL LETTER A WITH GRAVE + \ @ + _, @ + / | @ + \/|_/@ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + / @ + _, @ + / | @ + \/|_/@ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + /\ @ + _, @ + / | @ + \/|_/@ + @@ +227 LATIN SMALL LETTER A WITH TILDE + /\/ @ + _, @ + / | @ + \/|_/@ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + o o @ + _, @ + / | @ + \/|_/@ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + () @ + _, @ + / | @ + \/|_/@ + @@ +230 LATIN SMALL LETTER AE + @ + _,_ @ + / |/ @ + \/|_/@ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + _ @ + / @ + \__/@ + _) @@ +232 LATIN SMALL LETTER E WITH GRAVE + \ @ + _ @ + |/ @ + |_/@ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + / @ + _ @ + |/ @ + |_/@ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + /\ @ + _ @ + |/ @ + |_/@ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + o o @ + _ @ + |/ @ + |__/@ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + \ @ + @ + | @ + |/@ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + / @ + @ + | @ + |/@ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + /\@ + @ + | @ + |/@ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + o o @ + @ + | @ + |__/@ + @@ +240 LATIN SMALL LETTER ETH + \, @ + '\ @ + / |@ + \/ @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + /\/ @ + @ + /|/| @ + $| |_/@ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + \ @ + _ @ + / \_@ + \_/ @ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + / @ + _ @ + / \_@ + \_/ @ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + /\ @ + _ @ + / \_@ + \_/ @ + @@ +245 LATIN SMALL LETTER O WITH TILDE + /\/ @ + _ @ + / \_@ + \_/ @ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + o o @ + _ @ + / \_@ + \_/ @ + @@ +247 DIVISION SIGN + @ + O @ + ---@ + O @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + __/ @ + / /\_@ + \/_/ @ + / @@ +249 LATIN SMALL LETTER U WITH GRAVE + \ @ + @ + | | @ + $\/|_/@ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + / @ + @ + | | @ + $\/|_/@ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + /\ @ + @ + | | @ + $\/|_/@ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + o o @ + @ + | | @ + $\/|_/@ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + / @ + @ + | | @ + $\/|/@ + (| @@ +254 LATIN SMALL LETTER THORN + @ + |) @ + |/\_@ + |_/ @ + (| @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + o o @ + @ + | | @ + $\/|/@ + (| @@ diff --git a/cosmic rage/fonts/smshadow.flf b/cosmic rage/fonts/smshadow.flf new file mode 100644 index 0000000..7e1329f --- /dev/null +++ b/cosmic rage/fonts/smshadow.flf @@ -0,0 +1,899 @@ +flf2a$ 4 3 14 0 10 0 1920 96 +SmShadow by Glenn Chappell 4/93 -- based on Small +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + + $$@ + $$@ + $$@ + $$@@ + |$@ + _|$@ + _)$@ + @@ + | )$@ + V V$ @ + @ + @@ + | |$ @ + _ |_ |_|$@ + _ |_ |_|$@ + _| _|$ @@ + |$ @ + (_-<$@ + _ _/$@ + _|$ @@ + _) /$ @ + /$ @ + _/ _)$@ + @@ + _|$ @ + _| _|$@ + \____|$ @ + @@ + )$@ + /$ @ + @ + @@ + /$@ + |$ @ + |$ @ + \_\$@@ + \ \$ @ + |$@ + |$@ + _/$ @@ + \ \ /$ @ + _ _|$@ + _/ _\$ @ + @@ + |$ @ + __ __|$@ + _|$ @ + @@ + @ + @ + )$@ + /$ @@ + @ + ____|$@ + @ + @@ + @ + @ + _)$@ + @@ + /$@ + /$ @ + _/$ @ + @@ + \$ @ + ( |$@ + \__/$ @ + @@ + _ |$@ + |$@ + _|$@ + @@ + _ )$@ + /$ @ + ___|$@ + @@ + __ /$@ + _ \$@ + ___/$@ + @@ + | |$ @ + __ _|$@ + _|$ @ + @@ + __|$@ + __ \$@ + ___/$@ + @@ + /$ @ + _ \$@ + \___/$@ + @@ + __ /$@ + /$ @ + _/$ @ + @@ + _ )$@ + _ \$@ + \___/$@ + @@ + _ \$@ + \_ /$@ + _/$ @ + @@ + _)$@ + @ + _)$@ + @@ + _)$@ + @ + )$@ + /$ @@ + /$@ + < <$ @ + \_\$@ + @@ + @ + ____|$@ + ____|$@ + @@ + \ \$ @ + > >$@ + _/$ @ + @@ + __ \$@ + _/$@ + _)$ @ + @@ + __ \$ @ + / _` |$@ + \__,_|$@ + \____/$ @@ + \$ @ + _ \$ @ + _/ _\$@ + @@ + _ )$@ + _ \$@ + ___/$@ + @@ + __|$@ + ($ @ + \___|$@ + @@ + _ \$ @ + | |$@ + ___/$ @ + @@ + __|$@ + _|$ @ + ___|$@ + @@ + __|$@ + _|$ @ + _|$ @ + @@ + __|$@ + (_ |$@ + \___|$@ + @@ + | |$@ + __ |$@ + _| _|$@ + @@ + _ _|$@ + |$ @ + ___|$@ + @@ + |$@ + \ |$@ + \__/$ @ + @@ + | /$@ + . <$ @ + _|\_\$@ + @@ + |$ @ + |$ @ + ____|$@ + @@ + \ |$@ + |\/ |$@ + _| _|$@ + @@ + \ |$@ + . |$@ + _|\_|$@ + @@ + _ \$ @ + ( |$@ + \___/$ @ + @@ + _ \$@ + __/$@ + _|$ @ + @@ + _ \$ @ + ( |$@ + \__\_\$@ + @@ + _ \$@ + /$@ + _|_\$@ + @@ + __|$@ + \__ \$@ + ____/$@ + @@ + __ __|$@ + |$ @ + _|$ @ + @@ + | |$@ + | |$@ + \__/$ @ + @@ + \ \ /$@ + \ \ /$ @ + \_/$ @ + @@ + \ \ /$@ + \ \ \ /$ @ + \_/\_/$ @ + @@ + \ \ /$@ + > <$ @ + _/\_\$@ + @@ + \ \ /$@ + \ /$ @ + _|$ @ + @@ + __ /$@ + /$ @ + ____|$@ + @@ + _|$@ + |$ @ + |$ @ + __|$@@ + \ \$ @ + \ \$ @ + \_\$@ + @@ + _ |$@ + |$@ + |$@ + __|$@@ + \$ @ + /\|$@ + @ + @@ + @ + @ + @ + ____|$@@ + )$@ + \|$@ + @ + @@ + @ + _` |$@ + \__,_|$@ + @@ + |$ @ + _ \$@ + _.__/$@ + @@ + @ + _|$@ + \__|$@ + @@ + |$@ + _` |$@ + \__,_|$@ + @@ + @ + -_)$@ + \___|$@ + @@ + _|$@ + _|$@ + _|$ @ + @@ + @ + _` |$@ + \__, |$@ + ____/$ @@ + |$ @ + \$ @ + _| _|$@ + @@ + _)$@ + |$@ + _|$@ + @@ + _)$@ + |$@ + |$@ + __/$ @@ + |$ @ + | /$@ + _\_\$@ + @@ + |$@ + |$@ + _|$@ + @@ + @ + ` \$ @ + _|_|_|$@ + @@ + @ + \$ @ + _| _|$@ + @@ + @ + _ \$@ + \___/$@ + @@ + @ + _ \$@ + .__/$@ + _|$ @@ + @ + _` |$@ + \__, |$@ + _|$@@ + @ + _|$@ + _|$ @ + @@ + @ + (_-<$@ + ___/$@ + @@ + |$ @ + _|$@ + \__|$@ + @@ + @ + | |$@ + \_,_|$@ + @@ + @ + \ \ /$@ + \_/$ @ + @@ + @ + \ \ \ /$@ + \_/\_/$ @ + @@ + @ + \ \ /$@ + _\_\$@ + @@ + @ + | |$@ + \_, |$@ + ___/$ @@ + @ + _ /$@ + ___|$@ + @@ + /$@ + _ |$ @ + |$ @ + \_\$@@ + |$@ + |$@ + |$@ + _|$@@ + \ \$ @ + |_$@ + |$ @ + _/$ @@ + \ |$@ + /\/$ @ + @ + @@ + _) \_)$@ + _ \$ @ + / _\$@ + @@ + _) _)$@ + __ \$@ + \____/$@ + @@ + _) _)$@ + | |$@ + \__/$ @ + @@ + _) _)$@ + _` |$@ + \__,_|$@ + @@ + _) _)$@ + _ \$@ + \___/$@ + @@ + _) _)$@ + | |$@ + \_,_|$@ + @@ + _ \$@ + |< <$@ + |__/$@ + _|$ @@ +160 NO-BREAK SPACE + $$@ + $$@ + $$@ + $$@@ +161 INVERTED EXCLAMATION MARK + _)$@ + |$@ + _|$@ + @@ +162 CENT SIGN + |$ @ + _)$@ + \ _)$@ + |$ @@ +163 POUND SIGN + _\$ @ + _ _|$ @ + _,___|$@ + @@ +164 CURRENCY SIGN + \ . /$@ + _ \$@ + \/ /$@ + @@ +165 YEN SIGN + \ \ /$ @ + __ __|$@ + __ __|$@ + _|$ @@ +166 BROKEN BAR + |$@ + _|$@ + |$@ + _|$@@ +167 SECTION SIGN + _)$@ + \ \$ @ + \ \/$ @ + __/$ @@ +168 DIAERESIS + _) _)$@ + @ + @ + @@ +169 COPYRIGHT SIGN + \$ @ + _| \$@ + \ \__| /$@ + \____/$ @@ +170 FEMININE ORDINAL INDICATOR + _` |$@ + \__,_|$@ + _____|$@ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + / /$@ + < < <$ @ + \_\_\$@ + @@ +172 NOT SIGN + ____ |$@ + _|$@ + @ + @@ +173 SOFT HYPHEN + @ + ___|$@ + @ + @@ +174 REGISTERED SIGN + \$ @ + -) \$@ + \ |\\ /$@ + \____/$ @@ +175 MACRON + ___|$@ + @ + @ + @@ +176 DEGREE SIGN + .\$@ + \_/$@ + @ + @@ +177 PLUS-MINUS SIGN + |$ @ + _ _|$@ + _|$ @ + _____|$@@ +178 SUPERSCRIPT TWO + _ )$@ + __|$@ + @ + @@ +179 SUPERSCRIPT THREE + _ /$@ + __)$@ + @ + @@ +180 ACUTE ACCENT + _/$@ + @ + @ + @@ +181 MICRO SIGN + @ + | |$@ + .,_|$@ + _|$ @@ +182 PILCROW SIGN + |$@ + \_ | |$@ + _|_|$@ + @@ +183 MIDDLE DOT + @ + _)$@ + @ + @@ +184 CEDILLA + @ + @ + @ + _)$@@ +185 SUPERSCRIPT ONE + _ |$@ + _|$@ + @ + @@ +186 MASCULINE ORDINAL INDICATOR + _ \$@ + \___/$@ + ____|$@ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + \ \ \$ @ + > > >$@ + _/_/$ @ + @@ +188 VULGAR FRACTION ONE QUARTER + _ | /$ @ + _| /_' |$@ + _/ _|$@ + @@ +189 VULGAR FRACTION ONE HALF + _ | /$ @ + _| /_ )$@ + _/ __|$@ + @@ +190 VULGAR FRACTION THREE QUARTERS + _ / /$ @ + __) /_' |$@ + _/ _|$@ + @@ +191 INVERTED QUESTION MARK + _)$ @ + /$ @ + \___|$@ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + \_\$ @ + --\$ @ + _/\_\$@ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + _/$ @ + --\$ @ + _/\_\$@ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + /\\$ @ + --\$ @ + _/\_\$@ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + / _/$ @ + --\$ @ + _/\_\$@ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _) \_)$@ + _ \$ @ + / _\$@ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + ( )$ @ + _ \$ @ + _/ _\$@ + @@ +198 LATIN CAPITAL LETTER AE + , __|$@ + _ _|$ @ + _/ ___|$@ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + |$@ + ($ @ + \___|$@ + _)$ @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + \_\$@ + -<$@ + __<$@ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + _/$@ + -<$@ + __<$@ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + /\\$@ + -<$@ + __<$@ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _) _)$@ + -<$ @ + __<$ @ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + \_\$ @ + _ _|$@ + ___|$@ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + _/$ @ + _ _|$@ + ___|$@ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + /\\$ @ + _ _|$@ + ___|$@ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _) _)$@ + _ _|$ @ + ___|$ @ + @@ +208 LATIN CAPITAL LETTER ETH + _ \$ @ + _ _| |$@ + ___/$ @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + / _/$@ + \ |$@ + _|\_|$@ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + \_\$ @ + __ \$@ + \____/$@ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + _/$ @ + __ \$@ + \____/$@ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + /\\$ @ + __ \$@ + \____/$@ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + / _/$ @ + __ \$@ + \____/$@ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _) _)$@ + __ \$@ + \____/$@ + @@ +215 MULTIPLICATION SIGN + \ \$@ + , '$@ + \/\/$@ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + _ /\$ @ + ( / |$@ + \_/__/$ @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + \_\$ @ + | |$@ + \__/$ @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + _/$ @ + | |$@ + \__/$ @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + /\\$ @ + | |$@ + \__/$ @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _) _)$@ + | |$@ + \__/$ @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + _/$ @ + \ \ /$@ + _|$ @ + @@ +222 LATIN CAPITAL LETTER THORN + |$ @ + -_)$@ + _|$ @ + @@ +223 LATIN SMALL LETTER SHARP S + _ \$@ + |< <$@ + |__/$@ + _|$ @@ +224 LATIN SMALL LETTER A WITH GRAVE + \_\$ @ + _` |$@ + \__,_|$@ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + _/$ @ + _` |$@ + \__,_|$@ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + /\\$ @ + _` |$@ + \__,_|$@ + @@ +227 LATIN SMALL LETTER A WITH TILDE + / _/$ @ + _` |$@ + \__,_|$@ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _) _)$@ + _` |$@ + \__,_|$@ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + ( )$ @ + _` |$@ + \__,_|$@ + @@ +230 LATIN SMALL LETTER AE + @ + _` -_)$@ + \__,___|$@ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + _|$@ + \__|$@ + _)$@@ +232 LATIN SMALL LETTER E WITH GRAVE + \_\$ @ + -_)$@ + \___|$@ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + _/$ @ + -_)$@ + \___|$@ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + /\\$ @ + -_)$@ + \___|$@ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _) _)$@ + -_)$ @ + \___|$ @ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + \_\$@ + |$@ + _|$@ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + _/$@ + |$@ + _|$@ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + /\\$@ + |$ @ + _|$ @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _) _)$@ + |$ @ + _|$ @ + @@ +240 LATIN SMALL LETTER ETH + , \'$@ + _` |$@ + \___/$ @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + / _/$ @ + ' \$ @ + _| _|$@ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + \_\$ @ + _ \$@ + \___/$@ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + _/$ @ + _ \$@ + \___/$@ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + /\\$ @ + _ \$@ + \___/$@ + @@ +245 LATIN SMALL LETTER O WITH TILDE + / _/$@ + _ \$@ + \___/$@ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _) _)$@ + _ \$@ + \___/$@ + @@ +247 DIVISION SIGN + _)$ @ + ___|$@ + _)$ @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + /\$@ + \_/_/$@ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + \_\$ @ + | |$@ + \_,_|$@ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + _/$ @ + | |$@ + \_,_|$@ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + /\\$ @ + | |$@ + \_,_|$@ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _) _)$@ + | |$@ + \_,_|$@ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + _/$ @ + | |$@ + \_, |$@ + ___/$ @@ +254 LATIN SMALL LETTER THORN + |$ @ + '_ \$@ + .__/$@ + _|$ @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _) _)$@ + | |$@ + \_, |$@ + ___/$ @@ diff --git a/cosmic rage/fonts/smslant.flf b/cosmic rage/fonts/smslant.flf new file mode 100644 index 0000000..24284b8 --- /dev/null +++ b/cosmic rage/fonts/smslant.flf @@ -0,0 +1,1097 @@ +flf2a$ 5 4 14 15 10 0 22415 96 +SmSlant by Glenn Chappell 6/93 - based on Small & Slant +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + + $@ + $ @ + $ @ + $ @ +$ @@ + __@ + / /@ + /_/ @ +(_) @ + @@ + _ _ @ +( | )@ +|/|/ @ +$ @ + @@ + ____ @ + __/ / /_@ + /_ . __/@ +/_ __/ @ + /_/_/ @@ + @ + _//@ + (_-<@ +/ __/@ +// @@ + _ __@ +(_)_/_/@ + _/_/_ @ +/_/ (_)@ + @@ + ____ @ + / __/___@ + > _/_ _/@ +|_____/ @ + @@ + _ @ +( )@ +|/ @ +$ @ + @@ + __@ + _/_/@ + / / @ +/ / @ +|_| @@ + _ @ + | |@ + / /@ + _/_/ @ +/_/ @@ + @ + _/|@ +> _<@ +|/ @ + @@ + __ @ + __/ /_@ +/_ __/@ + /_/ @ + @@ + @ + @ + _ @ +( )@ +|/ @@ + @ + ____@ +/___/@ + $ @ + @@ + @ + @ + _ @ +(_)@ + @@ + __@ + _/_/@ + _/_/ @ +/_/ @ + @@ + ___ @ + / _ \@ +/ // /@ +\___/ @ + @@ + ___@ + < /@ + / / @ +/_/ @ + @@ + ___ @ + |_ |@ + / __/ @ +/____/ @ + @@ + ____@ + |_ /@ + _/_ < @ +/____/ @ + @@ + ____@ + / / /@ +/_ _/@ + /_/ @ + @@ + ____@ + / __/@ + /__ \ @ +/____/ @ + @@ + ____@ + / __/@ +/ _ \ @ +\___/ @ + @@ + ____@ +/_ /@ + / / @ +/_/ @ + @@ + ___ @ + ( _ )@ +/ _ |@ +\___/ @ + @@ + ___ @ + / _ \@ + \_, /@ +/___/ @ + @@ + _ @ + (_)@ + _ @ +(_) @ + @@ + _ @ + (_)@ + _ @ +( ) @ +|/ @@ + __@ + / /@ +< < @ + \_\@ + @@ + @ + ____@ + /___/@ +/___/ @ + @@ +__ @ +\ \ @ + > >@ +/_/ @ + @@ + ___ @ +/__ \@ + /__/@ +(_) @ + @@ + _____ @ + / ___ \@ +/ / _ `/@ +\ \_,_/ @ + \___/ @@ + ___ @ + / _ |@ + / __ |@ +/_/ |_|@ + @@ + ___ @ + / _ )@ + / _ |@ +/____/ @ + @@ + _____@ + / ___/@ +/ /__ @ +\___/ @ + @@ + ___ @ + / _ \@ + / // /@ +/____/ @ + @@ + ____@ + / __/@ + / _/ @ +/___/ @ + @@ + ____@ + / __/@ + / _/ @ +/_/ @ + @@ + _____@ + / ___/@ +/ (_ / @ +\___/ @ + @@ + __ __@ + / // /@ + / _ / @ +/_//_/ @ + @@ + ____@ + / _/@ + _/ / @ +/___/ @ + @@ + __@ + __ / /@ +/ // / @ +\___/ @ + @@ + __ __@ + / //_/@ + / ,< @ +/_/|_| @ + @@ + __ @ + / / @ + / /__@ +/____/@ + @@ + __ ___@ + / |/ /@ + / /|_/ / @ +/_/ /_/ @ + @@ + _ __@ + / |/ /@ + / / @ +/_/|_/ @ + @@ + ____ @ + / __ \@ +/ /_/ /@ +\____/ @ + @@ + ___ @ + / _ \@ + / ___/@ +/_/ @ + @@ + ____ @ + / __ \@ +/ /_/ /@ +\___\_\@ + @@ + ___ @ + / _ \@ + / , _/@ +/_/|_| @ + @@ + ____@ + / __/@ + _\ \ @ +/___/ @ + @@ + ______@ +/_ __/@ + / / @ +/_/ @ + @@ + __ __@ + / / / /@ +/ /_/ / @ +\____/ @ + @@ + _ __@ + | | / /@ + | |/ / @ + |___/ @ + @@ + _ __@ + | | /| / /@ + | |/ |/ / @ + |__/|__/ @ + @@ + _ __@ + | |/_/@ + _> < @ +/_/|_| @ + @@ + __ __@ + \ \/ /@ + \ / @ + /_/ @ + @@ + ____@ + /_ /@ + / /_@ + /___/@ + @@ + ___@ + / _/@ + / / @ + / / @ +/__/ @@ +__ @ +\ \ @ + \ \ @ + \_\@ + @@ + ___@ + / /@ + / / @ + _/ / @ +/__/ @@ + //|@ +|/||@ + $ @ +$ @ + @@ + @ + @ + @ + ____@ +/___/@@ + _ @ +( )@ + V @ +$ @ + @@ + @ + ___ _@ +/ _ `/@ +\_,_/ @ + @@ + __ @ + / / @ + / _ \@ +/_.__/@ + @@ + @ + ____@ +/ __/@ +\__/ @ + @@ + __@ + ___/ /@ +/ _ / @ +\_,_/ @ + @@ + @ + ___ @ +/ -_)@ +\__/ @ + @@ + ___@ + / _/@ + / _/ @ +/_/ @ + @@ + @ + ___ _@ + / _ `/@ + \_, / @ +/___/ @@ + __ @ + / / @ + / _ \@ +/_//_/@ + @@ + _ @ + (_)@ + / / @ +/_/ @ + @@ + _ @ + (_)@ + / / @ + __/ / @ +|___/ @@ + __ @ + / /__@ + / '_/@ +/_/\_\ @ + @@ + __@ + / /@ + / / @ +/_/ @ + @@ + @ + __ _ @ + / ' \@ +/_/_/_/@ + @@ + @ + ___ @ + / _ \@ +/_//_/@ + @@ + @ + ___ @ +/ _ \@ +\___/@ + @@ + @ + ___ @ + / _ \@ + / .__/@ +/_/ @@ + @ + ___ _@ +/ _ `/@ +\_, / @ + /_/ @@ + @ + ____@ + / __/@ +/_/ @ + @@ + @ + ___@ + (_-<@ +/___/@ + @@ + __ @ + / /_@ +/ __/@ +\__/ @ + @@ + @ + __ __@ +/ // /@ +\_,_/ @ + @@ + @ + _ __@ +| |/ /@ +|___/ @ + @@ + @ + _ __@ +| |/|/ /@ +|__,__/ @ + @@ + @ + __ __@ + \ \ /@ +/_\_\ @ + @@ + @ + __ __@ + / // /@ + \_, / @ +/___/ @@ + @ + ___@ +/_ /@ +/__/@ + @@ + __@ + _/_/@ +_/ / @ +/ / @ +\_\ @@ + __@ + / /@ + / / @ + / / @ +/_/ @@ + __ @ + \ \ @ + / /_@ + _/_/ @ +/_/ @@ + /\//@ +//\/ @ + $ @ +$ @ + @@ + _ _ @ + (_)(_)@ + / - | @ +/_/|_| @ + @@ + _ _ @ + (_)_(_)@ +/ __ \ @ +\____/ @ + @@ + _ _ @ + (_) (_)@ +/ /_/ / @ +\____/ @ + @@ + _ _ @ + (_)(_)@ +/ _ `/ @ +\_,_/ @ + @@ + _ _ @ + (_)(_)@ +/ _ \ @ +\___/ @ + @@ + _ _ @ + (_)(_)@ +/ // / @ +\_,_/ @ + @@ + ____ @ + / _ )@ + / /< < @ + / //__/ @ +/_/ @@ +160 NO-BREAK SPACE + $@ + $ @ + $ @ + $ @ +$ @@ +161 INVERTED EXCLAMATION MARK + _ @ + (_)@ + / / @ +/_/ @ + @@ +162 CENT SIGN + @ + __//@ +/ __/@ +\ _/ @ +// @@ +163 POUND SIGN + __ @ + __/__|@ + /_ _/_ @ +(_,___/ @ + @@ +164 CURRENCY SIGN + /|_/|@ + | . / @ + /_ | @ +|/ |/ @ + @@ +165 YEN SIGN + ____@ + _| / /@ + /_ __/@ +/_ __/ @ + /_/ @@ +166 BROKEN BAR + __@ + / /@ + /_/ @ + / / @ +/_/ @@ +167 SECTION SIGN + __ @ + _/ _)@ + / | | @ + | |_/ @ +(__/ @@ +168 DIAERESIS + _ _ @ +(_) (_)@ + $ $ @ +$ $ @ + @@ +169 COPYRIGHT SIGN + ____ @ + / ___\ @ + / / _/ |@ +| |__/ / @ + \____/ @@ +170 FEMININE ORDINAL INDICATOR + ___ _@ + / _ `/@ + _\_,_/ @ +/____/ @ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + ____@ + / / /@ +< < < @ + \_\_\@ + @@ +172 NOT SIGN + @ + ____@ +/_ /@ + /_/ @ + @@ +173 SOFT HYPHEN + @ + ___@ +/__/@ + $ @ + @@ +174 REGISTERED SIGN + ____ @ + / __ \ @ + / / -) |@ +| //\\ / @ + \____/ @@ +175 MACRON + ____@ +/___/@ + $ @ +$ @ + @@ +176 DEGREE SIGN + __ @ + /. |@ +|__/ @ + $ @ + @@ +177 PLUS-MINUS SIGN + __ @ + __/ /_@ + /_ __/@ + __/_/_ @ +/_____/ @@ +178 SUPERSCRIPT TWO + __ @ + |_ )@ +/__| @ + $ @ + @@ +179 SUPERSCRIPT THREE + ___@ + |_ /@ +/__) @ + $ @ + @@ +180 ACUTE ACCENT + __@ +/_/@ + $ @ +$ @ + @@ +181 MICRO SIGN + @ + __ __@ + / // /@ + / .,_/ @ +/_/ @@ +182 PILCROW SIGN + _____@ + / /@ +|_ / / @ +/_/_/ @ + @@ +183 MIDDLE DOT + @ + _ @ +(_)@ +$ @ + @@ +184 CEDILLA + @ + @ + @ + _ @ +/_)@@ +185 SUPERSCRIPT ONE + __@ + < /@ +/_/ @ +$ @ + @@ +186 MASCULINE ORDINAL INDICATOR + ___ @ + / _ \@ + _\___/@ +/____/ @ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +____ @ +\ \ \ @ + > > >@ +/_/_/ @ + @@ +188 VULGAR FRACTION ONE QUARTER + __ __ @ + < /_/_/___@ +/_//_//_' /@ + /_/ /_/ @ + @@ +189 VULGAR FRACTION ONE HALF + __ __ @ + < /_/_/_ @ +/_//_/|_ )@ + /_/ /__| @ + @@ +190 VULGAR FRACTION THREE QUARTERS + ___ __ @ + |_ /_/_/___@ +/__)/_//_' /@ + /_/ /_/ @ + @@ +191 INVERTED QUESTION MARK + _ @ + _(_)@ +/ _/_@ +\___/@ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + __ @ + _\_\@ + / - |@ +/_/|_|@ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + __@ + _/_/@ + / - |@ +/_/|_|@ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + //|@ + _|/||@ + / - | @ +/_/|_| @ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + /\//@ + _//\/ @ + / - | @ +/_/|_| @ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _ _ @ + (_)(_)@ + / - | @ +/_/|_| @ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + (())@ + / _ |@ + / __ |@ +/_/ |_|@ + @@ +198 LATIN CAPITAL LETTER AE + _______@ + / _ __/@ + / _ _/ @ +/_//___/ @ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + _____@ + / ___/@ +/ /__ @ +\___/ @ +/_) @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + __ @ + \_\@ + / -<@ +/__< @ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + __@ + _/_/@ + / -< @ +/__< @ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + //|@ + |/||@ + / -< @ +/__< @ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _ _ @ + (_)(_)@ + / -< @ +/__< @ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + __ @ + _\_\ @ + /_ __/@ +/____/ @ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + __@ + __/_/@ + /_ __/@ +/____/ @ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + //|@ + _|/||@ + /_ __/@ +/____/ @ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _ _ @ + (_)(_)@ + /_ __/ @ +/____/ @ + @@ +208 LATIN CAPITAL LETTER ETH + ____ @ + _/ __ \@ +/_ _// /@ +/_____/ @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + /\//@ + __//\/ @ + / |/ / @ +/_/|__/ @ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + __ @ + _\_\ @ +/ __ \@ +\____/@ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + __@ + __/_/@ +/ __ \@ +\____/@ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + //|@ + _|/||@ +/ __ \@ +\____/@ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + /\//@ + _//\/ @ +/ __ \ @ +\____/ @ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _ _ @ + (_)_(_)@ +/ __ \ @ +\____/ @ + @@ +215 MULTIPLICATION SIGN + @ + /|/|@ + > < @ +|/|/ @ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + _____ @ + / _// \@ +/ //// /@ +\_//__/ @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + __ @ + __\_\ @ +/ /_/ /@ +\____/ @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + __@ + __ /_/@ +/ /_/ /@ +\____/ @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + //|@ + __|/||@ +/ /_/ /@ +\____/ @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ +/ /_/ / @ +\____/ @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + __@ +__/_/@ +\ V /@ + /_/ @ + @@ +222 LATIN CAPITAL LETTER THORN + __ @ + / / @ + / -_)@ +/_/ @ + @@ +223 LATIN SMALL LETTER SHARP S + ____ @ + / _ )@ + / /< < @ + / //__/ @ +/_/ @@ +224 LATIN SMALL LETTER A WITH GRAVE + __ @ + _\_\_@ +/ _ `/@ +\_,_/ @ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + __@ + __/_/@ +/ _ `/@ +\_,_/ @ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + //|@ + _|/||@ +/ _ `/@ +\_,_/ @ + @@ +227 LATIN SMALL LETTER A WITH TILDE + /\//@ + _//\/ @ +/ _ `/ @ +\_,_/ @ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _ _ @ + (_)(_)@ +/ _ `/ @ +\_,_/ @ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + __ @ + _(())@ +/ _ `/@ +\_,_/ @ + @@ +230 LATIN SMALL LETTER AE + @ + ___ ___ @ +/ _ ` -_)@ +\_,____/ @ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + ____@ +/ __/@ +\__/ @ +/_) @@ +232 LATIN SMALL LETTER E WITH GRAVE + __ @ + _\_\@ +/ -_)@ +\__/ @ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + __@ + _/_/@ +/ -_)@ +\__/ @ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + //|@ + |/||@ +/ -_)@ +\__/ @ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _ _ @ +(_)(_)@ +/ -_) @ +\__/ @ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + __ @ + \_\@ + / / @ +/_/ @ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + __@ + /_/@ + / / @ +/_/ @ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + //|@ + |/||@ + / / @ +/_/ @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _ _ @ +(_)_(_)@ + / / @ +/_/ @ + @@ +240 LATIN SMALL LETTER ETH + _||_@ + __ || @ +/ _` | @ +\___/ @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + /\//@ + _//\/ @ + / _ \ @ +/_//_/ @ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + __ @ + _\_\@ +/ _ \@ +\___/@ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + __@ + _/_/@ +/ _ \@ +\___/@ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + //|@ + _|/||@ +/ _ \ @ +\___/ @ + @@ +245 LATIN SMALL LETTER O WITH TILDE + /\//@ + _//\/ @ +/ _ \ @ +\___/ @ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _ _ @ + (_)(_)@ +/ _ \ @ +\___/ @ + @@ +247 DIVISION SIGN + _ @ + _(_)@ +/___/@ +(_) @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + ___ @ +/ //\@ +\//_/@ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + __ @ + __\_\@ +/ // /@ +\_,_/ @ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + __@ + __/_/@ +/ // /@ +\_,_/ @ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + //|@ + _|/||@ +/ // /@ +\_,_/ @ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _ _ @ + (_)(_)@ +/ // / @ +\_,_/ @ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + __@ + __/_/@ + / // /@ + \_, / @ +/___/ @@ +254 LATIN SMALL LETTER THORN + __ @ + / / @ + / _ \@ + / .__/@ +/_/ @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _ _ @ + (_)(_)@ + / // / @ + \_, / @ +/___/ @@ diff --git a/cosmic rage/fonts/standard.flf b/cosmic rage/fonts/standard.flf new file mode 100644 index 0000000..1dc6fbf --- /dev/null +++ b/cosmic rage/fonts/standard.flf @@ -0,0 +1,2227 @@ +flf2a$ 6 5 16 15 11 0 24463 229 +Standard by Glenn Chappell & Ian Chai 3/93 -- based on Frank's .sig +Includes ISO Latin-1 +figlet release 2.1 -- 12 Aug 1994 +Modified for figlet 2.2 by John Cowan + to add Latin-{2,3,4,5} support (Unicode U+0100-017F). +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Modified by Paul Burton 12/96 to include new parameter +supported by FIGlet and FIGWin. May also be slightly modified for better use +of new full-width/kern/smush alternatives, but default output is NOT changed. + $@ + $@ + $@ + $@ + $@ + $@@ + _ @ + | |@ + | |@ + |_|@ + (_)@ + @@ + _ _ @ + ( | )@ + V V @ + $ @ + $ @ + @@ + _ _ @ + _| || |_ @ + |_ .. _|@ + |_ _|@ + |_||_| @ + @@ + _ @ + | | @ + / __)@ + \__ \@ + ( /@ + |_| @@ + _ __@ + (_)/ /@ + / / @ + / /_ @ + /_/(_)@ + @@ + ___ @ + ( _ ) @ + / _ \/\@ + | (_> <@ + \___/\/@ + @@ + _ @ + ( )@ + |/ @ + $ @ + $ @ + @@ + __@ + / /@ + | | @ + | | @ + | | @ + \_\@@ + __ @ + \ \ @ + | |@ + | |@ + | |@ + /_/ @@ + @ + __/\__@ + \ /@ + /_ _\@ + \/ @ + @@ + @ + _ @ + _| |_ @ + |_ _|@ + |_| @ + @@ + @ + @ + @ + _ @ + ( )@ + |/ @@ + @ + @ + _____ @ + |_____|@ + $ @ + @@ + @ + @ + @ + _ @ + (_)@ + @@ + __@ + / /@ + / / @ + / / @ + /_/ @ + @@ + ___ @ + / _ \ @ + | | | |@ + | |_| |@ + \___/ @ + @@ + _ @ + / |@ + | |@ + | |@ + |_|@ + @@ + ____ @ + |___ \ @ + __) |@ + / __/ @ + |_____|@ + @@ + _____ @ + |___ / @ + |_ \ @ + ___) |@ + |____/ @ + @@ + _ _ @ + | || | @ + | || |_ @ + |__ _|@ + |_| @ + @@ + ____ @ + | ___| @ + |___ \ @ + ___) |@ + |____/ @ + @@ + __ @ + / /_ @ + | '_ \ @ + | (_) |@ + \___/ @ + @@ + _____ @ + |___ |@ + / / @ + / / @ + /_/ @ + @@ + ___ @ + ( _ ) @ + / _ \ @ + | (_) |@ + \___/ @ + @@ + ___ @ + / _ \ @ + | (_) |@ + \__, |@ + /_/ @ + @@ + @ + _ @ + (_)@ + _ @ + (_)@ + @@ + @ + _ @ + (_)@ + _ @ + ( )@ + |/ @@ + __@ + / /@ + / / @ + \ \ @ + \_\@ + @@ + @ + _____ @ + |_____|@ + |_____|@ + $ @ + @@ + __ @ + \ \ @ + \ \@ + / /@ + /_/ @ + @@ + ___ @ + |__ \@ + / /@ + |_| @ + (_) @ + @@ + ____ @ + / __ \ @ + / / _` |@ + | | (_| |@ + \ \__,_|@ + \____/ @@ + _ @ + / \ @ + / _ \ @ + / ___ \ @ + /_/ \_\@ + @@ + ____ @ + | __ ) @ + | _ \ @ + | |_) |@ + |____/ @ + @@ + ____ @ + / ___|@ + | | @ + | |___ @ + \____|@ + @@ + ____ @ + | _ \ @ + | | | |@ + | |_| |@ + |____/ @ + @@ + _____ @ + | ____|@ + | _| @ + | |___ @ + |_____|@ + @@ + _____ @ + | ___|@ + | |_ @ + | _| @ + |_| @ + @@ + ____ @ + / ___|@ + | | _ @ + | |_| |@ + \____|@ + @@ + _ _ @ + | | | |@ + | |_| |@ + | _ |@ + |_| |_|@ + @@ + ___ @ + |_ _|@ + | | @ + | | @ + |___|@ + @@ + _ @ + | |@ + _ | |@ + | |_| |@ + \___/ @ + @@ + _ __@ + | |/ /@ + | ' / @ + | . \ @ + |_|\_\@ + @@ + _ @ + | | @ + | | @ + | |___ @ + |_____|@ + @@ + __ __ @ + | \/ |@ + | |\/| |@ + | | | |@ + |_| |_|@ + @@ + _ _ @ + | \ | |@ + | \| |@ + | |\ |@ + |_| \_|@ + @@ + ___ @ + / _ \ @ + | | | |@ + | |_| |@ + \___/ @ + @@ + ____ @ + | _ \ @ + | |_) |@ + | __/ @ + |_| @ + @@ + ___ @ + / _ \ @ + | | | |@ + | |_| |@ + \__\_\@ + @@ + ____ @ + | _ \ @ + | |_) |@ + | _ < @ + |_| \_\@ + @@ + ____ @ + / ___| @ + \___ \ @ + ___) |@ + |____/ @ + @@ + _____ @ + |_ _|@ + | | @ + | | @ + |_| @ + @@ + _ _ @ + | | | |@ + | | | |@ + | |_| |@ + \___/ @ + @@ + __ __@ + \ \ / /@ + \ \ / / @ + \ V / @ + \_/ @ + @@ + __ __@ + \ \ / /@ + \ \ /\ / / @ + \ V V / @ + \_/\_/ @ + @@ + __ __@ + \ \/ /@ + \ / @ + / \ @ + /_/\_\@ + @@ + __ __@ + \ \ / /@ + \ V / @ + | | @ + |_| @ + @@ + _____@ + |__ /@ + / / @ + / /_ @ + /____|@ + @@ + __ @ + | _|@ + | | @ + | | @ + | | @ + |__|@@ + __ @ + \ \ @ + \ \ @ + \ \ @ + \_\@ + @@ + __ @ + |_ |@ + | |@ + | |@ + | |@ + |__|@@ + /\ @ + |/\|@ + $ @ + $ @ + $ @ + @@ + @ + @ + @ + @ + _____ @ + |_____|@@ + _ @ + ( )@ + \|@ + $ @ + $ @ + @@ + @ + __ _ @ + / _` |@ + | (_| |@ + \__,_|@ + @@ + _ @ + | |__ @ + | '_ \ @ + | |_) |@ + |_.__/ @ + @@ + @ + ___ @ + / __|@ + | (__ @ + \___|@ + @@ + _ @ + __| |@ + / _` |@ + | (_| |@ + \__,_|@ + @@ + @ + ___ @ + / _ \@ + | __/@ + \___|@ + @@ + __ @ + / _|@ + | |_ @ + | _|@ + |_| @ + @@ + @ + __ _ @ + / _` |@ + | (_| |@ + \__, |@ + |___/ @@ + _ @ + | |__ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @@ + _ @ + (_)@ + | |@ + | |@ + |_|@ + @@ + _ @ + (_)@ + | |@ + | |@ + _/ |@ + |__/ @@ + _ @ + | | __@ + | |/ /@ + | < @ + |_|\_\@ + @@ + _ @ + | |@ + | |@ + | |@ + |_|@ + @@ + @ + _ __ ___ @ + | '_ ` _ \ @ + | | | | | |@ + |_| |_| |_|@ + @@ + @ + _ __ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @@ + @ + ___ @ + / _ \ @ + | (_) |@ + \___/ @ + @@ + @ + _ __ @ + | '_ \ @ + | |_) |@ + | .__/ @ + |_| @@ + @ + __ _ @ + / _` |@ + | (_| |@ + \__, |@ + |_|@@ + @ + _ __ @ + | '__|@ + | | @ + |_| @ + @@ + @ + ___ @ + / __|@ + \__ \@ + |___/@ + @@ + _ @ + | |_ @ + | __|@ + | |_ @ + \__|@ + @@ + @ + _ _ @ + | | | |@ + | |_| |@ + \__,_|@ + @@ + @ + __ __@ + \ \ / /@ + \ V / @ + \_/ @ + @@ + @ + __ __@ + \ \ /\ / /@ + \ V V / @ + \_/\_/ @ + @@ + @ + __ __@ + \ \/ /@ + > < @ + /_/\_\@ + @@ + @ + _ _ @ + | | | |@ + | |_| |@ + \__, |@ + |___/ @@ + @ + ____@ + |_ /@ + / / @ + /___|@ + @@ + __@ + / /@ + | | @ + < < @ + | | @ + \_\@@ + _ @ + | |@ + | |@ + | |@ + | |@ + |_|@@ + __ @ + \ \ @ + | | @ + > >@ + | | @ + /_/ @@ + /\/|@ + |/\/ @ + $ @ + $ @ + $ @ + @@ + _ _ @ + (_)_(_)@ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ + _ _ @ + (_)_(_)@ + / _ \ @ + | |_| |@ + \___/ @ + @@ + _ _ @ + (_) (_)@ + | | | |@ + | |_| |@ + \___/ @ + @@ + _ _ @ + (_)_(_)@ + / _` |@ + | (_| |@ + \__,_|@ + @@ + _ _ @ + (_)_(_)@ + / _ \ @ + | (_) |@ + \___/ @ + @@ + _ _ @ + (_) (_)@ + | | | |@ + | |_| |@ + \__,_|@ + @@ + ___ @ + / _ \@ + | |/ /@ + | |\ \@ + | ||_/@ + |_| @@ +160 NO-BREAK SPACE + $@ + $@ + $@ + $@ + $@ + $@@ +161 INVERTED EXCLAMATION MARK + _ @ + (_)@ + | |@ + | |@ + |_|@ + @@ +162 CENT SIGN + _ @ + | | @ + / __)@ + | (__ @ + \ )@ + |_| @@ +163 POUND SIGN + ___ @ + / ,_\ @ + _| |_ @ + | |___ @ + (_,____|@ + @@ +164 CURRENCY SIGN + /\___/\@ + \ _ /@ + | (_) |@ + / ___ \@ + \/ \/@ + @@ +165 YEN SIGN + __ __ @ + \ V / @ + |__ __|@ + |__ __|@ + |_| @ + @@ +166 BROKEN BAR + _ @ + | |@ + |_|@ + _ @ + | |@ + |_|@@ +167 SECTION SIGN + __ @ + _/ _)@ + / \ \ @ + \ \\ \@ + \ \_/@ + (__/ @@ +168 DIAERESIS + _ _ @ + (_) (_)@ + $ $ @ + $ $ @ + $ $ @ + @@ +169 COPYRIGHT SIGN + _____ @ + / ___ \ @ + / / __| \ @ + | | (__ |@ + \ \___| / @ + \_____/ @@ +170 FEMININE ORDINAL INDICATOR + __ _ @ + / _` |@ + \__,_|@ + |____|@ + $ @ + @@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + ____@ + / / /@ + / / / @ + \ \ \ @ + \_\_\@ + @@ +172 NOT SIGN + @ + _____ @ + |___ |@ + |_|@ + $ @ + @@ +173 SOFT HYPHEN + @ + @ + ____ @ + |____|@ + $ @ + @@ +174 REGISTERED SIGN + _____ @ + / ___ \ @ + / | _ \ \ @ + | | / |@ + \ |_|_\ / @ + \_____/ @@ +175 MACRON + _____ @ + |_____|@ + $ @ + $ @ + $ @ + @@ +176 DEGREE SIGN + __ @ + / \ @ + | () |@ + \__/ @ + $ @ + @@ +177 PLUS-MINUS SIGN + _ @ + _| |_ @ + |_ _|@ + _|_|_ @ + |_____|@ + @@ +178 SUPERSCRIPT TWO + ___ @ + |_ )@ + / / @ + /___|@ + $ @ + @@ +179 SUPERSCRIPT THREE + ____@ + |__ /@ + |_ \@ + |___/@ + $ @ + @@ +180 ACUTE ACCENT + __@ + /_/@ + $ @ + $ @ + $ @ + @@ +181 MICRO SIGN + @ + _ _ @ + | | | |@ + | |_| |@ + | ._,_|@ + |_| @@ +182 PILCROW SIGN + _____ @ + / |@ + | (| | |@ + \__ | |@ + |_|_|@ + @@ +183 MIDDLE DOT + @ + _ @ + (_)@ + $ @ + $ @ + @@ +184 CEDILLA + @ + @ + @ + @ + _ @ + )_)@@ +185 SUPERSCRIPT ONE + _ @ + / |@ + | |@ + |_|@ + $ @ + @@ +186 MASCULINE ORDINAL INDICATOR + ___ @ + / _ \@ + \___/@ + |___|@ + $ @ + @@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + ____ @ + \ \ \ @ + \ \ \@ + / / /@ + /_/_/ @ + @@ +188 VULGAR FRACTION ONE QUARTER + _ __ @ + / | / / _ @ + | |/ / | | @ + |_/ /|_ _|@ + /_/ |_| @ + @@ +189 VULGAR FRACTION ONE HALF + _ __ @ + / | / /__ @ + | |/ /_ )@ + |_/ / / / @ + /_/ /___|@ + @@ +190 VULGAR FRACTION THREE QUARTERS + ____ __ @ + |__ / / / _ @ + |_ \/ / | | @ + |___/ /|_ _|@ + /_/ |_| @ + @@ +191 INVERTED QUESTION MARK + _ @ + (_) @ + | | @ + / /_ @ + \___|@ + @@ +192 LATIN CAPITAL LETTER A WITH GRAVE + __ @ + \_\ @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +193 LATIN CAPITAL LETTER A WITH ACUTE + __ @ + /_/ @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX + //\ @ + |/_\| @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +195 LATIN CAPITAL LETTER A WITH TILDE + /\/| @ + |/\/ @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS + _ _ @ + (_)_(_)@ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE + _ @ + (o) @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +198 LATIN CAPITAL LETTER AE + ______ @ + / ____|@ + / _ _| @ + / __ |___ @ + /_/ |_____|@ + @@ +199 LATIN CAPITAL LETTER C WITH CEDILLA + ____ @ + / ___|@ + | | @ + | |___ @ + \____|@ + )_) @@ +200 LATIN CAPITAL LETTER E WITH GRAVE + __ @ + _\_\_ @ + | ____|@ + | _|_ @ + |_____|@ + @@ +201 LATIN CAPITAL LETTER E WITH ACUTE + __ @ + _/_/_ @ + | ____|@ + | _|_ @ + |_____|@ + @@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX + //\ @ + |/_\| @ + | ____|@ + | _|_ @ + |_____|@ + @@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS + _ _ @ + (_)_(_)@ + | ____|@ + | _|_ @ + |_____|@ + @@ +204 LATIN CAPITAL LETTER I WITH GRAVE + __ @ + \_\ @ + |_ _|@ + | | @ + |___|@ + @@ +205 LATIN CAPITAL LETTER I WITH ACUTE + __ @ + /_/ @ + |_ _|@ + | | @ + |___|@ + @@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX + //\ @ + |/_\|@ + |_ _|@ + | | @ + |___|@ + @@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS + _ _ @ + (_)_(_)@ + |_ _| @ + | | @ + |___| @ + @@ +208 LATIN CAPITAL LETTER ETH + ____ @ + | _ \ @ + _| |_| |@ + |__ __| |@ + |____/ @ + @@ +209 LATIN CAPITAL LETTER N WITH TILDE + /\/|@ + |/\/ @ + | \| |@ + | .` |@ + |_|\_|@ + @@ +210 LATIN CAPITAL LETTER O WITH GRAVE + __ @ + \_\ @ + / _ \ @ + | |_| |@ + \___/ @ + @@ +211 LATIN CAPITAL LETTER O WITH ACUTE + __ @ + /_/ @ + / _ \ @ + | |_| |@ + \___/ @ + @@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX + //\ @ + |/_\| @ + / _ \ @ + | |_| |@ + \___/ @ + @@ +213 LATIN CAPITAL LETTER O WITH TILDE + /\/| @ + |/\/ @ + / _ \ @ + | |_| |@ + \___/ @ + @@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS + _ _ @ + (_)_(_)@ + / _ \ @ + | |_| |@ + \___/ @ + @@ +215 MULTIPLICATION SIGN + @ + @ + /\/\@ + > <@ + \/\/@ + @@ +216 LATIN CAPITAL LETTER O WITH STROKE + ____ @ + / _// @ + | |// |@ + | //| |@ + //__/ @ + @@ +217 LATIN CAPITAL LETTER U WITH GRAVE + __ @ + _\_\_ @ + | | | |@ + | |_| |@ + \___/ @ + @@ +218 LATIN CAPITAL LETTER U WITH ACUTE + __ @ + _/_/_ @ + | | | |@ + | |_| |@ + \___/ @ + @@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX + //\ @ + |/ \| @ + | | | |@ + | |_| |@ + \___/ @ + @@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ + | | | |@ + | |_| |@ + \___/ @ + @@ +221 LATIN CAPITAL LETTER Y WITH ACUTE + __ @ + __/_/__@ + \ \ / /@ + \ V / @ + |_| @ + @@ +222 LATIN CAPITAL LETTER THORN + _ @ + | |___ @ + | __ \@ + | ___/@ + |_| @ + @@ +223 LATIN SMALL LETTER SHARP S + ___ @ + / _ \@ + | |/ /@ + | |\ \@ + | ||_/@ + |_| @@ +224 LATIN SMALL LETTER A WITH GRAVE + __ @ + \_\_ @ + / _` |@ + | (_| |@ + \__,_|@ + @@ +225 LATIN SMALL LETTER A WITH ACUTE + __ @ + /_/_ @ + / _` |@ + | (_| |@ + \__,_|@ + @@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX + //\ @ + |/_\| @ + / _` |@ + | (_| |@ + \__,_|@ + @@ +227 LATIN SMALL LETTER A WITH TILDE + /\/| @ + |/\/_ @ + / _` |@ + | (_| |@ + \__,_|@ + @@ +228 LATIN SMALL LETTER A WITH DIAERESIS + _ _ @ + (_)_(_)@ + / _` |@ + | (_| |@ + \__,_|@ + @@ +229 LATIN SMALL LETTER A WITH RING ABOVE + __ @ + (()) @ + / _ '|@ + | (_| |@ + \__,_|@ + @@ +230 LATIN SMALL LETTER AE + @ + __ ____ @ + / _` _ \@ + | (_| __/@ + \__,____|@ + @@ +231 LATIN SMALL LETTER C WITH CEDILLA + @ + ___ @ + / __|@ + | (__ @ + \___|@ + )_) @@ +232 LATIN SMALL LETTER E WITH GRAVE + __ @ + \_\ @ + / _ \@ + | __/@ + \___|@ + @@ +233 LATIN SMALL LETTER E WITH ACUTE + __ @ + /_/ @ + / _ \@ + | __/@ + \___|@ + @@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX + //\ @ + |/_\|@ + / _ \@ + | __/@ + \___|@ + @@ +235 LATIN SMALL LETTER E WITH DIAERESIS + _ _ @ + (_)_(_)@ + / _ \ @ + | __/ @ + \___| @ + @@ +236 LATIN SMALL LETTER I WITH GRAVE + __ @ + \_\@ + | |@ + | |@ + |_|@ + @@ +237 LATIN SMALL LETTER I WITH ACUTE + __@ + /_/@ + | |@ + | |@ + |_|@ + @@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX + //\ @ + |/_\|@ + | | @ + | | @ + |_| @ + @@ +239 LATIN SMALL LETTER I WITH DIAERESIS + _ _ @ + (_)_(_)@ + | | @ + | | @ + |_| @ + @@ +240 LATIN SMALL LETTER ETH + /\/\ @ + > < @ + _\/\ |@ + / __` |@ + \____/ @ + @@ +241 LATIN SMALL LETTER N WITH TILDE + /\/| @ + |/\/ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @@ +242 LATIN SMALL LETTER O WITH GRAVE + __ @ + \_\ @ + / _ \ @ + | (_) |@ + \___/ @ + @@ +243 LATIN SMALL LETTER O WITH ACUTE + __ @ + /_/ @ + / _ \ @ + | (_) |@ + \___/ @ + @@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX + //\ @ + |/_\| @ + / _ \ @ + | (_) |@ + \___/ @ + @@ +245 LATIN SMALL LETTER O WITH TILDE + /\/| @ + |/\/ @ + / _ \ @ + | (_) |@ + \___/ @ + @@ +246 LATIN SMALL LETTER O WITH DIAERESIS + _ _ @ + (_)_(_)@ + / _ \ @ + | (_) |@ + \___/ @ + @@ +247 DIVISION SIGN + @ + _ @ + _(_)_ @ + |_____|@ + (_) @ + @@ +248 LATIN SMALL LETTER O WITH STROKE + @ + ____ @ + / _//\ @ + | (//) |@ + \//__/ @ + @@ +249 LATIN SMALL LETTER U WITH GRAVE + __ @ + _\_\_ @ + | | | |@ + | |_| |@ + \__,_|@ + @@ +250 LATIN SMALL LETTER U WITH ACUTE + __ @ + _/_/_ @ + | | | |@ + | |_| |@ + \__,_|@ + @@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX + //\ @ + |/ \| @ + | | | |@ + | |_| |@ + \__,_|@ + @@ +252 LATIN SMALL LETTER U WITH DIAERESIS + _ _ @ + (_) (_)@ + | | | |@ + | |_| |@ + \__,_|@ + @@ +253 LATIN SMALL LETTER Y WITH ACUTE + __ @ + _/_/_ @ + | | | |@ + | |_| |@ + \__, |@ + |___/ @@ +254 LATIN SMALL LETTER THORN + _ @ + | |__ @ + | '_ \ @ + | |_) |@ + | .__/ @ + |_| @@ +255 LATIN SMALL LETTER Y WITH DIAERESIS + _ _ @ + (_) (_)@ + | | | |@ + | |_| |@ + \__, |@ + |___/ @@ +0x0100 LATIN CAPITAL LETTER A WITH MACRON + ____ @ + /___/ @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +0x0101 LATIN SMALL LETTER A WITH MACRON + ___ @ + /_ _/@ + / _` |@ + | (_| |@ + \__,_|@ + @@ +0x0102 LATIN CAPITAL LETTER A WITH BREVE + _ _ @ + \\_// @ + /_\ @ + / _ \ @ + /_/ \_\@ + @@ +0x0103 LATIN SMALL LETTER A WITH BREVE + \_/ @ + ___ @ + / _` |@ + | (_| |@ + \__,_|@ + @@ +0x0104 LATIN CAPITAL LETTER A WITH OGONEK + @ + _ @ + /_\ @ + / _ \ @ + /_/ \_\@ + (_(@@ +0x0105 LATIN SMALL LETTER A WITH OGONEK + @ + __ _ @ + / _` |@ + | (_| |@ + \__,_|@ + (_(@@ +0x0106 LATIN CAPITAL LETTER C WITH ACUTE + __ @ + _/_/ @ + / ___|@ + | |___ @ + \____|@ + @@ +0x0107 LATIN SMALL LETTER C WITH ACUTE + __ @ + /__/@ + / __|@ + | (__ @ + \___|@ + @@ +0x0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX + /\ @ + _//\\@ + / ___|@ + | |___ @ + \____|@ + @@ +0x0109 LATIN SMALL LETTER C WITH CIRCUMFLEX + /\ @ + /_\ @ + / __|@ + | (__ @ + \___|@ + @@ +0x010A LATIN CAPITAL LETTER C WITH DOT ABOVE + [] @ + ____ @ + / ___|@ + | |___ @ + \____|@ + @@ +0x010B LATIN SMALL LETTER C WITH DOT ABOVE + [] @ + ___ @ + / __|@ + | (__ @ + \___|@ + @@ +0x010C LATIN CAPITAL LETTER C WITH CARON + \\// @ + _\/_ @ + / ___|@ + | |___ @ + \____|@ + @@ +0x010D LATIN SMALL LETTER C WITH CARON + \\//@ + _\/ @ + / __|@ + | (__ @ + \___|@ + @@ +0x010E LATIN CAPITAL LETTER D WITH CARON + \\// @ + __\/ @ + | _ \ @ + | |_| |@ + |____/ @ + @@ +0x010F LATIN SMALL LETTER D WITH CARON + \/ _ @ + __| |@ + / _` |@ + | (_| |@ + \__,_|@ + @@ +0x0110 LATIN CAPITAL LETTER D WITH STROKE + ____ @ + |_ __ \ @ + /| |/ | |@ + /|_|/_| |@ + |_____/ @ + @@ +0x0111 LATIN SMALL LETTER D WITH STROKE + ---|@ + __| |@ + / _` |@ + | (_| |@ + \__,_|@ + @@ +0x0112 LATIN CAPITAL LETTER E WITH MACRON + ____ @ + /___/ @ + | ____|@ + | _|_ @ + |_____|@ + @@ +0x0113 LATIN SMALL LETTER E WITH MACRON + ____@ + /_ _/@ + / _ \ @ + | __/ @ + \___| @ + @@ +0x0114 LATIN CAPITAL LETTER E WITH BREVE + _ _ @ + \\_// @ + | ____|@ + | _|_ @ + |_____|@ + @@ +0x0115 LATIN SMALL LETTER E WITH BREVE + \\ //@ + -- @ + / _ \ @ + | __/ @ + \___| @ + @@ +0x0116 LATIN CAPITAL LETTER E WITH DOT ABOVE + [] @ + _____ @ + | ____|@ + | _|_ @ + |_____|@ + @@ +0x0117 LATIN SMALL LETTER E WITH DOT ABOVE + [] @ + __ @ + / _ \@ + | __/@ + \___|@ + @@ +0x0118 LATIN CAPITAL LETTER E WITH OGONEK + @ + _____ @ + | ____|@ + | _|_ @ + |_____|@ + (__(@@ +0x0119 LATIN SMALL LETTER E WITH OGONEK + @ + ___ @ + / _ \@ + | __/@ + \___|@ + (_(@@ +0x011A LATIN CAPITAL LETTER E WITH CARON + \\// @ + __\/_ @ + | ____|@ + | _|_ @ + |_____|@ + @@ +0x011B LATIN SMALL LETTER E WITH CARON + \\//@ + \/ @ + / _ \@ + | __/@ + \___|@ + @@ +0x011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX + _/\_ @ + / ___|@ + | | _ @ + | |_| |@ + \____|@ + @@ +0x011D LATIN SMALL LETTER G WITH CIRCUMFLEX + /\ @ + _/_ \@ + / _` |@ + | (_| |@ + \__, |@ + |___/ @@ +0x011E LATIN CAPITAL LETTER G WITH BREVE + _\/_ @ + / ___|@ + | | _ @ + | |_| |@ + \____|@ + @@ +0x011F LATIN SMALL LETTER G WITH BREVE + \___/ @ + __ _ @ + / _` |@ + | (_| |@ + \__, |@ + |___/ @@ +0x0120 LATIN CAPITAL LETTER G WITH DOT ABOVE + _[]_ @ + / ___|@ + | | _ @ + | |_| |@ + \____|@ + @@ +0x0121 LATIN SMALL LETTER G WITH DOT ABOVE + [] @ + __ _ @ + / _` |@ + | (_| |@ + \__, |@ + |___/ @@ +0x0122 LATIN CAPITAL LETTER G WITH CEDILLA + ____ @ + / ___|@ + | | _ @ + | |_| |@ + \____|@ + )__) @@ +0x0123 LATIN SMALL LETTER G WITH CEDILLA + @ + __ _ @ + / _` |@ + | (_| |@ + \__, |@ + |_))))@@ +0x0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX + _/ \_ @ + | / \ |@ + | |_| |@ + | _ |@ + |_| |_|@ + @@ +0x0125 LATIN SMALL LETTER H WITH CIRCUMFLEX + _ /\ @ + | |//\ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @@ +0x0126 LATIN CAPITAL LETTER H WITH STROKE + _ _ @ + | |=| |@ + | |_| |@ + | _ |@ + |_| |_|@ + @@ +0x0127 LATIN SMALL LETTER H WITH STROKE + _ @ + |=|__ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @@ +0x0128 LATIN CAPITAL LETTER I WITH TILDE + /\//@ + |_ _|@ + | | @ + | | @ + |___|@ + @@ +0x0129 LATIN SMALL LETTER I WITH TILDE + @ + /\/@ + | |@ + | |@ + |_|@ + @@ +0x012A LATIN CAPITAL LETTER I WITH MACRON + /___/@ + |_ _|@ + | | @ + | | @ + |___|@ + @@ +0x012B LATIN SMALL LETTER I WITH MACRON + ____@ + /___/@ + | | @ + | | @ + |_| @ + @@ +0x012C LATIN CAPITAL LETTER I WITH BREVE + \__/@ + |_ _|@ + | | @ + | | @ + |___|@ + @@ +0x012D LATIN SMALL LETTER I WITH BREVE + @ + \_/@ + | |@ + | |@ + |_|@ + @@ +0x012E LATIN CAPITAL LETTER I WITH OGONEK + ___ @ + |_ _|@ + | | @ + | | @ + |___|@ + (__(@@ +0x012F LATIN SMALL LETTER I WITH OGONEK + _ @ + (_) @ + | | @ + | | @ + |_|_@ + (_(@@ +0x0130 LATIN CAPITAL LETTER I WITH DOT ABOVE + _[] @ + |_ _|@ + | | @ + | | @ + |___|@ + @@ +0x0131 LATIN SMALL LETTER DOTLESS I + @ + _ @ + | |@ + | |@ + |_|@ + @@ +0x0132 LATIN CAPITAL LIGATURE IJ + ___ _ @ + |_ _|| |@ + | | | |@ + | |_| |@ + |__|__/ @ + @@ +0x0133 LATIN SMALL LIGATURE IJ + _ _ @ + (_) (_)@ + | | | |@ + | | | |@ + |_|_/ |@ + |__/ @@ +0x0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX + /\ @ + /_\|@ + _ | | @ + | |_| | @ + \___/ @ + @@ +0x0135 LATIN SMALL LETTER J WITH CIRCUMFLEX + /\@ + /_\@ + | |@ + | |@ + _/ |@ + |__/ @@ +0x0136 LATIN CAPITAL LETTER K WITH CEDILLA + _ _ @ + | |/ / @ + | ' / @ + | . \ @ + |_|\_\ @ + )__)@@ +0x0137 LATIN SMALL LETTER K WITH CEDILLA + _ @ + | | __@ + | |/ /@ + | < @ + |_|\_\@ + )_)@@ +0x0138 LATIN SMALL LETTER KRA + @ + _ __ @ + | |/ \@ + | < @ + |_|\_\@ + @@ +0x0139 LATIN CAPITAL LETTER L WITH ACUTE + _ //@ + | | // @ + | | @ + | |___ @ + |_____|@ + @@ +0x013A LATIN SMALL LETTER L WITH ACUTE + //@ + | |@ + | |@ + | |@ + |_|@ + @@ +0x013B LATIN CAPITAL LETTER L WITH CEDILLA + _ @ + | | @ + | | @ + | |___ @ + |_____|@ + )__)@@ +0x013C LATIN SMALL LETTER L WITH CEDILLA + _ @ + | | @ + | | @ + | | @ + |_| @ + )_)@@ +0x013D LATIN CAPITAL LETTER L WITH CARON + _ \\//@ + | | \/ @ + | | @ + | |___ @ + |_____|@ + @@ +0x013E LATIN SMALL LETTER L WITH CARON + _ \\//@ + | | \/ @ + | | @ + | | @ + |_| @ + @@ +0x013F LATIN CAPITAL LETTER L WITH MIDDLE DOT + _ @ + | | @ + | | [] @ + | |___ @ + |_____|@ + @@ +0x0140 LATIN SMALL LETTER L WITH MIDDLE DOT + _ @ + | | @ + | | []@ + | | @ + |_| @ + @@ +0x0141 LATIN CAPITAL LETTER L WITH STROKE + __ @ + | // @ + |//| @ + // |__ @ + |_____|@ + @@ +0x0142 LATIN SMALL LETTER L WITH STROKE + _ @ + | |@ + |//@ + //|@ + |_|@ + @@ +0x0143 LATIN CAPITAL LETTER N WITH ACUTE + _/ /_ @ + | \ | |@ + | \| |@ + | |\ |@ + |_| \_|@ + @@ +0x0144 LATIN SMALL LETTER N WITH ACUTE + _ @ + _ /_/ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @@ +0x0145 LATIN CAPITAL LETTER N WITH CEDILLA + _ _ @ + | \ | |@ + | \| |@ + | |\ |@ + |_| \_|@ + )_) @@ +0x0146 LATIN SMALL LETTER N WITH CEDILLA + @ + _ __ @ + | '_ \ @ + | | | |@ + |_| |_|@ + )_) @@ +0x0147 LATIN CAPITAL LETTER N WITH CARON + _\/ _ @ + | \ | |@ + | \| |@ + | |\ |@ + |_| \_|@ + @@ +0x0148 LATIN SMALL LETTER N WITH CARON + \\// @ + _\/_ @ + | '_ \ @ + | | | |@ + |_| |_|@ + @@ +0x0149 LATIN SMALL LETTER N PRECEDED BY APOSTROPHE + @ + _ __ @ + ( )| '_\ @ + |/| | | |@ + |_| |_|@ + @@ +0x014A LATIN CAPITAL LETTER ENG + _ _ @ + | \ | |@ + | \| |@ + | |\ |@ + |_| \ |@ + )_)@@ +0x014B LATIN SMALL LETTER ENG + _ __ @ + | '_ \ @ + | | | |@ + |_| | |@ + | |@ + |__ @@ +0x014C LATIN CAPITAL LETTER O WITH MACRON + ____ @ + /_ _/ @ + / _ \ @ + | (_) |@ + \___/ @ + @@ +0x014D LATIN SMALL LETTER O WITH MACRON + ____ @ + /_ _/ @ + / _ \ @ + | (_) |@ + \___/ @ + @@ +0x014E LATIN CAPITAL LETTER O WITH BREVE + \ / @ + _-_ @ + / _ \ @ + | |_| |@ + \___/ @ + @@ +0x014F LATIN SMALL LETTER O WITH BREVE + \ / @ + _-_ @ + / _ \ @ + | |_| |@ + \___/ @ + @@ +0x0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + ___ @ + /_/_/@ + / _ \ @ + | |_| |@ + \___/ @ + @@ +0x0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE + ___ @ + /_/_/@ + / _ \ @ + | |_| |@ + \___/ @ + @@ +0x0152 LATIN CAPITAL LIGATURE OE + ___ ___ @ + / _ \| __|@ + | | | | | @ + | |_| | |__@ + \___/|____@ + @@ +0x0153 LATIN SMALL LIGATURE OE + @ + ___ ___ @ + / _ \ / _ \@ + | (_) | __/@ + \___/ \___|@ + @@ +0x0154 LATIN CAPITAL LETTER R WITH ACUTE + _/_/ @ + | _ \ @ + | |_) |@ + | _ < @ + |_| \_\@ + @@ +0x0155 LATIN SMALL LETTER R WITH ACUTE + __@ + _ /_/@ + | '__|@ + | | @ + |_| @ + @@ +0x0156 LATIN CAPITAL LETTER R WITH CEDILLA + ____ @ + | _ \ @ + | |_) |@ + | _ < @ + |_| \_\@ + )_) @@ +0x0157 LATIN SMALL LETTER R WITH CEDILLA + @ + _ __ @ + | '__|@ + | | @ + |_| @ + )_) @@ +0x0158 LATIN CAPITAL LETTER R WITH CARON + _\_/ @ + | _ \ @ + | |_) |@ + | _ < @ + |_| \_\@ + @@ +0x0159 LATIN SMALL LETTER R WITH CARON + \\// @ + _\/_ @ + | '__|@ + | | @ + |_| @ + @@ +0x015A LATIN CAPITAL LETTER S WITH ACUTE + _/_/ @ + / ___| @ + \___ \ @ + ___) |@ + |____/ @ + @@ +0x015B LATIN SMALL LETTER S WITH ACUTE + __@ + _/_/@ + / __|@ + \__ \@ + |___/@ + @@ +0x015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX + _/\_ @ + / ___| @ + \___ \ @ + ___) |@ + |____/ @ + @@ +0x015D LATIN SMALL LETTER S WITH CIRCUMFLEX + @ + /_\_@ + / __|@ + \__ \@ + |___/@ + @@ +0x015E LATIN CAPITAL LETTER S WITH CEDILLA + ____ @ + / ___| @ + \___ \ @ + ___) |@ + |____/ @ + )__)@@ +0x015F LATIN SMALL LETTER S WITH CEDILLA + @ + ___ @ + / __|@ + \__ \@ + |___/@ + )_)@@ +0x0160 LATIN CAPITAL LETTER S WITH CARON + _\_/ @ + / ___| @ + \___ \ @ + ___) |@ + |____/ @ + @@ +0x0161 LATIN SMALL LETTER S WITH CARON + \\//@ + _\/ @ + / __|@ + \__ \@ + |___/@ + @@ +0x0162 LATIN CAPITAL LETTER T WITH CEDILLA + _____ @ + |_ _|@ + | | @ + | | @ + |_| @ + )__)@@ +0x0163 LATIN SMALL LETTER T WITH CEDILLA + _ @ + | |_ @ + | __|@ + | |_ @ + \__|@ + )_)@@ +0x0164 LATIN CAPITAL LETTER T WITH CARON + _____ @ + |_ _|@ + | | @ + | | @ + |_| @ + @@ +0x0165 LATIN SMALL LETTER T WITH CARON + \/ @ + | |_ @ + | __|@ + | |_ @ + \__|@ + @@ +0x0166 LATIN CAPITAL LETTER T WITH STROKE + _____ @ + |_ _|@ + | | @ + -|-|- @ + |_| @ + @@ +0x0167 LATIN SMALL LETTER T WITH STROKE + _ @ + | |_ @ + | __|@ + |-|_ @ + \__|@ + @@ +0x0168 LATIN CAPITAL LETTER U WITH TILDE + @ + _/\/_ @ + | | | |@ + | |_| |@ + \___/ @ + @@ +0x0169 LATIN SMALL LETTER U WITH TILDE + @ + _/\/_ @ + | | | |@ + | |_| |@ + \__,_|@ + @@ +0x016A LATIN CAPITAL LETTER U WITH MACRON + ____ @ + /__ _/@ + | | | |@ + | |_| |@ + \___/ @ + @@ +0x016B LATIN SMALL LETTER U WITH MACRON + ____ @ + / _ /@ + | | | |@ + | |_| |@ + \__,_|@ + @@ +0x016C LATIN CAPITAL LETTER U WITH BREVE + @ + \_/_ @ + | | | |@ + | |_| |@ + \____|@ + @@ +0x016D LATIN SMALL LETTER U WITH BREVE + @ + \_/_ @ + | | | |@ + | |_| |@ + \__,_|@ + @@ +0x016E LATIN CAPITAL LETTER U WITH RING ABOVE + O @ + __ _ @ + | | | |@ + | |_| |@ + \___/ @ + @@ +0x016F LATIN SMALL LETTER U WITH RING ABOVE + O @ + __ __ @ + | | | |@ + | |_| |@ + \__,_|@ + @@ +0x0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + -- --@ + /_//_/@ + | | | |@ + | |_| |@ + \___/ @ + @@ +0x0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE + ____@ + _/_/_/@ + | | | |@ + | |_| |@ + \__,_|@ + @@ +0x0172 LATIN CAPITAL LETTER U WITH OGONEK + _ _ @ + | | | |@ + | | | |@ + | |_| |@ + \___/ @ + (__(@@ +0x0173 LATIN SMALL LETTER U WITH OGONEK + @ + _ _ @ + | | | |@ + | |_| |@ + \__,_|@ + (_(@@ +0x0174 LATIN CAPITAL LETTER W WITH CIRCUMFLEX + __ /\ __@ + \ \ //\\/ /@ + \ \ /\ / / @ + \ V V / @ + \_/\_/ @ + @@ +0x0175 LATIN SMALL LETTER W WITH CIRCUMFLEX + /\ @ + __ //\\__@ + \ \ /\ / /@ + \ V V / @ + \_/\_/ @ + @@ +0x0176 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX + /\ @ + __//\\ @ + \ \ / /@ + \ V / @ + |_| @ + @@ +0x0177 LATIN SMALL LETTER Y WITH CIRCUMFLEX + /\ @ + //\\ @ + | | | |@ + | |_| |@ + \__, |@ + |___/ @@ +0x0178 LATIN CAPITAL LETTER Y WITH DIAERESIS + [] []@ + __ _@ + \ \ / /@ + \ V / @ + |_| @ + @@ +0x0179 LATIN CAPITAL LETTER Z WITH ACUTE + __/_/@ + |__ /@ + / / @ + / /_ @ + /____|@ + @@ +0x017A LATIN SMALL LETTER Z WITH ACUTE + _ @ + _/_/@ + |_ /@ + / / @ + /___|@ + @@ +0x017B LATIN CAPITAL LETTER Z WITH DOT ABOVE + __[]_@ + |__ /@ + / / @ + / /_ @ + /____|@ + @@ +0x017C LATIN SMALL LETTER Z WITH DOT ABOVE + [] @ + ____@ + |_ /@ + / / @ + /___|@ + @@ +0x017D LATIN CAPITAL LETTER Z WITH CARON + _\_/_@ + |__ /@ + / / @ + / /_ @ + /____|@ + @@ +0x017E LATIN SMALL LETTER Z WITH CARON + \\//@ + _\/_@ + |_ /@ + / / @ + /___|@ + @@ +0x017F LATIN SMALL LETTER LONG S + __ @ + / _|@ + |-| | @ + |-| | @ + |_| @ + @@ +0x02C7 CARON + \\//@ + \/ @ + $@ + $@ + $@ + $@@ +0x02D8 BREVE + \\_//@ + \_/ @ + $@ + $@ + $@ + $@@ +0x02D9 DOT ABOVE + []@ + $@ + $@ + $@ + $@ + $@@ +0x02DB OGONEK + $@ + $@ + $@ + $@ + $@ + )_) @@ +0x02DD DOUBLE ACUTE ACCENT + _ _ @ + /_/_/@ + $@ + $@ + $@ + $@@ diff --git a/cosmic rage/fonts/term.flf b/cosmic rage/fonts/term.flf new file mode 100644 index 0000000..e27d01e --- /dev/null +++ b/cosmic rage/fonts/term.flf @@ -0,0 +1,600 @@ +flf2a 1 1 2 -1 13 0 0 242 +Terminal by Glenn Chappell 4/93 +Includes characters 128-255 +Enhanced for Latin-2,3,4 by John Cowan +Latin character sets supported only if your screen font does +figlet release 2.2 -- November 1996 +Permission is hereby given to modify this font, as long as the +modifier's name is placed on a comment line. + +Double-checked by Paul Burton 12/96. Added the new +parameter supported by FIGlet and FIGWin. Unlike all other FIGfonts, this one +is intended to produce output exactly the same as the input unless a control +file is used. Therefore it produces the SAME output for smush, kern or fit. + +@ +!@ +"@ +#@ +$@ +%@ +&@ +'@ +(@ +)@ +*@ ++@ +,@ +-@ +.@ +/@ +0@ +1@ +2@ +3@ +4@ +5@ +6@ +7@ +8@ +9@ +:@ +;@ +<@ +=@ +>@ +?@ +@# +A@ +B@ +C@ +D@ +E@ +F@ +G@ +H@ +I@ +J@ +K@ +L@ +M@ +N@ +O@ +P@ +Q@ +R@ +S@ +T@ +U@ +V@ +W@ +X@ +Y@ +Z@ +[@ +\@ +]@ +^@ +_@ +`@ +a@ +b@ +c@ +d@ +e@ +f@ +g@ +h@ +i@ +j@ +k@ +l@ +m@ +n@ +o@ +p@ +q@ +r@ +s@ +t@ +u@ +v@ +w@ +x@ +y@ +z@ +{@ +|@ +}@ +~@ +@ +@ +@ +@ +@ +@ +@ +128 +@ +129 +@ +130 +@ +131 +@ +132 +@ +133 +@ +134 +@ +135 +@ +136 +@ +137 +@ +138 +@ +139 +@ +140 +@ +141 +@ +142 +@ +143 +@ +144 +@ +145 +@ +146 +@ +147 +@ +148 +@ +149 +@ +150 +@ +151 +@ +152 +@ +153 +@ +154 +@ +155 +@ +156 +@ +157 +@ +158 +@ +159 +@ +160 NO-BREAK SPACE +@ +161 INVERTED EXCLAMATION MARK +@ +162 CENT SIGN +@ +163 POUND SIGN +@ +164 CURRENCY SIGN +@ +165 YEN SIGN +@ +166 BROKEN BAR +@ +167 SECTION SIGN +@ +168 DIAERESIS +@ +169 COPYRIGHT SIGN +@ +170 FEMININE ORDINAL INDICATOR +@ +171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +@ +172 NOT SIGN +@ +173 SOFT HYPHEN +@ +174 REGISTERED SIGN +@ +175 MACRON +@ +176 DEGREE SIGN +@ +177 PLUS-MINUS SIGN +@ +178 SUPERSCRIPT TWO +@ +179 SUPERSCRIPT THREE +@ +180 ACUTE ACCENT +@ +181 MICRO SIGN +@ +182 PILCROW SIGN +@ +183 MIDDLE DOT +@ +184 CEDILLA +@ +185 SUPERSCRIPT ONE +@ +186 MASCULINE ORDINAL INDICATOR +@ +187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +@ +188 VULGAR FRACTION ONE QUARTER +@ +189 VULGAR FRACTION ONE HALF +@ +190 VULGAR FRACTION THREE QUARTERS +@ +191 INVERTED QUESTION MARK +@ +192 LATIN CAPITAL LETTER A WITH GRAVE +@ +193 LATIN CAPITAL LETTER A WITH ACUTE +@ +194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX +@ +195 LATIN CAPITAL LETTER A WITH TILDE +@ +196 LATIN CAPITAL LETTER A WITH DIAERESIS +@ +197 LATIN CAPITAL LETTER A WITH RING ABOVE +@ +198 LATIN CAPITAL LETTER AE +@ +199 LATIN CAPITAL LETTER C WITH CEDILLA +@ +200 LATIN CAPITAL LETTER E WITH GRAVE +@ +201 LATIN CAPITAL LETTER E WITH ACUTE +@ +202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX +@ +203 LATIN CAPITAL LETTER E WITH DIAERESIS +@ +204 LATIN CAPITAL LETTER I WITH GRAVE +@ +205 LATIN CAPITAL LETTER I WITH ACUTE +@ +206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX +@ +207 LATIN CAPITAL LETTER I WITH DIAERESIS +@ +208 LATIN CAPITAL LETTER ETH +@ +209 LATIN CAPITAL LETTER N WITH TILDE +@ +210 LATIN CAPITAL LETTER O WITH GRAVE +@ +211 LATIN CAPITAL LETTER O WITH ACUTE +@ +212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX +@ +213 LATIN CAPITAL LETTER O WITH TILDE +@ +214 LATIN CAPITAL LETTER O WITH DIAERESIS +@ +215 MULTIPLICATION SIGN +@ +216 LATIN CAPITAL LETTER O WITH STROKE +@ +217 LATIN CAPITAL LETTER U WITH GRAVE +@ +218 LATIN CAPITAL LETTER U WITH ACUTE +@ +219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX +@ +220 LATIN CAPITAL LETTER U WITH DIAERESIS +@ +221 LATIN CAPITAL LETTER Y WITH ACUTE +@ +222 LATIN CAPITAL LETTER THORN +@ +223 LATIN SMALL LETTER SHARP S +@ +224 LATIN SMALL LETTER A WITH GRAVE +@ +225 LATIN SMALL LETTER A WITH ACUTE +@ +226 LATIN SMALL LETTER A WITH CIRCUMFLEX +@ +227 LATIN SMALL LETTER A WITH TILDE +@ +228 LATIN SMALL LETTER A WITH DIAERESIS +@ +229 LATIN SMALL LETTER A WITH RING ABOVE +@ +230 LATIN SMALL LETTER AE +@ +231 LATIN SMALL LETTER C WITH CEDILLA +@ +232 LATIN SMALL LETTER E WITH GRAVE +@ +233 LATIN SMALL LETTER E WITH ACUTE +@ +234 LATIN SMALL LETTER E WITH CIRCUMFLEX +@ +235 LATIN SMALL LETTER E WITH DIAERESIS +@ +236 LATIN SMALL LETTER I WITH GRAVE +@ +237 LATIN SMALL LETTER I WITH ACUTE +@ +238 LATIN SMALL LETTER I WITH CIRCUMFLEX +@ +239 LATIN SMALL LETTER I WITH DIAERESIS +@ +240 LATIN SMALL LETTER ETH +@ +241 LATIN SMALL LETTER N WITH TILDE +@ +242 LATIN SMALL LETTER O WITH GRAVE +@ +243 LATIN SMALL LETTER O WITH ACUTE +@ +244 LATIN SMALL LETTER O WITH CIRCUMFLEX +@ +245 LATIN SMALL LETTER O WITH TILDE +@ +246 LATIN SMALL LETTER O WITH DIAERESIS +@ +247 DIVISION SIGN +@ +248 LATIN SMALL LETTER O WITH STROKE +@ +249 LATIN SMALL LETTER U WITH GRAVE +@ +250 LATIN SMALL LETTER U WITH ACUTE +@ +251 LATIN SMALL LETTER U WITH CIRCUMFLEX +@ +252 LATIN SMALL LETTER U WITH DIAERESIS +@ +253 LATIN SMALL LETTER Y WITH ACUTE +@ +254 LATIN SMALL LETTER THORN +@ +255 LATIN SMALL LETTER Y WITH DIAERESIS +@ +0x0100 LATIN CAPITAL LETTER A WITH MACRON +@ +0x0101 LATIN SMALL LETTER A WITH MACRON +@ +0x0102 LATIN CAPITAL LETTER A WITH BREVE +@ +0x0103 LATIN SMALL LETTER A WITH BREVE +@ +0x0104 LATIN CAPITAL LETTER A WITH OGONEK +@ +0x0105 LATIN SMALL LETTER A WITH OGONEK +@ +0x0106 LATIN CAPITAL LETTER C WITH ACUTE +@ +0x0107 LATIN SMALL LETTER C WITH ACUTE +@ +0x0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX +@ +0x0109 LATIN SMALL LETTER C WITH CIRCUMFLEX +@ +0x010A LATIN CAPITAL LETTER C WITH DOT ABOVE +@ +0x010B LATIN SMALL LETTER C WITH DOT ABOVE +@ +0x010C LATIN CAPITAL LETTER C WITH CARON +@ +0x010D LATIN SMALL LETTER C WITH CARON +@ +0x010E LATIN CAPITAL LETTER D WITH CARON +@ +0x010F LATIN SMALL LETTER D WITH CARON +@ +0x0110 LATIN CAPITAL LETTER D WITH STROKE +@ +0x0111 LATIN SMALL LETTER D WITH STROKE +@ +0x0112 LATIN CAPITAL LETTER E WITH MACRON +@ +0x0113 LATIN SMALL LETTER E WITH MACRON +@ +0x0116 LATIN CAPITAL LETTER E WITH DOT ABOVE +@ +0x0117 LATIN SMALL LETTER E WITH DOT ABOVE +@ +0x0118 LATIN CAPITAL LETTER E WITH OGONEK +@ +0x0119 LATIN SMALL LETTER E WITH OGONEK +@ +0x011A LATIN CAPITAL LETTER E WITH CARON +@ +0x011B LATIN SMALL LETTER E WITH CARON +@ +0x011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX +@ +0x011D LATIN SMALL LETTER G WITH CIRCUMFLEX +@ +0x011E LATIN CAPITAL LETTER G WITH BREVE +@ +0x011F LATIN SMALL LETTER G WITH BREVE +@ +0x0120 LATIN CAPITAL LETTER G WITH DOT ABOVE +@ +0x0121 LATIN SMALL LETTER G WITH DOT ABOVE +@ +0x0122 LATIN CAPITAL LETTER G WITH CEDILLA +@ +0x0123 LATIN SMALL LETTER G WITH CEDILLA +@ +0x0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX +@ +0x0125 LATIN SMALL LETTER H WITH CIRCUMFLEX +@ +0x0126 LATIN CAPITAL LETTER H WITH STROKE +@ +0x0127 LATIN SMALL LETTER H WITH STROKE +@ +0x0128 LATIN CAPITAL LETTER I WITH TILDE +@ +0x0129 LATIN SMALL LETTER I WITH TILDE +@ +0x012A LATIN CAPITAL LETTER I WITH MACRON +@ +0x012B LATIN SMALL LETTER I WITH MACRON +@ +0x012E LATIN CAPITAL LETTER I WITH OGONEK +@ +0x012F LATIN SMALL LETTER I WITH OGONEK +@ +0x0130 LATIN CAPITAL LETTER I WITH DOT ABOVE +@ +0x0131 LATIN SMALL LETTER DOTLESS I +@ +0x0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX +@ +0x0135 LATIN SMALL LETTER J WITH CIRCUMFLEX +@ +0x0136 LATIN CAPITAL LETTER K WITH CEDILLA +@ +0x0137 LATIN SMALL LETTER K WITH CEDILLA +@ +0x0138 LATIN SMALL LETTER KRA +@ +0x0139 LATIN CAPITAL LETTER L WITH ACUTE +@ +0x013A LATIN SMALL LETTER L WITH ACUTE +@ +0x013B LATIN CAPITAL LETTER L WITH CEDILLA +@ +0x013C LATIN SMALL LETTER L WITH CEDILLA +@ +0x013D LATIN CAPITAL LETTER L WITH CARON +@ +0x013E LATIN SMALL LETTER L WITH CARON +@ +0x0141 LATIN CAPITAL LETTER L WITH STROKE +@ +0x0142 LATIN SMALL LETTER L WITH STROKE +@ +0x0143 LATIN CAPITAL LETTER N WITH ACUTE +@ +0x0144 LATIN SMALL LETTER N WITH ACUTE +@ +0x0145 LATIN CAPITAL LETTER N WITH CEDILLA +@ +0x0146 LATIN SMALL LETTER N WITH CEDILLA +@ +0x0147 LATIN CAPITAL LETTER N WITH CARON +@ +0x0148 LATIN SMALL LETTER N WITH CARON +@ +0x014A LATIN CAPITAL LETTER ENG +@ +0x014B LATIN SMALL LETTER ENG +@ +0x014C LATIN CAPITAL LETTER O WITH MACRON +@ +0x014D LATIN SMALL LETTER O WITH MACRON +@ +0x0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +@ +0x0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE +@ +0x0154 LATIN CAPITAL LETTER R WITH ACUTE +@ +0x0155 LATIN SMALL LETTER R WITH ACUTE +@ +0x0156 LATIN CAPITAL LETTER R WITH CEDILLA +@ +0x0157 LATIN SMALL LETTER R WITH CEDILLA +@ +0x0158 LATIN CAPITAL LETTER R WITH CARON +@ +0x0159 LATIN SMALL LETTER R WITH CARON +@ +0x015A LATIN CAPITAL LETTER S WITH ACUTE +@ +0x015B LATIN SMALL LETTER S WITH ACUTE +@ +0x015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX +@ +0x015D LATIN SMALL LETTER S WITH CIRCUMFLEX +@ +0x015E LATIN CAPITAL LETTER S WITH CEDILLA +@ +0x015F LATIN SMALL LETTER S WITH CEDILLA +@ +0x0160 LATIN CAPITAL LETTER S WITH CARON +@ +0x0161 LATIN SMALL LETTER S WITH CARON +@ +0x0162 LATIN CAPITAL LETTER T WITH CEDILLA +@ +0x0163 LATIN SMALL LETTER T WITH CEDILLA +@ +0x0164 LATIN CAPITAL LETTER T WITH CARON +@ +0x0165 LATIN SMALL LETTER T WITH CARON +@ +0x0166 LATIN CAPITAL LETTER T WITH STROKE +@ +0x0167 LATIN SMALL LETTER T WITH STROKE +@ +0x0168 LATIN CAPITAL LETTER U WITH TILDE +@ +0x0169 LATIN SMALL LETTER U WITH TILDE +@ +0x016A LATIN CAPITAL LETTER U WITH MACRON +@ +0x016B LATIN SMALL LETTER U WITH MACRON +@ +0x016C LATIN CAPITAL LETTER U WITH BREVE +@ +0x016D LATIN SMALL LETTER U WITH BREVE +@ +0x016E LATIN CAPITAL LETTER U WITH RING ABOVE +@ +0x016F LATIN SMALL LETTER U WITH RING ABOVE +@ +0x0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +@ +0x0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE +@ +0x0172 LATIN CAPITAL LETTER U WITH OGONEK +@ +0x0173 LATIN SMALL LETTER U WITH OGONEK +@ +0x0179 LATIN CAPITAL LETTER Z WITH ACUTE +@ +0x017A LATIN SMALL LETTER Z WITH ACUTE +@ +0x017B LATIN CAPITAL LETTER Z WITH DOT ABOVE +@ +0x017C LATIN SMALL LETTER Z WITH DOT ABOVE +@ +0x017D LATIN CAPITAL LETTER Z WITH CARON +@ +0x017E LATIN SMALL LETTER Z WITH CARON +@ +0x02C7 CARON +@ +0x02D8 BREVE +@ +0x02D9 DOT ABOVE +@ +0x02DB OGONEK +@ +0x02DD DOUBLE ACUTE ACCENT +@ diff --git a/cosmic rage/help.db b/cosmic rage/help.db new file mode 100644 index 0000000..0589913 Binary files /dev/null and b/cosmic rage/help.db differ diff --git a/cosmic rage/license.txt b/cosmic rage/license.txt new file mode 100644 index 0000000..6a74f1a --- /dev/null +++ b/cosmic rage/license.txt @@ -0,0 +1,38 @@ +LICENSE AGREEMENT + +By installing and/or using MUSHclient you agree to the following conditions of use. If you do not agree to them please do not proceed with the installation. + +This agreement is between you, "the User", and the program's author (Nick Gammon), "the Author". + + +AUTHOR + +MUSHclient has been written by Nick Gammon of Gammon Software Solutions. + +Web page: http://www.gammon.com.au/ + +Contact/support: http://www.gammon.com.au/forum/ + + +COPYRIGHT + +MUSHclient is copyright 1995 - 2007 by Nick Gammon. All rights reserved worldwide. + +MUSHclient is not in the public domain and Nick Gammon keeps its copyright. + + +PERMISSION TO DISTRIBUTE + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + + +LIMITATION OF LIABILITY + +The software is provided "as is", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the software. + + +This document was written on 2nd April 2007. + +(End of agreement) diff --git a/cosmic rage/locale/Localize_template.lua b/cosmic rage/locale/Localize_template.lua new file mode 100644 index 0000000..697e379 --- /dev/null +++ b/cosmic rage/locale/Localize_template.lua @@ -0,0 +1,5473 @@ +-- MUSHclient localization file + +-- Written: Friday, 29 March 2019 at 17:24:16 + +-- Static messages + +messages = { + +-- /cygdrive/c/source/mushclient/ActivityView.cpp:122 + ["Activity List"] = + "", + +-- /cygdrive/c/source/mushclient/DDV_validation.cpp:41 + ["This field may not be blank"] = + "", + +-- /cygdrive/c/source/mushclient/Finding.cpp:173 + ["Finding..."] = + "", + +-- /cygdrive/c/source/mushclient/MUSHclient.cpp:449 + ["OLE initialization failed"] = + "", + +-- /cygdrive/c/source/mushclient/MUSHclient.cpp:608 + ["Unable to load main frame window"] = + "", + +-- /cygdrive/c/source/mushclient/MUSHclient.cpp:831 + ["I notice that this is the first time you have used MUSHclient on this PC."] = + "", + +-- /cygdrive/c/source/mushclient/MUSHclient.cpp:998 + ["This will end your MUSHclient session."] = + "", + +-- /cygdrive/c/source/mushclient/Mapping.cpp:79 + ["Warning - mapping has not been turned on because you pressed 'Cancel'.\n\nDo you want mapping enabled now?"] = + "", + +-- /cygdrive/c/source/mushclient/TextDocument.cpp:284 + ["Unable to read file"] = + "", + +-- /cygdrive/c/source/mushclient/TextDocument.cpp:435 + ["Untitled"] = + "", + +-- /cygdrive/c/source/mushclient/TextView.cpp:678 + +-- /cygdrive/c/source/mushclient/sendvw.cpp:339 + +-- /cygdrive/c/source/mushclient/sendvw.cpp:2271 + ["Spell check ..."] = + "", + +-- /cygdrive/c/source/mushclient/TextView.cpp:917 + ["&Send To World\tShift+Ctrl+S"] = + "", + +-- /cygdrive/c/source/mushclient/TextView.cpp:1137 + ["&Flip To World\tCtrl+Alt+Space"] = + "", + +-- /cygdrive/c/source/mushclient/TextView.cpp:1339 + ["Unterminated element (\"<\" not followed by \">\")"] = + "", + +-- /cygdrive/c/source/mushclient/TextView.cpp:1355 + ["Unterminated entity (\"&\" not followed by \";\")"] = + "", + +-- /cygdrive/c/source/mushclient/TextView.cpp:1459 + +-- /cygdrive/c/source/mushclient/dialogs/ImmediateDlg.cpp:64 + ["Executing immediate script"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:809 + [""] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:813 + ["Closed"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:814 + ["Look up world name"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:815 + ["Look up proxy name"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:816 + ["Connecting to world"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:817 + ["Connecting to proxy"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:818 + ["Awaiting proxy response (1)"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:819 + ["Awaiting proxy response (2)"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:820 + ["Awaiting proxy response (3)"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:821 + ["Open"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:822 + ["Disconnecting"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:1046 + ["Closing network connection ..."] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:2534 + ["No match"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:2535 + ["Null"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:2536 + ["Bad option"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:2537 + ["Bad magic"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:2538 + ["Unknown Opcode"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:2539 + ["No Memory"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:2540 + ["No Substring"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:2541 + ["Match Limit"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:2542 + ["Callout"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:2543 + ["Bad UTF8"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:2544 + ["Bad UTF8 Offset"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:2545 + ["Partial"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:2546 + ["Bad Partial"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:2547 + ["Internal"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:2548 + ["Bad Count"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:2549 + ["Dfa Uitem"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:2550 + ["Dfa Ucond"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:2551 + ["Dfa Umlimit"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:2552 + ["Dfa Wssize"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:2553 + ["Dfa Recurse"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:2554 + ["Recursion Limit"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:2555 + ["Null Ws Limit"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:2556 + ["Bad Newline"] = + "", + +-- /cygdrive/c/source/mushclient/Utilities.cpp:2557 + ["Unknown PCRE error"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/AsciiArtDlg.cpp:49 + ["You must specify some text to insert."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/AsciiArtDlg.cpp:59 + ["You must specify a font file."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/CreditsDlg.cpp:76 + ["Could not load text"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/DebugLuaDlg.cpp:98 + ["Edit command"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/EditDlg.cpp:48 + ["Line breaks not permitted here."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/FindDlg.cpp:47 + +-- /cygdrive/c/source/mushclient/dialogs/RecallSearchDlg.cpp:57 + ["You must specify something to search for."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/FunctionListDlg.cpp:253 + ["No function selected"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/GlobalChangeDlg.cpp:41 + ["This field cannot be empty."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/HighlightPhraseDlg.cpp:52 + ["The text to highlight cannot be empty."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/HighlightPhraseDlg.cpp:60 + ["Please choose a colour other than '(no change)'."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/HighlightPhraseDlg.cpp:71 + ["Please choose a different colour than the original one."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/ImportXMLdlg.cpp:237 + ["Not in XML format"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/ImportXMLdlg.cpp:242 + ["There was a problem parsing the XML. See the output window for more details"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/InsertUnicodeDlg.cpp:43 + ["Unicode character code cannot be blank."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/InsertUnicodeDlg.cpp:50 + ["Unicode character code too long."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/LuaGsubDlg.cpp:61 + ["When calling a function the replacement text must be the function name"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/LuaGsubDlg.cpp:149 + ["Edit 'find pattern'"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/LuaGsubDlg.cpp:164 + ["Edit 'replacement' text"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/MapDlg.cpp:269 + ["Edit mapping failure 'match' text"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/MultiLineTriggerDlg.cpp:49 + ["The trigger match text cannot be empty."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/MultiLineTriggerDlg.cpp:64 + ["Multi-line triggers must match at least 2 lines."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/RecallDlg.cpp:134 + ["Window contents have changed. Save changes?"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/TextAttributesDlg.cpp:165 + [" No action."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/TextAttributesDlg.cpp:280 + ["** WARNING - length discrepancy **"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/TextAttributesDlg.cpp:283 + ["------ (end line information) ------"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/global_prefs/GlobalPrefs.cpp:146 + ["You have selected too many worlds to add. Please try again with fewer worlds."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/global_prefs/GlobalPrefs.cpp:1633 + ["You have selected too many plugins to add. Please try again with fewer Plugins."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/logdlg.cpp:52 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:1163 + ["You are not logging output from the MUD - is this intentional?"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/password.cpp:42 + ["Your password cannot be blank."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginWizard.cpp:71 + ["The plugin name must start with a letter and consist of letters, numbers or the underscore character."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginWizard.cpp:126 + ["Description may not contain the sequence \"]]>\""] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginWizard.cpp:986 + ["Script may not contain the sequence \"]]>\""] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginWizard.cpp:1125 + ["Comments may not contain the sequence \"--\""] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginsDlg.cpp:430 + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginsDlg.cpp:539 + ["Plugin cannot be found, unexpectedly."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/EditVariable.cpp:52 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/TimerDlg.cpp:206 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/aliasdlg.cpp:265 + ["The variable name must start with a letter and consist of letters, numbers or the underscore character."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/EditVariable.cpp:64 + ["This variable name is already in the list of variables."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/EditVariable.cpp:113 + ["Edit variable"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/TimerDlg.cpp:131 + ["The timer interval must be greater than zero."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/TimerDlg.cpp:138 + ["The timer offset must be less than the timer period."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/TimerDlg.cpp:180 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/aliasdlg.cpp:240 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/triggdlg.cpp:288 + ["The label must start with a letter and consist of letters, numbers or the underscore character."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/TimerDlg.cpp:193 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/aliasdlg.cpp:252 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/triggdlg.cpp:259 + ["When sending to a variable you must specify a variable name. "] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/TimerDlg.cpp:235 + ["The timer contents cannot be blank unless you specify a script subroutine."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/TimerDlg.cpp:248 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/aliasdlg.cpp:308 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/triggdlg.cpp:303 + ["The script subroutine name must start with a letter and consist of letters, numbers or the underscore character."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/aliasdlg.cpp:123 + ["The alias cannot be blank."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/aliasdlg.cpp:295 + ["The alias contents cannot be blank unless you specify a script subroutine."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/aliasdlg.cpp:466 + ["Edit alias 'match' text"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:1646 + ["You have activated UTF-8 mode, but the above trigger(s) could not be automatically converted to UTF-8 safely due to the use of extended ASCII characters. Please perform the following actions to convert your trigger(s) to safe UTF-8:"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:1649 + ["1. Locate the trigger(s) from the list above."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:1650 + ["2. Copy the trigger \"Trigger match\" text to the clipboard."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:1651 + ["3. Open an Immediate scripting window (Ctrl+I)."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:1652 + ["4. Enter this script command: "] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:1654 + [" (Note: this requires Lua to be the selected scripting language)"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:1655 + ["5. Replace XXX by pasting in the trigger match text from step 2."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:1656 + ["6. Execute this script command (Click the \"Run\" button)."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:1657 + ["7. The converted trigger match text (in UTF-8) will be echoed to the output window."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:1658 + ["8. Copy that from there and paste back into your trigger \"Trigger match\" text."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:1659 + ["9. Save the updated trigger."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:1660 + ["10. Repeat the above steps for all triggers mentioned above."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:1727 + ["Only the Lua script language is available with the /wine option"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/genpropertypage.cpp:858 + ["(ungrouped)"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/genpropertypage.cpp:1496 + ["Tree Vie&w"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/genpropertypage.cpp:1803 + ["There was a problem parsing the XML on the clipboard. See the output window for more details"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:132 + ["Your world name cannot be blank.\n\nYou must fill in your world name, TCP/IP address and port number before tabbing to other configuration screens"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:144 + ["The world IP address cannot be blank."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:151 + ["The world port number must be specified."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:168 + +-- /cygdrive/c/source/mushclient/doc.cpp:1017 + ["The proxy server address cannot be blank."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:175 + +-- /cygdrive/c/source/mushclient/doc.cpp:1023 + ["The proxy server port must be specified."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:182 + ["Unknown proxy server type."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:1054 + ["Reset all custom colours to MUSHclient defaults?"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:1084 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:1911 + ["Make all colours random?"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:1322 + ["By checking the option \"Override with default colours\" your existing colours will be PERMANENTLY discarded next time you open this world.\n\nAre you SURE you want to do this?"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:1493 + ["Reset all colours to the ANSI defaults?"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:1859 + ["Copy all 16 colours to the custom colours?"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:2076 + ["By checking the option \"Override with default macros\" your existing macros will be PERMANENTLY discarded next time you open this world.\n\nAre you SURE you want to do this?"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:3128 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:4292 + ["Cannot move up - already has a sequence of zero"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:3146 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:4310 + ["Cannot move up - already at top of list"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:3236 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:4399 + ["Cannot move down - already has a sequence of 10000"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:3255 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:4418 + ["Cannot move down - already at bottom of list"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:4752 + ["You must supply a speed-walk prefix."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:4760 + ["You must supply a command stack character."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:4767 + ["The command stack character is invalid."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:5167 + ["File exceeds 32000 bytes in length, cannot be loaded"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:5171 + ["File is empty"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:5183 + +-- /cygdrive/c/source/mushclient/doc.cpp:3761 + ["Unable to open or read the requested file"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:5189 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:5250 + +-- /cygdrive/c/source/mushclient/evaluate.cpp:692 + +-- /cygdrive/c/source/mushclient/evaluate.cpp:793 + ["Insufficient memory to do this operation"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:5244 + ["Unable to open or write the requested file"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:5340 + ["Regular expressions not supported here."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:7405 + +-- /cygdrive/c/source/mushclient/doc.cpp:7840 + ["Unable to edit the script file."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:7942 + ["No variables in this world."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:8093 + ["Your \"auto say\" string cannot be blank"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:8284 + ["Your character name cannot be blank for auto-connect."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:9041 + ["Calculating memory usage..."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:9043 + ["Memory used by output buffer"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:9052 + ["Calculating size of output buffer..."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/triggdlg.cpp:173 + ["The trigger match text cannot be blank."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/triggdlg.cpp:273 + ["The variable must start with a letter and consist of letters, numbers or the underscore character."] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/triggdlg.cpp:333 + ["Multi-line triggers must be a regular expression"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/triggdlg.cpp:339 + ["Multi-line triggers must match at least 2 lines"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/triggdlg.cpp:699 + ["Edit trigger 'match' text"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/triggdlg.cpp:773 + ["Variable:"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/triggdlg.cpp:775 + ["Pane:"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/triggdlg.cpp:777 + ["(n/a)"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:777 + ["Written by Nick Gammon."] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:789 + ["For information and assistance about MUSHclient visit our forum at:"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:791 + ["MUSHclient forum"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:794 + ["Can you trust your plugins? See: "] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:795 + ["How to trust plugins"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:990 + ["Cannot connect. World name not specified"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:1428 + ["Insufficient memory in buffer to decompress text"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:1496 + ["Insufficient memory to decompress MCCP text."] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:2594 + ["Ran out of memory. The world has been closed."] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:2764 + ["processing hotspot callback"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:3333 + +-- /cygdrive/c/source/mushclient/doc.cpp:3403 + ["Unable to allocate memory for screen font"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:3548 + ["An error occurred calculating amount to send to world"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:3581 + ["Sending to world..."] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:3583 + ["Sending..."] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:3700 + ["An error occurred when sending/pasting to this world"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:3784 + +-- /cygdrive/c/source/mushclient/doc.cpp:3871 + ["Cannot open the Clipboard"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:3816 + ["Unable to get Clipboard data"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:3828 + +-- /cygdrive/c/source/mushclient/doc.cpp:3940 + ["Unable to lock memory for Clipboard data"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:3886 + ["Unable to allocate memory for Clipboard data"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:3897 + ["Unable to lock memory for Clipboard text data"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:3912 + ["Unable to set Clipboard text data"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:3929 + ["Unable to allocate memory for Clipboard Unicode data"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:3957 + ["Unable to set Clipboard Unicode data"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4076 + +-- /cygdrive/c/source/mushclient/doc.cpp:4089 + ["For assistance with connection problems see: "] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4080 + ["How to resolve network connection problems"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4092 + ["This message can be suppressed, or displayed in the main window."] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4094 + ["See the File menu -> Global Preferences -> General to do this."] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4228 + ["Unexpected phase in HostNameResolved function"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4334 + ["Recalculating line positions"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4690 + ["Permission denied"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4691 + ["Address already in use"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4692 + ["Cannot assign requested address"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4693 + ["Address family not supported by protocol family"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4694 + ["Operation already in progress. "] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4695 + ["Software caused connection abort"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4696 + ["Connection refused"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4697 + ["Connection reset by peer"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4698 + ["Destination address required"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4699 + ["Bad address"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4700 + ["Host is down"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4701 + ["No route to host"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4702 + ["Operation now in progress"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4703 + ["Interrupted function call"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4704 + ["Invalid argument"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4705 + ["Socket is already connected"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4706 + ["Too many open files"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4707 + ["Message too long"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4708 + ["Network is down"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4709 + ["Network dropped connection on reset"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4710 + ["Network is unreachable"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4711 + ["No buffer space available"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4712 + ["Bad protocol option"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4713 + ["Socket is not connected"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4714 + ["Socket operation on non-socket"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4715 + ["Operation not supported"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4716 + ["Protocol family not supported"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4717 + ["Too many processes"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4718 + ["Protocol not supported"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4719 + ["Protocol wrong type for socket"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4720 + ["Cannot send after socket shutdown"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4721 + ["Socket type not supported"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4722 + ["Connection timed out"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4723 + ["Resource temporarily unavailable"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4724 + ["Host not found"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4725 + ["Specified event object handle is invalid"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4726 + ["One or more parameters are invalid"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4727 + ["Invalid procedure table from service provider"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4728 + ["Invalid service provider version number"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4729 + ["Overlapped operations will complete later"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4730 + ["Overlapped I/O event object not in signaled state"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4731 + ["Insufficient memory available"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4732 + ["Successful WSAStartup not yet performed"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4733 + ["Valid name, no data record of requested type"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4734 + ["This is a non-recoverable error"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4735 + ["Unable to initialize a service provider"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4736 + ["System call failure"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4737 + ["Network subsystem is unavailable"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4738 + ["Non-authoritative host not found"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4739 + ["WINSOCK.DLL version out of range"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4740 + ["Graceful shutdown in progress"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4741 + ["Overlapped operation aborted"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4745 + ["Unknown error code"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:4967 + ["Recalling..."] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:6558 + +-- /cygdrive/c/source/mushclient/doc.cpp:6580 + ["Send-to-script cannot execute because scripting is not enabled."] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:6649 + ["Unable to allocate memory for host name lookup"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:7112 + +-- /cygdrive/c/source/mushclient/doc.cpp:7114 + ["Proxy server refused authentication"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:7272 + ["Proxy server username or password lengths cannot be > 255 characters"] = + "", + +-- /cygdrive/c/source/mushclient/doc_construct.cpp:96 + +-- /cygdrive/c/source/mushclient/mainfrm.cpp:487 + ["Ready"] = + "", + +-- /cygdrive/c/source/mushclient/doc_construct.cpp:800 + ["Your world name cannot be blank."] = + "", + +-- /cygdrive/c/source/mushclient/doc_construct.cpp:806 + ["The world TCP/IP address cannot be blank."] = + "", + +-- /cygdrive/c/source/mushclient/evaluate.cpp:600 + ["Replace existing triggers?\nIf you reply \"No\", then triggers from the file will be added to existing triggers"] = + "", + +-- /cygdrive/c/source/mushclient/evaluate.cpp:609 + ["Replace existing aliases?\nIf you reply \"No\", then aliases from the file will be added to existing aliases"] = + "", + +-- /cygdrive/c/source/mushclient/evaluate.cpp:618 + ["Replace existing timers?\nIf you reply \"No\", then timers from the file will be added to existing timers"] = + "", + +-- /cygdrive/c/source/mushclient/evaluate.cpp:673 + +-- /cygdrive/c/source/mushclient/serialize.cpp:58 + ["File does not have a valid MUSHclient XML signature."] = + "", + +-- /cygdrive/c/source/mushclient/evaluate.cpp:787 + ["Unable to create the requested file"] = + "", + +-- /cygdrive/c/source/mushclient/evaluate.cpp:799 + ["There was a problem in the data format"] = + "", + +-- /cygdrive/c/source/mushclient/genprint.cpp:206 + ["Unable to create a font for printing"] = + "", + +-- /cygdrive/c/source/mushclient/genprint.cpp:282 + +-- /cygdrive/c/source/mushclient/genprint.cpp:382 + ["Error occurred starting a new page"] = + "", + +-- /cygdrive/c/source/mushclient/genprint.cpp:407 + ["Error occurred closing printer"] = + "", + +-- /cygdrive/c/source/mushclient/mainfrm.cpp:281 + ["Failed to create MDI Frame Window"] = + "", + +-- /cygdrive/c/source/mushclient/mainfrm.cpp:290 + ["Failed to create toolbar"] = + "", + +-- /cygdrive/c/source/mushclient/mainfrm.cpp:300 + ["Failed to create status bar"] = + "", + +-- /cygdrive/c/source/mushclient/mainfrm.cpp:310 + ["Failed to create game toolbar"] = + "", + +-- /cygdrive/c/source/mushclient/mainfrm.cpp:320 + ["Failed to create activity toolbar"] = + "", + +-- /cygdrive/c/source/mushclient/mainfrm.cpp:1204 + ["Unable to open the Gammon Software Solutions web page: "] = + "", + +-- /cygdrive/c/source/mushclient/mainfrm.cpp:1214 + +-- /cygdrive/c/source/mushclient/mainfrm.cpp:1223 + ["Unable to open the MUSHclient forum web page: "] = + "", + +-- /cygdrive/c/source/mushclient/mainfrm.cpp:1248 + ["Unable to open the MUD lists web page: "] = + "", + +-- /cygdrive/c/source/mushclient/mainfrm.cpp:1403 + ["Unable to open the Gammon Software Solutions Bug Report web page: "] = + "", + +-- /cygdrive/c/source/mushclient/mainfrm.cpp:1849 + ["Unable to open the MUSHclient documentation web page: "] = + "", + +-- /cygdrive/c/source/mushclient/mainfrm.cpp:1859 + ["Unable to open the regular expressions web page: "] = + "", + +-- /cygdrive/c/source/mushclient/mainfrm.cpp:2207 + ["Unable to open the plugins web page: "] = + "", + +-- /cygdrive/c/source/mushclient/mushview.cpp:3904 + ["Printing world..."] = + "", + +-- /cygdrive/c/source/mushclient/mushview.cpp:4090 + ["Printing cancelled"] = + "", + +-- /cygdrive/c/source/mushclient/mushview.cpp:4581 + ["No URL selected"] = + "", + +-- /cygdrive/c/source/mushclient/mushview.cpp:4583 + ["URL too long"] = + "", + +-- /cygdrive/c/source/mushclient/mushview.cpp:4623 + ["No email address selected"] = + "", + +-- /cygdrive/c/source/mushclient/mushview.cpp:4625 + ["Email address too long"] = + "", + +-- /cygdrive/c/source/mushclient/mushview.cpp:5374 + ["Cannot find style of this character"] = + "", + +-- /cygdrive/c/source/mushclient/mushview.cpp:5821 + ["@ must be followed by a variable name"] = + "", + +-- /cygdrive/c/source/mushclient/mushview.cpp:6407 + +-- /cygdrive/c/source/mushclient/mushview.cpp:6491 + ["Cannot compile regular expression"] = + "", + +-- /cygdrive/c/source/mushclient/mxp/mxp.cpp:50 + ["Empty MXP element supplied."] = + "", + +-- /cygdrive/c/source/mushclient/mxp/mxpOnOff.cpp:32 + ["Closing down MXP"] = + "", + +-- /cygdrive/c/source/mushclient/mxp/mxpOpenAtomic.cpp:572 + ["Character name requested but auto-connect not set to MXP."] = + "", + +-- /cygdrive/c/source/mushclient/mxp/mxpOpenAtomic.cpp:575 + ["Character name requested but none defined."] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7348 + ["No error"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7349 + ["The world is already open"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7350 + ["The world is closed, this action cannot be performed"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7351 + ["No name has been specified where one is required"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7352 + ["The sound file could not be played"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7353 + ["The specified trigger name does not exist"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7354 + ["Attempt to add a trigger that already exists"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7355 + ["The trigger \"match\" string cannot be empty"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7356 + ["The name of this object is invalid"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7357 + ["Script name is not in the script file"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7358 + ["The specified alias name does not exist"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7359 + ["Attempt to add a alias that already exists"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7360 + ["The alias \"match\" string cannot be empty"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7361 + ["Unable to open requested file"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7362 + ["Log file was not open"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7363 + ["Log file was already open"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7364 + ["Bad write to log file"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7365 + ["The specified timer name does not exist"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7366 + ["Attempt to add a timer that already exists"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7367 + ["Attempt to delete a variable that does not exist"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7368 + ["Attempt to use SetCommand with a non-empty command window"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7369 + ["Bad regular expression syntax"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7370 + ["Time given to AddTimer is invalid"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7371 + ["Direction given to AddToMapper is invalid"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7372 + ["No items in mapper"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7373 + ["Option name not found"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7374 + ["New value for option is out of range"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7375 + ["Trigger sequence value invalid"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7376 + ["Where to send trigger text to is invalid"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7377 + ["Trigger label not specified/invalid for 'send to variable'"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7378 + ["File name specified for plugin not found"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7379 + ["There was a parsing or other problem loading the plugin"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7380 + ["Plugin is not allowed to set this option"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7381 + ["Plugin is not allowed to get this option"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7382 + ["Requested plugin is not installed"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7383 + ["Only a plugin can do this"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7384 + ["Plugin does not support that subroutine (subroutine not in script)"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7385 + ["Plugin does not support saving state"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7386 + ["Plugin could not save state (eg. no state directory)"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7387 + ["Plugin is currently disabled"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7388 + ["Could not call plugin routine"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7389 + ["Calls to \"Execute\" nested too deeply"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7390 + ["Unable to create socket for chat connection"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7391 + ["Unable to do DNS (domain name) lookup for chat connection"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7392 + ["No chat connections open"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7393 + ["Requested chat person not connected"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7394 + ["General problem with a parameter to a script call"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7395 + ["Already listening for incoming chats"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7396 + ["Chat session with that ID not found"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7397 + ["Already connected to that server/port"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7398 + ["Cannot get (text from the) clipboard"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7399 + ["Cannot open the specified file"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7400 + ["Already transferring a file"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7401 + ["Not transferring a file"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7402 + ["There is not a command of that name"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7403 + ["That array already exists"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7404 + ["That array does not exist"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7405 + ["Values to be imported into array are not in pairs"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7406 + ["Import succeeded, however some values were overwritten"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7407 + ["Import/export delimiter must be a single character, other than backslash"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7408 + ["Array element set, existing value overwritten"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7409 + ["Array key does not exist"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7410 + ["Cannot import because cannot find unused temporary character"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7411 + ["Cannot delete trigger/alias/timer because it is executing a script"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7412 + ["Spell checker is not active"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7413 + ["Cannot create requested font"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7414 + ["Invalid settings for pen parameter"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7415 + ["Bitmap image could not be loaded"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7416 + ["Image has not been loaded into window"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7417 + ["Number of points supplied is incorrect"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7418 + ["Point is not numeric"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7419 + ["Hotspot processing must all be in same plugin"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7420 + ["Hotspot has not been defined for this window"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7421 + ["Requested miniwindow does not exist"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:7422 + ["Invalid settings for brush parameter"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:252 + ["No (relevant) chat connections."] = + "", + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_commands.cpp:290 + ["Scripting is not active yet, or script file had a parse error."] = + "", + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_commands.cpp:306 + ["Warning - you appear to be doing a script command but scripting is not enabled."] = + "", + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_database.cpp:243 + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_database.cpp:259 + ["database id not found"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_database.cpp:245 + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_database.cpp:263 + ["database not open"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_database.cpp:251 + ["row ready"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_database.cpp:255 + ["finished"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_database.cpp:267 + ["already have prepared statement"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_database.cpp:271 + ["do not have prepared statement"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_database.cpp:275 + ["do not have a valid row"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_database.cpp:279 + ["database already exists under a different disk name"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_database.cpp:283 + ["column count out of valid range"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_speedwalks.cpp:54 + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_speedwalks.cpp:196 + ["Comment code of '{' not terminated by a '}'"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_speedwalks.cpp:65 + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_speedwalks.cpp:212 + ["Speed walk counter exceeds 99"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_speedwalks.cpp:77 + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_speedwalks.cpp:224 + ["Speed walk counter not followed by an action"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_speedwalks.cpp:80 + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_speedwalks.cpp:227 + ["Speed walk counter may not be followed by a comment"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_speedwalks.cpp:89 + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_speedwalks.cpp:236 + ["Action code of C, O, L or K must not follow a speed walk count (1-99)"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_speedwalks.cpp:107 + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_speedwalks.cpp:248 + ["Action code of C, O, L or K must be followed by a direction"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_speedwalks.cpp:133 + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_speedwalks.cpp:276 + ["Action code of '(' not terminated by a ')'"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/scriptengine.cpp:202 + ["Immediate execution"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/scriptengine.cpp:207 + ["Line in error: "] = + "", + +-- /cygdrive/c/source/mushclient/scripting/scriptengine.cpp:213 + ["No active world"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/scriptengine.cpp:240 + ["Script error"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/scriptengine.cpp:396 + ["Something nasty happened whilst initialising the scripting engine"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/scriptengine.cpp:434 + ["Script engine problem on script parse"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/scripting.cpp:29 + ["Error, scripting already active"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/scripting.cpp:445 + ["You have not specified a script file name:"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/scripting.cpp:516 + ["Error context in script:"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/scripting.cpp:556 + ["Error context in script:\n"] = + "", + +-- /cygdrive/c/source/mushclient/telnet_phases.cpp:586 + +-- /cygdrive/c/source/mushclient/telnet_phases.cpp:844 + ["Cannot process compressed output. World closed."] = + "", + +-- /cygdrive/c/source/mushclient/timers.cpp:314 + ["Reconnecting ..."] = + "", + +-- /cygdrive/c/source/mushclient/world_debug.cpp:832 + ["Script:"] = + "", + +-- /cygdrive/c/source/mushclient/world_debug.cpp:833 + ["-------(start script)----------"] = + "", + +-- /cygdrive/c/source/mushclient/world_debug.cpp:835 + ["--------(end script)-----------"] = + "", + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1062 + ["Script file: "] = + "", + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1275 + ["MCCP not active."] = + "", + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1567 + [" WARNING: temporarily hidden by auto-positioning (no room)"] = + "", + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1704 + ["----- Debug commands available -----"] = + "", + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2301 + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2371 + ["Matched count"] = + "", + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2302 + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2372 + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2442 + ["Has script"] = + "", + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2303 + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2373 + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2443 + ["Times script called"] = + "", + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2304 + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2374 + ["When last matched"] = + "", + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2305 + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2375 + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2447 + ["Send to"] = + "", + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2306 + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2376 + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2448 + ["Temporary"] = + "", + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2312 + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2381 + ["Time to match"] = + "", + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2316 + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2384 + ["Match attempts"] = + "", + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2441 + ["Fired count"] = + "", + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2444 + ["When to fire next"] = + "", + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2445 + ["Seconds to fire next"] = + "", + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2446 + ["When last reset/fired"] = + "", + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2556 + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2565 + ["Never"] = + "", + +-- /cygdrive/c/source/mushclient/xml/xml_load_world.cpp:735 + ["Loading plugins ..."] = + "", + } -- end messages + +-- Formatted messages + +formatted = { + +-- /cygdrive/c/source/mushclient/Finding.cpp:51 + ["The %s \"%s\" was not found%s"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/Finding.cpp:154 + ["Finding: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/MUSHclient.cpp:574 + ["Internal MUSHclient error, config name collision: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/MUSHclient.cpp:851 + ["Welcome to MUSHclient, version %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/MUSHclient.cpp:852 + ["Thank you for upgrading MUSHclient to version %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/MUSHclient.cpp:1431 + ["Function '%s' not in spellchecker.lua file"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/MUSHclient.cpp:1462 + ["Could not initialise zlib decompression engine: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/MUSHclient.cpp:1465 + ["Could not initialise zlib decompression engine: %i"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/Mapping.cpp:107 + +-- /cygdrive/c/source/mushclient/serialize.cpp:84 + ["Error \"%s\" processing mapping failure regular expression \"%s\""] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/Mapping.cpp:347 + ["Mapper: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/ProcessPreviousLine.cpp:575 + ["Previous line had a bad UTF-8 sequence at column %i, and was not evaluated for trigger matches"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/ProcessPreviousLine.cpp:1155 + ["Trigger: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/StatLink.cpp:107 + ["Unable to execute: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/TextDocument.cpp:266 + ["The file \"%s\" has been modified. Do you wish to reload it?"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/TextDocument.cpp:433 + +-- /cygdrive/c/source/mushclient/dialogs/cmdhist.cpp:246 + +-- /cygdrive/c/source/mushclient/doc.cpp:5842 + +-- /cygdrive/c/source/mushclient/mushview.cpp:5490 + +-- /cygdrive/c/source/mushclient/sendvw.cpp:2329 + ["Notepad: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/TextView.cpp:576 + ["The %s contains %i line%s, %i word%s, %i character%s"] = + function (a, b, c, d, e, f, g) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/TextView.cpp:911 + ["&Send To %s\tShift+Ctrl+S"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/TextView.cpp:970 + ["Replace entire window contents with 'recall' from %s?"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/TextView.cpp:1131 + ["&Flip To %s\tCtrl+Alt+Space"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/TextView.cpp:1373 + ["Invalid hex number in entity: &%s;"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/TextView.cpp:1382 + ["Invalid hex number in entity: &%s; - maximum of 2 hex digits"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/TextView.cpp:1394 + ["Invalid number in entity: &%s;"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/TextView.cpp:1407 + ["Disallowed number in entity: &%s;"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/TextView.cpp:1420 + ["Unknown entity: &%s;"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/TextView.cpp:1601 + ["%i character%s selected."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/TextView.cpp:1603 + ["All text selected: %i character%s"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/TextView.cpp:1614 + [" (%i line break%s)"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/TextView.cpp:1705 + ["%i replaced."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/Utilities.cpp:1744 + ["Cannot find the function '%s' - item '%s' is %s"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/Utilities.cpp:2332 + ["Clipboard converted for use with the Forum, %i change%s made"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatlistensock.cpp:62 + ["Accepted call from %s port %d"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:263 + ["Incoming packet on %i: \"%s\""] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:347 + ["Incoming chat call to world %s from %s, IP address: %s.\n\nAccept it?"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:362 + ["Chat session accepted, remote user: \"%s\""] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:506 + ["Unable to send to \"%s\", code = %i (%s)"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:537 + ["Unable to connect to \"%s\", code = %i (%s)"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:546 + ["Session established to %s."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:578 + ["Chat session cannot resolve host name: %s."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:617 + ["You are already connected to %s port %d"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:627 + ["Calling chat server at %s port %d"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:677 + ["Received chat message %i on %i, data: \"%s\""] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:727 + ["\n%s does not support the chat command %i.\n"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:731 + ["Received unsupported chat command %i from %s"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:750 + ["Sending chat message %i on %i, data: \"%s\""] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:833 + ["%s has changed his/her name to %s."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:863 + ["%s has requested your public connections"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:874 + ["Found %i connection%s to %s"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1015 + ["%s is not allowing file transfers from you."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1036 + ["Supplied file name of \"%s\" may not contain slashes."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1060 + ["%s wishes to send you the file \"%s\", size %ld bytes (%1.1f Kb).\n\nAccept it?"] = + function (a, b, c, d) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1081 + ["Chat: Save file from %s as ..."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1111 + ["%s does not want that particular file."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1124 + ["%s can not open that file."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1126 + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:1193 + ["File %s cannot be opened."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1143 + ["Receiving a file from %s -- Filename: %s, Length: %ld bytes (%1.1f Kb)."] = + function (a, b, c, d) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1208 + ["Send of file \"%s\" aborted due to read error."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1223 + ["Send of file \"%s\" complete."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1227 + ["Sumcheck from sender was: %08X %08X %08X %08X %08X"] = + function (a, b, c, d, e) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1236 + ["Sumcheck we calculated: %08X %08X %08X %08X %08X"] = + function (a, b, c, d, e) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1286 + ["Receive of file \"%s\" aborted due to write error."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1304 + ["Receive of file \"%s\" complete."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1308 + ["Sumcheck as written was: %08X %08X %08X %08X %08X"] = + function (a, b, c, d, e) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1317 + ["Sumcheck as received was: %08X %08X %08X %08X %08X"] = + function (a, b, c, d, e) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1342 + ["Transfer of file \"%s\" stopped prematurely."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1379 + ["Ping time to %s: %s"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1385 + ["Ping response: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1424 + ["%s is peeking at your connections"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1440 + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1474 + ["Peek found %i connection%s to %s"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1517 + ["\nYou are no longer snooping %s.\n"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1520 + ["%s has stopped snooping you."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1530 + ["%s wishes to start snooping you.\n\nPermit it?"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1536 + ["\n%s does not want you to snoop just now.\n"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1543 + ["\nYou are now snooping %s.\n"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1546 + ["%s is now snooping you."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1555 + ["\n%s has not given you permission to snoop.\n"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1558 + ["%s attempted to snoop you."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1613 + ["\nYou command %s to '%s'.\n"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1617 + ["%s commands you to '%s'."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1626 + ["\n%s has not given you permission to send commands.\n"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/chatsock.cpp:1629 + ["%s attempted to send you a command."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/ColourPickerDlg.cpp:388 + ["Hue: %5.1f"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/ColourPickerDlg.cpp:389 + ["Saturation: %5.3f"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/ColourPickerDlg.cpp:390 + ["Luminance: %5.3f"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/GoToLineDlg.cpp:45 + ["Line number must be in range 1 to %i"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/ImportXMLdlg.cpp:123 + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginsDlg.cpp:365 + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginsDlg.cpp:524 + +-- /cygdrive/c/source/mushclient/doc.cpp:882 + +-- /cygdrive/c/source/mushclient/evaluate.cpp:685 + ["Unable to open or read %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/ImportXMLdlg.cpp:210 + ["%lu trigger%s, %lu alias%s, %lu timer%s, %lu macro%s, %lu variable%s, %lu colour%s, %lu keypad%s, %lu printing style%s loaded. "] = + function (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/InsertUnicodeDlg.cpp:65 + ["Bad hex character: '%c'."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/InsertUnicodeDlg.cpp:83 + ["Bad decimal character: '%c'."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/InsertUnicodeDlg.cpp:93 + ["Unicode character %I64i too large - must be in range 0 to 2147483647 (hex 0 to 7FFFFFFF)."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/LuaGsubDlg.cpp:82 + ["Function '%s' not found in script text"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/MapCommentDlg.cpp:43 + ["The comment may not contain the character \"%c\""] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/MapDlg.cpp:101 + ["Remove existing %i directions from the map?"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/MapMoveDlg.cpp:51 + ["The action may not contain the character \"%c\""] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/MapMoveDlg.cpp:58 + ["The reverse action may not contain the character \"%c\""] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/MultiLineTriggerDlg.cpp:72 + ["Multi-line triggers can match a maximum of %i lines."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/ScriptErrorDlg.cpp:74 + ["Error number: %i\nEvent: %s\nDescription: %s\nCalled by: %s\n"] = + function (a, b, c, d) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/TextAttributesDlg.cpp:103 + ["Line %i (%i), %s"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/TextAttributesDlg.cpp:108 + [" Flags = End para: %s, Note: %s, User input: %s, Log: %s, Bookmark: %s"] = + function (a, b, c, d, e) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/TextAttributesDlg.cpp:122 + [" Length = %i, last space = %i"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/TextAttributesDlg.cpp:128 + [" Text = \"%s\""] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/TextAttributesDlg.cpp:131 + ["%i style run%s"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/TextAttributesDlg.cpp:144 + ["%i: Offset = %i, Length = %i, Text = \"%s\""] = + function (a, b, c, d) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/TextAttributesDlg.cpp:168 + [" Action - send to MUD: \"%s\""] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/TextAttributesDlg.cpp:171 + +-- /cygdrive/c/source/mushclient/dialogs/TextAttributesDlg.cpp:178 + +-- /cygdrive/c/source/mushclient/dialogs/TextAttributesDlg.cpp:185 + [" Hint: \"%s\""] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/TextAttributesDlg.cpp:175 + [" Action - hyperlink: \"%s\""] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/TextAttributesDlg.cpp:182 + [" Action - send to command window: \"%s\""] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/TextAttributesDlg.cpp:193 + [" Set variable: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/TextAttributesDlg.cpp:195 + [" Flags = Hilite: %s, Underline: %s, Blink: %s, Inverse: %s, Changed: %s"] = + function (a, b, c, d, e) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/TextAttributesDlg.cpp:205 + [" Start MXP tag: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/TextAttributesDlg.cpp:225 + [" Foreground colour 256-ANSI : R=%i, G=%i, B=%i"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/TextAttributesDlg.cpp:231 + [" Foreground colour ANSI : %i (%s)"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/TextAttributesDlg.cpp:235 + [" Background colour 256-ANSI : R=%i, G=%i, B=%i"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/TextAttributesDlg.cpp:241 + [" Background colour ANSI : %i (%s)"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/TextAttributesDlg.cpp:246 + [" Custom colour: %i (%s)"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/TextAttributesDlg.cpp:251 + [" Foreground colour RGB : R=%i, G=%i, B=%i"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/TextAttributesDlg.cpp:256 + [" Background colour RGB : R=%i, G=%i, B=%i"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/TextAttributesDlg.cpp:263 + [" Foreground colour rsvd : %i"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/TextAttributesDlg.cpp:265 + [" Background colour rsvd : %i"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/TextAttributesDlg.cpp:278 + ["%i column%s in %i style run%s"] = + function (a, b, c, d) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/chat/ChatListDlg.cpp:154 + ["Chat sessions for %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginWizard.cpp:605 + ["Every %02i:%02i:%04.2f"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginWizard.cpp:610 + ["At %02i:%02i:%04.2f"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginsDlg.cpp:254 + ["%s description"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginsDlg.cpp:358 + ["Added plugin %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginsDlg.cpp:372 + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginsDlg.cpp:531 + +-- /cygdrive/c/source/mushclient/doc.cpp:889 + ["There was a problem loading the plugin %s. See the output window for more details"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginsDlg.cpp:426 + ["Removed plugin %s (%s)"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginsDlg.cpp:516 + ["Reinstalled plugin %s (%s)"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginsDlg.cpp:576 + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2477 + ["Unable to edit the plugin file %s."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginsDlg.cpp:739 + ["Unable to edit the plugin state file %s."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginsDlg.cpp:777 + ["Enabled plugin %s (%s)"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginsDlg.cpp:812 + ["Disabled plugin %s (%s)"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/EditVariable.cpp:115 + ["Edit variable '%s'"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/TimerDlg.cpp:164 + ["The timer label \"%s\" is already in the list of timers."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/aliasdlg.cpp:150 + ["The alias 'match' text contains an invalid non-printable character (hex %02X) at position %i."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/aliasdlg.cpp:164 + ["The alias 'send' text contains an invalid non-printable character (hex %02X) at position %i."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/aliasdlg.cpp:224 + ["The alias label \"%s\" is already in the list of aliases."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:2453 + ["In %s, could not recompile trigger (%s) matching on: %s."] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:2487 + ["In %s, could not recompile alias (%s) matching on: %s."] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:2496 + ["In %s, %i trigger(s) could not be recompiled."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:2502 + ["In %s, %i alias(es) could not be recompiled."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/genpropertypage.cpp:259 + ["The %s named \"%s\" is already in the %s list"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/genpropertypage.cpp:380 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/genpropertypage.cpp:427 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/genpropertypage.cpp:1656 + ["The %s you selected is no longer in the %s list"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/genpropertypage.cpp:384 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/genpropertypage.cpp:431 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/genpropertypage.cpp:1660 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:3110 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:3218 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:4274 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:4381 + ["The %s named \"%s\" is no longer in the %s list"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/genpropertypage.cpp:447 + ["The %s named \"%s\" has been included from an include file. You cannot modify it here."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/genpropertypage.cpp:458 + ["The %s named \"%s\" has already been modified by a script subroutine"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/genpropertypage.cpp:486 + ["The %s named \"%s\" already exists in the %s list"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/genpropertypage.cpp:707 + ["Delete %i %s - are you sure?"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/genpropertypage.cpp:774 + ["%i item%s %s included from an include file. You cannot delete %s here."] = + function (a, b, c, d) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/genpropertypage.cpp:784 + ["%i item%s %s currently executing a script. You cannot delete %s now."] = + function (a, b, c, d) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/genpropertypage.cpp:1175 + ["%i item%s."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/genpropertypage.cpp:1178 + [" (%i item%s hidden by filter)"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:2534 + ["By checking the option \"Override with default aliases\" your existing %i aliase(s) will be PERMANENTLY discarded next time you open this world.\n\nAre you SURE you want to do this?"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:2660 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:3702 + ["Error: %s "] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:3506 + ["By checking the option \"Override with default triggers\" your existing %i trigger%s will be PERMANENTLY discarded next time you open this world.\n\nAre you SURE you want to do this?"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:5858 + ["You are allocating %ld lines for your output buffer, but have only %ld Mb of physical RAM. This is not recommended. Do you wish to continue anyway?"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:6207 + ["By checking the option \"Override with default timers\" your existing %i timer%s will be PERMANENTLY discarded next time you open this world.\n\nAre you SURE you want to do this?"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:7374 + ["Successfully registered %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:7916 + ["%i line%s could not be added as a variable."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:7930 + ["Loaded %i variable%s."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:7989 + ["Saved %i variable%s."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:8333 + ["(%i line%s)"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:9085 + [" (%i styles)"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/triggdlg.cpp:200 + ["The trigger 'match' text contains an invalid non-printable character (hex %02X) at position %i."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/triggdlg.cpp:214 + ["The trigger 'send' text contains an invalid non-printable character (hex %02X) at position %i."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/triggdlg.cpp:246 + ["The trigger label \"%s\" is already in the list of triggers."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/triggdlg.cpp:317 + ["Your trigger is set to 'send to %s' however the 'Send:' field is blank.\n\nYou can use \"%%0\" to send the entire matching line to the specified place.\n\n(You can eliminate this message by sending to 'world')\n\nDo you want to change the trigger to fix this?"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:776 + ["Welcome to MUSHclient version %s!"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:780 + ["Compiled: %s at %s."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:782 + ["Using: %s, PCRE %s, PNG %s, SQLite3 %s, Zlib %s"] = + function (a, b, c, d, e) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:996 + ["Cannot connect to \"%s\", TCP/IP address not specified"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:1003 + ["Cannot connect to \"%s\", port number not specified"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:1029 + ["Unknown proxy server type: %d."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:1047 + ["Connecting to %s, port %d"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:1069 + ["Unable to create TCP/IP socket for \"%s\", code = %i (%s)"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:1516 + ["Could not decompress text from MUD: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:1519 + ["Could not decompress text from MUD: %i"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:2638 + ["%s function \"%s\" cannot execute - scripting disabled/parse error."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:2650 + ["%s function \"%s\" not found or had a previous error."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:2669 + ["processing trigger \"%s\" when matching line: \"%s\""] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:2828 + ["Close log file %s?"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:2940 + ["Unable to open log file \"%s\""] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:3219 + ["An error occurred writing to log file \"%s\""] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:4049 + +-- /cygdrive/c/source/mushclient/doc.cpp:6723 + ["Unable to connect to \"%s\", code = %i (%s)\n\nError occurred during phase: %s"] = + function (a, b, c, d) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:4204 + ["Unable to resolve host name for \"%s\", code = %i (%s)"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:4530 + ["This will end your %s session."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:4560 + ["World internal variables (only) have changed.\n\nSave changes to %s?"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:4921 + ["Are you SURE you want to clear all %i lines in the output window?"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:4950 + ["Recalling: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:5113 + ["The %s \"%s\" was not found"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:5174 + +-- /cygdrive/c/source/mushclient/mushview.cpp:5543 + ["Recall: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:5380 + ["The connection to %s is currently being established."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:5386 + ["The connection to %s is not open. Attempt to reconnect?"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:5691 + ["%s%s packet: %I64d (%i bytes) at %s%s%s"] = + function (a, b, c, d, e, f, g) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:6664 + ["Unable to initiate host name lookup for \"%s\""] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:6877 + ["Could not open log file \"%s\""] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:7090 + ["Proxy server cannot authenticate, reason: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:7156 + +-- /cygdrive/c/source/mushclient/doc.cpp:7194 + ["Proxy server refused connection, reason: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:7224 + ["Unexpected proxy server response %i, expected %i"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/doc.cpp:7810 + ["Unable to edit file %s."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/evaluate.cpp:698 + ["The file %s is not in the correct format"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/evaluate.cpp:962 + +-- /cygdrive/c/source/mushclient/mushview.cpp:5929 + ["Alias: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/evaluate.cpp:993 + +-- /cygdrive/c/source/mushclient/mushview.cpp:5859 + ["processing alias \"%s\""] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mainfrm.cpp:1393 + ["Unable to play file %s, reason: %s"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mushview.cpp:2308 + ["Plugin \"%s\" is not installed"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mushview.cpp:2313 + ["Script routine \"%s\" is not in plugin %s"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mushview.cpp:2320 + ["An error occurred calling plugin %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mushview.cpp:2372 + +-- /cygdrive/c/source/mushclient/mushview.cpp:5667 + ["Hyperlink action \"%s\" - permission denied."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mushview.cpp:2377 + +-- /cygdrive/c/source/mushclient/mushview.cpp:5672 + ["Unable to open the hyperlink \"%s\""] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mushview.cpp:4496 + ["Line %ld, %s%s"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mushview.cpp:4593 + ["Unable to open the URL \"%s\""] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mushview.cpp:4627 + ["Email address \"%s\" invalid - does not contain a \"@\""] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mushview.cpp:4635 + ["Unable to send mail to \"%s\""] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mushview.cpp:5831 + ["Variable '%s' is not defined."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxp.cpp:45 + ["MXP element: <%s>"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxp.cpp:65 + ["MXP element too short: <%s>"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpClose.cpp:61 + ["Opening MXP tag <%s> not found in output buffer"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpClose.cpp:136 + ["closing MXP tag %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpClose.cpp:232 + ["setting MXP variable %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpClose.cpp:317 + +-- /cygdrive/c/source/mushclient/mxp/mxpDefs.cpp:271 + +-- /cygdrive/c/source/mushclient/mxp/mxpStart.cpp:127 + ["Unknown MXP element: <%s>"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpClose.cpp:379 + ["End-of-line closure of open MXP tag: <%s>"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpClose.cpp:400 + [" closure of MXP tag: <%s>"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpDefs.cpp:39 + ["MXP definition ignored when not in secure mode: "] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpDefs.cpp:54 + ["Invalid MXP definition name: "] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpDefs.cpp:70 + ["Invalid MXP element/entity name: \"%s\""] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpDefs.cpp:88 + ["Got Definition: !%s %s %s"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpDefs.cpp:106 + ["Unknown definition type: "] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpDefs.cpp:135 + ["Cannot redefine built-in MXP element: <%s>"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpDefs.cpp:145 + ["Replacing previously-defined MXP element: <%s>"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpDefs.cpp:187 + ["No opening \"<\" in MXP element definition \"%s\""] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpDefs.cpp:201 + ["Unexpected \"<\" in MXP element definition \"%s\""] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpDefs.cpp:213 + ["No closing quote in MXP element definition \"%s\""] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpDefs.cpp:225 + ["No closing \">\" in MXP element definition \"%s\""] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpDefs.cpp:237 + ["No element name in MXP element definition \"<%s>\""] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpDefs.cpp:247 + ["Element definitions cannot close other elements: "] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpDefs.cpp:257 + ["Element definitions cannot define other elements: "] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpDefs.cpp:347 + ["Bad variable name \"%s\" - for MXP FLAG definition"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpDefs.cpp:372 + ["Cannot add attributes to undefined MXP element: <%s>"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpDefs.cpp:404 + +-- /cygdrive/c/source/mushclient/mxp/mxpOpenAtomic.cpp:827 + ["Cannot redefine entity: &%s;"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpDefs.cpp:437 + ["No closing \";\" in MXP entity argument \"%s\""] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpDefs.cpp:504 + ["Unexpected word \"%s\" in entity definition for &%s; ignored"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpEnd.cpp:35 + ["Invalid MXP tag name: "] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpEnd.cpp:45 + ["Closing MXP tag has inappropriate arguments"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpEnd.cpp:68 + ["Cannot close open MXP tag <%s> - blocked by secure tag <%s>"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpEnd.cpp:82 + ["Closing MXP tag does not have corresponding opening tag"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpEnd.cpp:90 + ["Cannot close open MXP tag <%s> - it was opened in secure mode."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpEnd.cpp:109 + ["Closing out-of-sequence MXP tag: <%s>"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpEntities.cpp:34 + ["MXP entity: &%s;"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpEntities.cpp:40 + ["Invalid MXP entity name \"%s\" supplied."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpEntities.cpp:84 + ["Invalid hex number in MXP entity: &%s;"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpEntities.cpp:96 + ["Invalid hex number in MXP entity: &%s;- maximum of 2 hex digits"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpEntities.cpp:110 + ["Invalid number in MXP entity: &%s;"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpEntities.cpp:122 + ["Disallowed number in MXP entity: &%s;"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpEntities.cpp:139 + ["Unknown MXP entity: &%s;"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpError.cpp:163 + ["Unterminated MXP %s: %s (%s)"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpMode.cpp:62 + +-- /cygdrive/c/source/mushclient/mxp/mxpMode.cpp:67 + ["unknown mode %i"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpMode.cpp:70 + ["MXP mode change from '%s' to '%s'"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpOpenAtomic.cpp:138 + +-- /cygdrive/c/source/mushclient/mxp/mxpOpenAtomic.cpp:146 + +-- /cygdrive/c/source/mushclient/mxp/mxpOpenAtomic.cpp:267 + +-- /cygdrive/c/source/mushclient/mxp/mxpOpenAtomic.cpp:280 + ["Unknown colour: \"%s\""] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpOpenAtomic.cpp:300 + ["Sent version response: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpOpenAtomic.cpp:321 + ["Sent AFK response: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpOpenAtomic.cpp:371 + +-- /cygdrive/c/source/mushclient/mxp/mxpOpenAtomic.cpp:383 + +-- /cygdrive/c/source/mushclient/mxp/mxpOpenAtomic.cpp:431 + ["Invalid argument: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpOpenAtomic.cpp:461 + ["Sent supports response: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpOpenAtomic.cpp:507 + ["Sent options response: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpOpenAtomic.cpp:531 + ["Option named '%s' not known."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpOpenAtomic.cpp:535 + ["Option named '%s' cannot be changed."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpOpenAtomic.cpp:542 + ["Option named '%s' changed to '%s'."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpOpenAtomic.cpp:547 + ["Option named '%s' could not be changed to '%s' (out of range)."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpOpenAtomic.cpp:567 + ["Sent character name: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpOpenAtomic.cpp:815 + ["Invalid MXP entity name: "] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpOpenAtomic.cpp:841 + ["MXP tag <%s> is not implemented"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpStart.cpp:48 + ["Invalid MXP element name \"%s\" supplied."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpStart.cpp:145 + ["Secure MXP tag ignored when not in secure mode: <%s>"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpStart.cpp:217 + ["Now have %i outstanding MXP tags"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpStart.cpp:286 + +-- /cygdrive/c/source/mushclient/mxp/mxpStart.cpp:422 + ["No closing \";\" in MXP element argument \"%s\""] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpStart.cpp:473 + ["Non-default argument \"%s\" not supplied to <%s>"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxpStart.cpp:566 + ["opening MXP tag %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxputils.cpp:140 + +-- /cygdrive/c/source/mushclient/mxp/mxputils.cpp:161 + ["Invalid parameter name: \"%s\""] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxputils.cpp:170 + ["No argument value supplied for: \"%s\""] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxputils.cpp:521 + ["Unused argument (%i) for <%s>: %s"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/mxp/mxputils.cpp:528 + ["Unused argument for <%s>: %s=\"%s\""] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/plugins.cpp:225 + +-- /cygdrive/c/source/mushclient/plugins.cpp:272 + +-- /cygdrive/c/source/mushclient/plugins.cpp:354 + +-- /cygdrive/c/source/mushclient/plugins.cpp:444 + +-- /cygdrive/c/source/mushclient/plugins.cpp:532 + +-- /cygdrive/c/source/mushclient/plugins.cpp:620 + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:1145 + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_plugins.cpp:414 + ["Plugin %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/plugins.cpp:227 + +-- /cygdrive/c/source/mushclient/plugins.cpp:275 + +-- /cygdrive/c/source/mushclient/plugins.cpp:355 + +-- /cygdrive/c/source/mushclient/plugins.cpp:445 + +-- /cygdrive/c/source/mushclient/plugins.cpp:533 + +-- /cygdrive/c/source/mushclient/plugins.cpp:623 + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:1146 + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_plugins.cpp:415 + ["Executing plugin %s sub %s"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/plugins.cpp:814 + ["Plugin state saved. Plugin: \"%s\". World: \"%s\"."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/plugins.cpp:827 + ["Unable to create the plugin save state file: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/plugins.cpp:836 + ["Insufficient memory to write the plugin save state file: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/plugins.cpp:845 + ["There was a problem saving the plugin save state file: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/regexp.cpp:105 + ["Error executing regular expression: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/regexp.cpp:143 + ["Error occurred at column %i."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:1014 + ["Plugin ID (%s) is not installed"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:1024 + ["Plugin '%s' (%s) disabled"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:1036 + ["Scripting not enabled in plugin '%s' (%s)"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:1062 + ["No function '%s' in plugin '%s' (%s)"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:1113 + ["Cannot pass argument #%i (%s type) to CallPlugin"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/lua_methods.cpp:1166 + ["Runtime error in function '%s', plugin '%s' (%s)"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/lua_scripting.cpp:487 + +-- /cygdrive/c/source/mushclient/scripting/lua_scripting.cpp:705 + +-- /cygdrive/c/source/mushclient/scripting/scriptengine.cpp:70 + ["Executing %s script \"%s\""] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:191 + ["Your chat name changed from %s to %s"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:216 + ["\n%s chats to everybody, '%s%s%s%s'\n"] = + function (a, b, c, d, e) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:234 + ["You emote to everybody: %s%s%s %s%s"] = + function (a, b, c, d, e) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:242 + ["You chat to everybody, '%s%s%s%s'"] = + function (a, b, c, d) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:271 + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:1051 + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:1138 + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:1247 + ["Chat ID %i is not connected."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:276 + ["\nTo you, %s%s%s %s%s\n"] = + function (a, b, c, d, e) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:284 + ["\n%s chats to you, '%s%s%s%s'\n"] = + function (a, b, c, d, e) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:297 + ["You emote to %s: %s%s%s %s%s"] = + function (a, b, c, d, e, f) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:306 + ["You chat to %s, '%s%s%s%s'"] = + function (a, b, c, d, e) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:339 + ["%s is not connected."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:344 + ["%i matches."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:357 + ["%-15s\nTo the group, %s%s%s %s%s\n"] = + function (a, b, c, d, e, f) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:365 + ["%-15s\n%s chats to the group, '%s%s%s%s'\n"] = + function (a, b, c, d, e, f) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:384 + ["You emote to the group %s: %s%s%s %s%s"] = + function (a, b, c, d, e, f) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:393 + ["You chat to the group %s, '%s%s%s%s'"] = + function (a, b, c, d, e) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:405 + ["No chat connections in the group %s."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:433 + ["\n[Chat message truncated, exceeds %i bytes]"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:458 + ["\n[Chat message truncated, exceeds %i lines]"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:519 + ["Accepting chat calls on port %d"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:534 + ["Cannot accept calls on port %i, code = %i (%s)"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:545 + ["Listening for chat connections on port %d"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:739 + ["Connection to %s dropped."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:760 + ["%i connection%s closed."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:895 + ["You can now send %s commands"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:899 + ["You can no longer send %s commands"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:905 + ["You can now send %s files"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:909 + ["You can no longer send %s files"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:915 + ["You can now snoop %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:919 + ["You can no longer snoop %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:925 + ["%s is ignoring you"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:929 + ["%s is no longer ignoring you"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:935 + ["%s has marked your connection as private"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:939 + ["%s has marked your connection as public"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:979 + ["%s has added you to the group %s"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:983 + ["%s has removed you from the chat group"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:1016 + ["Chat ID %ld is not connected."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:1033 + ["Cannot find connection \"%s\"."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:1062 + ["\n%s pastes to you: \n\n%s%s%s%s\n"] = + function (a, b, c, d, e) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:1072 + ["You paste to %s: \n\n%s%s%s%s"] = + function (a, b, c, d, e) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:1091 + ["\n%s pastes to everybody: \n\n%s%s%s%s\n"] = + function (a, b, c, d, e) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:1109 + ["You paste to everybody: \n\n%s%s%s%s"] = + function (a, b, c, d) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:1145 + ["Already sending file %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:1148 + ["Already receiving file %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:1210 + ["%s,%ld"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:1227 + ["Initiated transfer of file %s, %ld bytes (%1.1f Kb)."] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_speedwalks.cpp:140 + ["*Invalid direction '%c' in speed walk, must be N, S, E, W, U, D, F, or (something)"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_speedwalks.cpp:297 + ["Invalid direction '%c' in speed walk, must be N, S, E, W, U, D, F, or (something)"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_speedwalks.cpp:373 + ["&Discard %i Queued Command%s\tCtrl+D"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/scriptengine.cpp:87 + ["Script engine problem invoking subroutine \"%s\" when %s"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/scriptengine.cpp:136 + ["Wrong number of arguments for script subroutine \"%s\" when %s\n\nWe expected your subroutine to have %i argument%s"] = + function (a, b, c, d) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/scriptengine.cpp:142 + ["Unable to invoke script subroutine \"%s\" when %s"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/scriptengine.cpp:185 + ["Execution of line %i column %i"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/scriptengine.cpp:219 + ["Plugin: %s (called from world: %s)"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/scriptengine.cpp:224 + ["World: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/scripting.cpp:400 + ["The script file \"%s\" has been modified. Do you wish to re-process it?"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/scripting.cpp:432 + ["The %s subroutine named \"%s\" could not be found."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/scripting.cpp:436 + ["The %s (%s) subroutine named \"%s\" could not be found."] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/scripting/scripting.cpp:447 + ["There was a problem in script file \"%s\":"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/sendvw.cpp:1006 + ["Logout from this character on %s?"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/sendvw.cpp:1020 + ["Quit from %s?"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/sendvw.cpp:1328 + ["Replace your typing of\n\n\"%s\"\n\nwith\n\n\"%s\"?"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/sendvw.cpp:2152 + ["Are you SURE you want to clear all %i commands you have typed?"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/sendvw.cpp:2238 + ["No replacements made for \"%s\"."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/sendvw.cpp:2604 + ["Accelerator: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/serialize.cpp:48 + ["Opening world \"%s\""] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/telnet_phases.cpp:600 + +-- /cygdrive/c/source/mushclient/telnet_phases.cpp:858 + ["Could not reset zlib decompression engine: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/telnet_phases.cpp:603 + +-- /cygdrive/c/source/mushclient/telnet_phases.cpp:861 + ["Could not reset zlib decompression engine: %i"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/timers.cpp:178 + ["Timer: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/timers.cpp:200 + ["processing timer \"%s\""] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:225 + ["%i colour%s."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:275 + ["%-24s %-24s %-24s"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:280 + [" Normal #%i (%s)"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:286 + [" Bold #%i (%s)"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:300 + [" Custom #%2i (%s)"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:325 + ["%i entit%s."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:348 + ["%i server entit%s."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:381 + ["%i element%s."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:459 + ["%i server element%s."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:483 + ["%i action%s."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:507 + ["--- Command Window %i ---"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:517 + ["%i command%s."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:574 + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1947 + ["%i alias%s."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:645 + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1884 + ["%i trigger%s."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:782 + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2083 + ["%i variable%s."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:806 + ["%i array%s."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:821 + ["Name: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:822 + ["ID: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:823 + ["Purpose: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:824 + ["Author: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:825 + ["Disk file: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:826 + ["Language: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:827 + ["Enabled: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:828 + ["Sequence: %d"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:848 + ["Trigger %i: %s=%s"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:854 + +-- /cygdrive/c/source/mushclient/world_debug.cpp:880 + ["--> Script sub %s NOT active <--"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:860 + ["Alias %i: %s=%s"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:872 + ["Timer %i: %02i:%02i:%04.2f=%s"] = + function (a, b, c, d, e) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:886 + ["Variable %i: %s=%s"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:892 + ["<--- (end plugin \"%s\") --->"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:896 + ["%i plugin%s."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:908 + ["%i internal command%s."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:938 + ["%i info item%s."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:973 + ["MUSHclient version: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:975 + ["Compiled: %s."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:990 + ["Unknown (Platform %ld, Major %ld, Minor %ld)"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1038 + ["Operating system: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1041 + ["Libraries: %s, PCRE %s, PNG %s, SQLite3 %s, Zlib %s"] = + function (a, b, c, d, e) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1048 + ["World name: '%s', ID: %s"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1055 + ["Script language: %s, enabled: %s"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1059 + ["Scripting active: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1069 + ["Lua sandbox is %i characters, DLL loading allowed: %s"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1073 + ["Scripting prefix: '%s'. External editor in use: %s."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1076 + ["Editor path: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1083 + ["Scripting for: %1.6f seconds."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1118 + ["** Triggers: %ld in world file, triggers enabled: %s."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1131 + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1186 + [" %ld enabled, %ld regexp, %I64d attempts, %I64d matched, %1.6f seconds."] = + function (a, b, c, d, e) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1173 + ["** Aliases: %ld in world file, aliases enabled: %s."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1206 + ["** Timers: %ld in world file, timers enabled: %s."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1220 + [" %ld enabled, %I64d fired."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1223 + [" Timers checked every %i second(s)."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1225 + [" Timers checked every %0.1f seconds."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1250 + ["** Variables: %ld."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1266 + ["MCCP active, took %1.6f seconds to decompress"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1267 + ["MCCP received %I64d compressed bytes, decompressed to %I64d bytes."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1271 + ["MCCP compression ratio was: %6.1f%% (lower is better)"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1302 + ["ID: %s, '"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1319 + ["', (%s, %0.3f s) %s"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1418 + ["** Plugins: %ld loaded, %ld enabled."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1426 + ["Connect phase: %i (%s). NAWS wanted: %s"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1431 + ["Received: %I64d bytes (%I64d Kb)"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1432 + ["Sent: %I64d bytes (%I64d Kb)"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1433 + ["Received %I64d packets, sent %I64d packets."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1434 + ["Total lines received: %ld"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1436 + ["This connection: Sent %ld lines, received %ld lines."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1440 + ["Telnet (IAC) received: DO: %ld, DONT: %ld, WILL: %ld, WONT: %ld, SB: %ld"] = + function (a, b, c, d, e) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1466 + ["MXP active: %s, Pueblo mode: %s, Activated: %s"] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1471 + ["MXP tags received: %I64d"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1472 + ["MXP entities received: %I64d"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1473 + ["MXP errors: %I64d"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1495 + ["Commands in command history: %ld"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1496 + ["Speed walking enabled: %s. Speed walking prefix: %s"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1498 + ["Command stacking enabled: %s. Command stack character: '%s'"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1503 + ["Accelerators defined: %ld"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1550 + ["Window: '%s', at (%ld,%ld,%ld,%ld), shown: %s"] = + function (a, b, c, d, e, f) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1558 + [" width: %ld, height: %ld, position: %d, hotspots: %ld, fonts: %ld, images: %ld"] = + function (a, b, c, d, e, f) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1571 + ["** Miniwindows: %ld loaded, %ld shown."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1583 + ["Output pixels: width %ld, height: %ld, font width: %ld, font height: %ld"] = + function (a, b, c, d) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1587 + [" can show %ld characters, wrapping at column %ld, height %ld lines."] = + function (a, b, c) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1591 + ["Output buffer: %i of %ld lines."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1608 + ["Logging: %s, tracing: %s"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1617 + ["Database: '%s', disk file: '%s'"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1623 + ["** SQLite3 databases: %i"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1633 + ["Sound buffers in use: %ld"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1656 + ["Pane name = %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1657 + [" Pane title = %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1658 + [" Left = %i, Top = %i, Width = %i, Height = %i, Flags = %08X, Lines = %i"] = + function (a, b, c, d, e, f) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1676 + ["Line %i, Width = %i, Styles = %i, newline = %i"] = + function (a, b, c, d) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1698 + ["%i pane%s."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1796 + ["Plugin ID %s does not exist."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1805 + ["(For plugin: %s)"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:1808 + ["Warning: Plugin '%s' disabled."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2019 + [" %5s %02i:%02i:%04.2f"] = + function (a, b, c, d) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2028 + [" - firing in %8.1f seconds."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2035 + ["%i timer%s."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2118 + ["%i callback%s."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2170 + ["%i accelerator%s."] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2265 + ["Trigger %s does not exist."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2335 + ["Alias %s does not exist."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2403 + ["Timer %s does not exist."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2506 + ["Unable to edit the script file %s."] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/world_debug.cpp:2521 + ["DebugHelper: %s, %s"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/worldsock.cpp:125 + ["--- Connected for %i day%s, %i hour%s, %i minute%s, %i second%s. ---"] = + function (a, b, c, d, e, f, g, h) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/worldsock.cpp:139 + ["--- Received %i line%s, sent %i line%s."] = + function (a, b, c, d) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/worldsock.cpp:146 + ["--- Output buffer has %i/%i line%s in it (%.1f%% full)."] = + function (a, b, c, d, e) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/worldsock.cpp:155 + ["--- Matched %i trigger%s, %i alias%s, and %i timer%s fired."] = + function (a, b, c, d, e, f) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/worldsock.cpp:165 + ["The \"%s\" server has closed the connection"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/xml/xml_load_world.cpp:214 + ["Time taken to %s = %15.8f seconds\n"] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/xml/xml_load_world.cpp:614 + ["Line %4i: %s (%s)%s"] = + function (a, b, c, d) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/xml/xml_load_world.cpp:668 + ["Attribute not used: %s=\"%s\""] = + function (a, b) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/xml/xml_load_world.cpp:684 + ["Tag not used: <%s>"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/xml/xml_load_world.cpp:752 + ["Loading plugin: %s"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/xml/xml_load_world.cpp:1048 + +-- /cygdrive/c/source/mushclient/xml/xml_load_world.cpp:1114 + +-- /cygdrive/c/source/mushclient/xml/xml_load_world.cpp:1145 + ["option '%s' not set"] = + function (a) + + return "" + end, -- function + +-- /cygdrive/c/source/mushclient/xml/xml_load_world.cpp:2418 + ["%s loading plugin %s ..."] = + function (a, b) + + return "" + end, -- function + } -- end formatted + +-- Date and time strings + +times = { + +-- /cygdrive/c/source/mushclient/TextView.cpp:529 + ["%A, %#d %B %Y, %#I:%M %p"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:514 + +-- /cygdrive/c/source/mushclient/doc.cpp:3014 + +-- /cygdrive/c/source/mushclient/doc.cpp:6906 + +-- /cygdrive/c/source/mushclient/mushview.cpp:3954 + +-- /cygdrive/c/source/mushclient/plugins.cpp:997 + +-- /cygdrive/c/source/mushclient/scripting/methods/methods_chat.cpp:700 + +-- /cygdrive/c/source/mushclient/xml/xml_save_world.cpp:52 + ["%A, %B %d, %Y, %#I:%M %p"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:5685 + ["%A, %B %d, %Y, %#I:%M:%S %p"] = + "", + +-- /cygdrive/c/source/mushclient/doc.cpp:6813 + ["--- Connected on %A, %B %d, %Y, %#I:%M %p ---"] = + "", + +-- /cygdrive/c/source/mushclient/mushview.cpp:4488 + ["%A, %B %d, %#I:%M:%S %p"] = + "", + +-- /cygdrive/c/source/mushclient/scripting/lua_scripting.cpp:436 + ["\n\n--- Scripting error on %A, %B %d, %Y, %#I:%M %p ---\n\n"] = + "", + +-- /cygdrive/c/source/mushclient/world_debug.cpp:976 + ["Time now: %A, %B %d, %Y, %#I:%M %p"] = + "", + +-- /cygdrive/c/source/mushclient/worldsock.cpp:118 + ["--- Disconnected on %A, %B %d, %Y, %#I:%M %p ---"] = + "", + } -- end times + +-- Dialog headings + +headings = { + +-- /cygdrive/c/source/mushclient/ActivityView.cpp:108 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:229 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:271 + ["Seq"] = + "", + +-- /cygdrive/c/source/mushclient/ActivityView.cpp:109 + ["World"] = + "", + +-- /cygdrive/c/source/mushclient/ActivityView.cpp:110 + ["New"] = + "", + +-- /cygdrive/c/source/mushclient/ActivityView.cpp:111 + ["Lines"] = + "", + +-- /cygdrive/c/source/mushclient/ActivityView.cpp:112 + ["Status"] = + "", + +-- /cygdrive/c/source/mushclient/ActivityView.cpp:113 + ["Since"] = + "", + +-- /cygdrive/c/source/mushclient/ActivityView.cpp:114 + ["Duration"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/ColourPickerDlg.cpp:242 + ["Colour name"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/LuaChooseList.cpp:56 + +-- /cygdrive/c/source/mushclient/dialogs/LuaChooseListMulti.cpp:52 + ["Main column"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/chat/ChatListDlg.cpp:164 + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginWizard.cpp:220 + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginWizard.cpp:400 + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginWizard.cpp:583 + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginWizard.cpp:820 + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginsDlg.cpp:107 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:694 + ["Name"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/chat/ChatListDlg.cpp:165 + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginWizard.cpp:223 + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginWizard.cpp:403 + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginWizard.cpp:586 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:232 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:274 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:614 + ["Group"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/chat/ChatListDlg.cpp:166 + ["From IP"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/chat/ChatListDlg.cpp:167 + ["Call IP"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/chat/ChatListDlg.cpp:168 + ["Call Port"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/chat/ChatListDlg.cpp:169 + ["Flags"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginWizard.cpp:221 + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginWizard.cpp:401 + ["Match"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginWizard.cpp:222 + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginWizard.cpp:402 + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginWizard.cpp:585 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:230 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:272 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:612 + ["Send"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginWizard.cpp:584 + ["Time"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginWizard.cpp:821 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:695 + ["Contents"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginsDlg.cpp:108 + ["Purpose"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginsDlg.cpp:109 + ["Author"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginsDlg.cpp:110 + ["Language"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginsDlg.cpp:111 + ["File"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginsDlg.cpp:112 + ["Enabled"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/plugins/PluginsDlg.cpp:113 + ["Ver"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:228 + ["Alias"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:231 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:273 + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:613 + ["Label"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:270 + ["Trigger"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:610 + ["Type"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:611 + ["When"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/configuration.cpp:615 + ["Next"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:2370 + ["Macro name"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:2371 + ["Text"] = + "", + +-- /cygdrive/c/source/mushclient/dialogs/world_prefs/prefspropertypages.cpp:2372 + ["Action"] = + "", + } -- end headings + diff --git a/cosmic rage/locale/count_locale_usage.lua b/cosmic rage/locale/count_locale_usage.lua new file mode 100644 index 0000000..99538a4 --- /dev/null +++ b/cosmic rage/locale/count_locale_usage.lua @@ -0,0 +1,88 @@ + +-- make copy of original tables +orig_messages = messages +orig_formatted = formatted +orig_times = times +orig_headings = headings + +-- empty them out so __index is triggered +-- save original tables so we can look them up eventually + +messages = { _orig = orig_messages } +formatted = { _orig = orig_formatted } +times = { _orig = orig_times } +headings = { _orig = orig_headings } + +counts = {} -- keep counts here + +-- metatable for messages, titles, headings +mt_static = { + -- called to access an entry + __index= + function (t, name) + local s = rawget (t._orig, name) + if s == nil or #s == 0 then + counts [name] = (counts [name] or 0) + 1 + end -- not translated yet + return s + end; + } + +-- metatable for formatted messages +mt_formatted = { + -- called to access an entry + __index= + function (t, name) + local f = rawget (t._orig, name) + -- no function? not translated then + if f == nil then + counts [name] = (counts [name] or 0) + 1 + return nil + end + assert (type (f) == "function") + + -- return a function, that will count if the original function + -- returns an empty string + return function (...) + local s = f (...) -- call original function + if type (s) ~= "string" or #s == 0 then + counts [name] = (counts [name] or 0) + 1 + end -- not translated + return s -- return translated value + end -- function + end; + } + +-- apply the metatables +setmetatable (messages, mt_static) +setmetatable (times, mt_static) +setmetatable (headings, mt_static) +setmetatable (formatted, mt_formatted) + +-- the user will call world.TranslateDebug to invoke this +function Debug () + + -- for sorting + local t = {} + + -- build into table which can be sorted + for k, v in pairs (counts) do + table.insert (t, k) + end -- for + + -- clear out notepad, make heading + utils.appendtonotepad ("translation", "Translation counts\n\n", true) + + -- sort into descending order + table.sort (t, function (a, b) + return counts [a] > counts [b] + end) + + -- display results + for k, v in ipairs (t) do + utils.appendtonotepad ("translation", string.format ("%4i: %q \n", counts [v], v)) + end -- for + +end -- Debug + + diff --git a/cosmic rage/locale/detect_locale_changes.lua b/cosmic rage/locale/detect_locale_changes.lua new file mode 100644 index 0000000..8fb7caa --- /dev/null +++ b/cosmic rage/locale/detect_locale_changes.lua @@ -0,0 +1,67 @@ +-- stuff already localized +locale = "en" -- change to suit you + +dofile (locale .. ".lua") + +-- make copy +original = { + messages = messages, + formatted = formatted, + times = times, + headings = headings + } + +messages, formatted, times, headings = nil + +-- from distribution +dofile ("Localize_template.lua") + +-- make copy +distribution = { + messages = messages, + formatted = formatted, + times = times, + headings = headings + } + +messages, formatted, times, headings = nil + +function compare_table (name) + local count = 0 + local old = original [name] + local new = distribution [name] + + print ("Processing table", name) + print "" + + -- new message is in distribution, but not in already localized file + for k, v in pairs (new) do + if not old [k] then + count = count + 1 + print (string.format (" New message: %q", k)) + end -- if not there + end -- for + + + print ("Found ", count, " new messages") + print "" + + count = 0 + + -- old message is in already localized file, but not in distribution + for k, v in pairs (old) do + if not new [k] then + count = count + 1 + print (string.format (" Deleted message: %q", k)) + end -- if not there + end -- for + + print ("Found ", count, " deleted messages") + print "" + +end -- compare_table + +compare_table ("messages") +compare_table ("formatted") +compare_table ("times") +compare_table ("headings") diff --git a/cosmic rage/locale/en.dll b/cosmic rage/locale/en.dll new file mode 100644 index 0000000..cbf2e20 Binary files /dev/null and b/cosmic rage/locale/en.dll differ diff --git a/cosmic rage/locale/en_small.dll b/cosmic rage/locale/en_small.dll new file mode 100644 index 0000000..f542396 Binary files /dev/null and b/cosmic rage/locale/en_small.dll differ diff --git a/cosmic rage/locale/locale_notes.txt b/cosmic rage/locale/locale_notes.txt new file mode 100644 index 0000000..679056a --- /dev/null +++ b/cosmic rage/locale/locale_notes.txt @@ -0,0 +1,84 @@ +Localization notes +------------------ + +Author: Nick Gammon +Date: 18th June 2007 +Amended: 27th May 2008 to mention large/small monitor handling + + +In the "locale" directory - which is a subdirectory under where the MUSHclient.exe program is stored, you should find the following files in the standard MUSHclient distribution: + +* locale_notes.txt --> this file + +* Localize_template.lua --> template for creating a new translation file + +* en.dll --> resources for MUSHclient - in English (for screen resolution 1024 x 768 or larger) + +* en_small.dll --> resources for MUSHclient - in English (for small screen resolutions) + +* count_locale_usage.lua --> Lua script for counting which messages need translating the most + +* detect_locale_changes.lua --> Lua script for detecting changes between one MUSHclient distribution and the next + + +See the following forum posting for detailed descriptions about localizing MUSHclient: + +http://www.gammon.com.au/forum/?id=7953 + + +To localize +----------- + +If you are planning to localize to another language, you would take these steps. Let us take French as an example, which has a locale code of FR. + +1. Copy en.dll as fr.dll (make a copy, rename the copy fr.dll) + +NOTE: You now have two resource files (en.dll and en_small.dll). One is designed for small monitors and one for larger ones. Use the appropriate file depending on the size monitor you plan to use. + + +2. Copy Localize_template.lua as fr.lua (make a copy, rename the copy fr.lua) + +3. Use a resource editor (search the Internet for an appropriate tool) and edit fr.dll, changing menus, dialogs, and string resources to have the appropriate translations. + +An alternative is to download the Visual Studio project which built the resources file, change that with an appropriate tool (eg. Visual Studio) and recompile to build a new DLL from scratch. + +4. Use a text editor (such as Crimson Editor) to edit the fr.lua file, translating the "empty" strings for each message, into French. Read the forum posting mentioned above for how to handle the "formatted" part. + +You can get Crimson Editor from: + +http://www.crimsoneditor.com/ + +Make sure you set the Document Encoding type to UTF-8 (w/o BOM). + +---- + +To test, change the locale code in the MUSHclient Global Preferences -> General tab, to "FR". + +Then close and re-open MUSHclient. It should now detect the new files and show the translated messages. + + + +Counting translation usage +-------------------------- + +As there are around 750 messages to be translated in the Localize_template.lua file, you may prefer to concentrate on the ones that occur most frequently. + +To find out what they are, edit your xx.lua file (eg. fr.lua) and add this line to the bottom: + +dofile "locale/count_locale_usage.lua" + +This adds the extra debugging code into your local file. Then, after you have been using MUSHclient for a while, you can enter the following script command: + +/TranslateDebug () + +This will display which messages were called upon to be translated, sorted into most frequent first, to least frequent. + + + +Checking if new messages appear +------------------------------- + +With each new release of MUSHclient, you can check if new messages have been added to the file Localize_template.lua by running the Lua script detect_locale_changes.lua. This compares the messages in your locale file (eg. en.lua) to the new template file (ie. Localize_template.lua) and reports on any new ones. + + + diff --git a/cosmic rage/lua/InfoBox.lua b/cosmic rage/lua/InfoBox.lua new file mode 100644 index 0000000..cd99706 --- /dev/null +++ b/cosmic rage/lua/InfoBox.lua @@ -0,0 +1,1678 @@ +--[=[-- +InfoBox.lua version 1.2 +Encapsulates and enhances Infobar functionality into miniwindows; gauges and status text. +14-DEc-08 + +by: WillFa (Spellbound on 3k.org:3000) + portions borrowed or adapted from samples by Nick Gammon. + +License: Free for public use in your MushClient plugins and scripts as long as credit for this module is + attributed to WillFa, and Nick Gammon. + +Assumes that the Sylfaen font is installed on the system. Change line 67 if it is not. + +Requires: MushClient v. 4.37+ for complete functionality. (CloseWindow() uses DeleteWindow MC function.) + MushClient v. 4.35+ for basic functionality. (WindowGradient calls) + +Usage: + require "InfoBox" + MW = InfoBox:New() + MW:AddBar("text", percent, "green", "red") + MW:Update() + + Tutorial Demo can be found in the included InfoBox_Demo.xml plugin. + + Reference help for functions and values you will actually use can be obtained from the Doc() function. + i.e.: + InfoBox:Doc() + InfoBox:Doc("AddBar") + + + General Usage is more easily deduced by tprint(InfoBox), tprint(MW), tprint(MW.Bar) rather than reading this source. + The metatables are setup in such a way that tprint will not recurse up the inheritance chain and spam you. +--]=]-- + +local world, colour_names = world, colour_names, _M +local os = {time = os.time} +local math, string, table, bit = math, string, table, bit +local tonumber, tostring, rawget, rawset, type, print = tonumber, tostring, rawget, rawset, type, print +local unpack, assert, require, getmetatable, setmetatable = unpack, assert, require, getmetatable, setmetatable +local pairs, ipairs, check = pairs, ipairs, check +local Global = _G +local capitalize, CalcShades, SplitRGB, idx, newidx +local CalcWindowHeight, strip_colours, sidewindows, Draw, DoFade, PrintText, ResizeOutput +local fontProps = {"fontID", "fontName", "fontSize", "fontBold", "fontItalic", "fontUnderline", "fontStrikeout", "fontCharset", "fontPitchAndFamily"} +local commas, CheckStyle, DoFade, PrintText +local matteHilight, matteShadow, Bar, ansiCodes, ansiColors, _Doc + +module(...) + +setmetatable ( _M, {__index = world, class = "module"}) -- find all the MushClient Functions + +windowWidth = 240 +windowHeight = 7 -- this will change as more bars are added. It gives 5 pixels padding top and bottom. + +columns = 0 +rows = 0 +axis = "rows" + +backgroundColour = 0x808080 +matteHilight = 0xb2b2b2 +matteShadow = 0x4e4e4e + +windowPosition = 7 +windowFlags = 0 + +fontID = "fn" +fontName = "Sylfaen" +fontSize = 10 +fontPadding = 2 +fontBold = true +fontItalic = false +fontUnderline = false +fontStrikeout = false +fontCharset = 1 +fontPitchAndFamily = 0 + +displaceOutput = false + +ansiCodes = {"k", "r", "g", "y", "b", "m", "c", "w"} +ansiColors = {} -- Gets populated after capitalize() is defined. +customColourCodes = {} + +-- Enumeration tables + +textStyles = { plain = 0, + matte = 1, + raised = 2, + sunken = 4 + } + +barStyles = { textOnly = 0, -- Status line + sunken = 1, -- Frames + raised = 2, + raisedCap = 2^2, -- Caption is framed too. + flat = 2^3, + glass = 2^4, + solid = 2^5, -- Fills + gradientScale = 2^6, -- gradient midpoint is value/2. Fill shrinks + gradientFixed = 2^7, -- gradient midpoint is always threshold. + gradientShift = 2^8, -- Thermometer style; Fill remains 100%, gradient position shifts wth value + } + +captionPlacements = { left = 0, + innerLeft = 1, + innerRight = 2, + right = 3, + center = 4, + centerCell = 5, + } + +windowPositions = { NW = 4, + N = 5, + NE = 6, + E = 7, + SE = 8, + S = 9, + SW = 10, + W = 11, + } + +-- End Enumerations + + +-- Bar Functions/Methods +Bar = { --Properties + textStyle = 0, + threshold = 30, + textColour = 0x222222 , + "Caption", -- 1 = "Caption" see InsertBars() for the tricky code that this uses. + caption = "", + "Value", -- 2 = "Value" see InsertBars() + value = 0, + "GoodColour", -- 3 = ... + goodColour = 0x00DD00, + "BadColour", -- 4 = ... + badColour = 0x0000DD, + "AnchorRight", -- 5 = ... + anchorRight = false, + "BarStyle", -- 6 = ... + barStyle = 33, + gaugeLeft = 5 , + captionPlacement = 1, + padding = 3, + cellPadding = 4, + + --End Properties + } +setmetatable (Bar, {__index = _M, class = "bar"}) + +--[=[ Internal Function that writes captions ]=]-- +function PrintText (self, vOffset, hOffset) + --TraceOut (string.format("%s: Window %s Bar %i", "PrintText", self.windowName, self.id)) + local MatteText = strip_colours(self.caption) + local width = WindowTextWidth (self.parent.windowName, self.fontID, MatteText) + local side = 0 + if self.matteHilight == nil then + self.matteHilight, self.matteShadow = self.backgroundColour,self.backgroundColour + for i = 1,10 do + self.matteHilight = AdjustColour(self.matteHilight,2) + self.matteShadow = AdjustColour(self.matteShadow,3) + end end + vOffset = vOffset + self.fontPadding + if self.captionPlacement == 0 then + side = hOffset + self.gaugeLeft - WindowTextWidth ( self.parent.windowName, self.fontID, MatteText) -2 + elseif self.captionPlacement == 1 then + side = hOffset + self.gaugeLeft + 5 + elseif self.captionPlacement == 2 then + side = hOffset + self.gaugeLeft + self.gaugeWidth - width - 5 + elseif self.captionPlacement == 3 then + side = hOffset + self.gaugeLeft + self.gaugeWidth + 2 + elseif self.captionPlacement == 4 then + side = hOffset + self.gaugeLeft + ( (self.gaugeWidth-WindowTextWidth ( self.parent.windowName, self.fontID, MatteText) )/2) + elseif self.captionPlacement == 5 then + side = math.floor(hOffset + (self.cellWidth-WindowTextWidth ( self.parent.windowName, self.fontID, MatteText) ) / 2) + end + if self.barStyle == 0 then + if self.captionPlacement > 3 then + side = hOffset + math.floor( (self.cellWidth-WindowTextWidth ( self.parent.windowName, self.fontID, MatteText) ) / 2) + elseif self.captionPlacement < 2 then + side = hOffset + 5 + elseif self.captionPlacement > 1 then + side = hOffset + self.parent.cellWidth - width - 5 + end end + if self.textStyle > 0 then + if (self.textStyle % 2) == 1 then -- Matted + WindowText (self.parent.windowName, self.fontID, MatteText, side +1 , vOffset -1, 0, 0, self.backgroundColour) + -- Upper Right Matte + WindowText (self.parent.windowName, self.fontID, MatteText, side -1 , vOffset +1, 0, 0, self.backgroundColour) + -- Lower Left Matte + if self.textStyle == self.textStyles.matte then -- Only Matted + WindowText (self.parent.windowName, self.fontID, MatteText, side -1 , vOffset -1, 0, 0, self.backgroundColour) + -- Top Left Matte + WindowText (self.parent.windowName, self.fontID, MatteText, side +1 , vOffset +1, 0, 0, self.backgroundColour) + -- Bottom Right Matte + end + end + if bit.band(self.textStyle, self.parent.textStyles.raised) == self.textStyles.raised then -- Raised + WindowText (self.parent.windowName, self.fontID, MatteText, side +1 , vOffset +1, 0, 0, self.matteShadow) + -- Bottom Left Shadow + WindowText (self.parent.windowName, self.fontID, MatteText, side -1 , vOffset -1, 0, 0, self.matteHilight ) + -- Top Left hilight + end + if bit.band(self.textStyle, self.textStyles.sunken) == self.textStyles.sunken then -- Sunken + WindowText (self.parent.windowName, self.fontID, MatteText, side -1 , vOffset -1, 0, 0, self.matteShadow) + -- Top Left Shadow + WindowText (self.parent.windowName, self.fontID, MatteText, side +1 , vOffset +1, 0, 0, self.matteHilight) + -- Bottom Left Hilight + end end + if self.caption == MatteText then + WindowText (self.parent.windowName, self.fontID, self.caption, side , vOffset, side + width, vOffset + self.fontHeight, self.textColour) -- Text + else + ansiColors["~"] = self.textColour + local customColours = self.customColourCodes or {} + local Text = string.gsub (self.caption or "", "@@", "\0") -- change @@ to 0x00 + if Text:sub (1, 1) ~= "@" then + Text = "@~" .. Text + end + for colour, text in Text:gmatch ("@([%a~])([^@]+)") do + text = text:gsub ("%z", "@") -- put any @ characters back + if #text > 0 then + side = side + WindowText (self.windowName, self.fontID, text, side, vOffset, hOffset + self.cellWidth, vOffset + self.fontHeight, customColours[colour] or ansiColors[colour] or ansiColors["~"]) + end end end + return vOffset - self.fontPadding +end + +--[=[ Internal Function that does bitmask checking ]=]-- +function CheckStyle(self, style) + --TraceOut (string.format("%s: Window %s Bar %i", "CheckStyle", self.windowName, self.id)) + if bit.band(self.barStyle, style) > 0 then + return true + else + return false +end end + +--[=[ Internal Function that draws the pretty boxes ]=]-- +function Draw (self, vOffset, hOffset) + --TraceOut (string.format("%s: Window %s Bar %i", "Draw", self.windowName, self.id)) + self.cellTop, self.cellLeft = vOffset , hOffset + WindowRectOp (self.windowName , 2, self.cellLeft, self.cellTop - 1 , self.cellLeft + self.cellWidth , self.cellTop + self.cellHeight + self.padding - 2 , self.backgroundColour, nil) + local Percent = self.value or 0 + local colour, fcolour + if Percent < self.threshold then + colour = self.badColour + elseif Percent > 100 then + Percent = 100 + for i = 1,15 do + colour = AdjustColour(self.goodColour,4) -- 20% more luminence + end + else + colour = self.goodColour + end + if self.fade == true then + colour = DoFade(self) + fcolour = colour + end + local pixels = self.gaugeWidth * Percent / 100 + if self.barStyle > 0 then + local bezel = {[true] = 10, [false] = 5} + local frameLeft = self.cellLeft + self.gaugeLeft + local frameTop = self.cellTop + self.cellHeight - self.gaugeHeight + local frameRight = self.cellLeft + self.gaugeLeft + self.gaugeWidth + local frameBottom = self.cellTop + self.cellHeight + local topX, topY, bottomX, bottomY = frameLeft + 2, frameTop + 2 , self.cellLeft + self.gaugeLeft + pixels, frameBottom - 2 + local colorL, colorR = self.badColour, (fcolour or self.goodColour) + local ftopX, ftopY, fbottomX, fbottomY = bottomX + 1, frameTop, frameRight, frameBottom --fill region for fixed gradients + if self.anchorRight == true then + topX , topY = frameRight - pixels , frameTop + 2 + bottomX, bottomY = frameRight - 2, frameBottom - 2 + ftopX , ftopY = frameLeft , frameTop + fbottomX, fbottomY = frameRight - pixels - 2, frameBottom + colorL, colorR = (fcolour or self.goodColour), self.badColour + end + if bit.band(barStyles.raisedCap, self.barStyle) == barStyles.raisedCap then + if self.captionPlacement == 0 then + frameLeft = self.cellLeft + 3 + elseif self.captionPlacement == 3 then + frameRight = self.cellLeft + self.cellWidth -3 + end end + if Percent >= 1 then + if CheckStyle(self, self.barStyles.solid) then + check (WindowRectOp (self.parent.windowName, 2, topX , topY , bottomX , bottomY , colour) ) + elseif CheckStyle(self, self.barStyles.gradientScale) then -- scaled gradient fills + check (WindowGradient (self.parent.windowName, topX, topY, bottomX, bottomY, colorL, colorR, 1 ) ) + elseif CheckStyle(self, self.barStyles.gradientFixed) then -- fixed gradients. + local padWidth, padFillColour = self.gaugeWidth * ( (math.abs(50-self.threshold) *2)/100), (fcolour or self.goodColour) + if self.threshold > 50 then + padFillColour = self.badColour + end + check (WindowRectOp (self.parent.windowName, 2, topX , topY , bottomX, bottomY, padFillColour) ) + if ( (self.anchorRight == false) and (self.threshold <= 50) ) or + ( (self.anchorRight == true) and (self.threshold > 50) ) then --need more colorR than colorL + check (WindowGradient (self.parent.windowName, self.cellLeft + self.gaugeLeft, frameTop, frameRight - padWidth, bottomY, colorL, colorR, 1 ) ) + elseif ( (self.anchorRight == true) and (self.threshold <= 50) ) or + ( (self.anchorRight == false) and (self.threshold > 50) ) then --need more colorL than colorR + check (WindowGradient (self.parent.windowName, self.cellLeft + self.gaugeLeft + padWidth, topY, frameRight -2, bottomY, colorL, colorR, 1 ) ) + end + check (WindowRectOp (self.parent.windowName, 2, ftopX , ftopY , fbottomX , fbottomY -1 , self.backgroundColour) ) + elseif CheckStyle(self, self.barStyles.gradientShift) then -- Thermometer gradients. + local midpointX = bottomX + local pixel = self.gaugeWidth / 100 + local gradientWidth = math.min(30, (100 - self.value) * pixel, self.value * pixel) + if self.anchorRight == true then + colorL, colorR = (fcolour or self.goodColour), self.badColour + midpointX = topX + end + check (WindowRectOp (self.parent.windowName, 2, topX , topY , bottomX , bottomY, (fcolour or self.goodColour) ) ) + check (WindowRectOp (self.parent.windowName, 2, ftopX, ftopY , fbottomX, bottomY, self.badColour) ) + check (WindowGradient (self.parent.windowName, midpointX - gradientWidth, topY, midpointX + gradientWidth, bottomY, colorR, colorL, 1 ) ) + check (WindowRectOp (self.parent.windowName, 2, self.cellLeft + 1, self.cellTop, self.cellLeft + self.gaugeLeft, self.cellTop + self.cellHeight , self.backgroundColour) ) + check (WindowRectOp (self.parent.windowName, 2, frameRight, frameTop, -2, frameBottom, self.backgroundColour) ) + end + if CheckStyle(self, self.barStyles.glass) then -- glass frame + local glassWidth, dtX,dtY, dbX, dbY = pixels, topX, topY, bottomX, bottomY + if CheckStyle(self, self.barStyles.gradientShift) then + glassWidth = self.gaugeWidth + dtX, dtY, dbX, dbY = frameLeft + 2, frameTop + 1, frameRight - 2, frameBottom -1 + end + check (WindowCreate ( self.parent.windowName .. "glass", 0,0, glassWidth, self.cellHeight - 2, 7, 0, 0x171717) ) + check (WindowGradient(self.parent.windowName .. "glass", 0,0, 0, self.cellHeight * .50, 0x606060, 0xaaaaaa, 2) ) + check (WindowGradient(self.parent.windowName .. "glass", 0,self.cellHeight * .51, 0, self.cellHeight -2, 0x7c7c7c, 0x393939, 2) ) + check (WindowImageFromWindow ( self.parent.windowName, self.parent.windowName .. "glass", self.parent.windowName .. "glass") ) + check (WindowBlendImage ( self.parent.windowName, self.parent.windowName .. "glass", dtX, dtY, dbX, dbY, 21, .45) ) + elseif CheckStyle(self, barStyles.raised + barStyles.raisedCap + barStyles.sunken) then -- 3D frame rectangle + check (WindowRectOp (self.parent.windowName, 5, topX , topY , bottomX, bottomY, bezel[not CheckStyle(self, barStyles.sunken + barStyles.glass)] ,0x100F) ) + end end + if bit.band( self.barStyle , 31 ) ~= 0 then -- frame rectangle on border + local pen = {[true]=1,[false]=5} + check (WindowRectOp (self.parent.windowName, pen[CheckStyle(self, self.barStyles.flat)], frameLeft, frameTop, frameRight, frameBottom, bezel[not CheckStyle(self, barStyles.raised + barStyles.raisedCap)], 15+0x1000) ) + end end + PrintText (self, self.cellTop, self.cellLeft) + if type(self.button) == 'table' then + WindowAddHotspot(self.windowName, self.id, self.cellLeft, self.cellTop, self.cellLeft + self.cellWidth, self.cellTop + self.cellHeight, + self.button.mouseOver or "", self.button.cancelMouseOver or "", self.button.mouseDown or "", self.button.cancelMouseDown or "", + self.button.mouseUp or "", self.button.tooltipText or "", self.button.cursor or 0, 0 ) + + end + return self.cellTop + self.cellHeight + self.padding +end + +--[=[ Internal Function that calculates different shades of colors ]=]-- +function DoFade(self) + --TraceOut (string.format("%s: Window %s Bar %i", "DoFade", self.windowName, self.id)) + local color + if self.shades == nil or (self.Bar.shades and self.goodColour ~= self.Bar.goodColour and self.badColour ~= self.Bar.badColour) then + self.shades = CalcShades(self, math.ceil(100 - self.threshold)/5) + end + if self.value >= self.threshold then + color = self.shades[math.ceil( (101-self.value)/5 )] or self.shades[#self.shades] + else + color = self.badColour + end + return color +end + + +--[=[ See :Doc( "Fade" ) --]=]-- +function Bar:Fade (bool) + assert(bool and type(bool)=="boolean", "Boolean expected. Got " .. tostring( bool ) .. "(" .. type(bool) .. ")") + self.fade = bool + self.shades = nil + if bool then + DoFade(self) + end +end + + +--[=[ See :Doc( "TextColour" ) --]=]-- +function Bar:TextColour (x) + --TraceOut (string.format("%s: Window %s Bar %i", "TextColour", self.windowName, self.id)) + local n = tonumber(x) or tonumber(x,16) or ColourNameToRGB(x) + assert(n and n~= -1,'Bad value passed. Acceptable examples: "red", 255, 0x0000ff, "#FF0000" - Got '.. tostring(x) .. '('.. type(x) ..')') + self.textColour = n +end + +--[=[ See :Doc( "ColourText" ) --]=]-- +function Bar:ColourText(val, thresh, good, bad, neut) + --TraceOut (string.format("%s: Window %s Bar %i", "ColourText", self.windowName, self.id)) + local n = tonumber(thresh) + if n then + if val == thresh then + self:TextColour(neut or good) + elseif val < thresh then + self:TextColour(bad) + else + self:TextColour(good) +end end end + +--[=[ See :Doc( "GoodColour" ) --]=]-- +function Bar:GoodColour (x) + --TraceOut (string.format("%s: Window %s Bar %i", "GoodColour", self.windowName, self.id)) + local n = tonumber(x) or ColourNameToRGB(x) + assert(n and n~= -1,'Bad value passed. Acceptable examples: "red", 255, 0x0000ff, "#FF0000" - Got '.. tostring(x) .. '('.. type(x) ..')') + self.goodColour = n + self.shades = nil +end + +--[=[ See :Doc( "BadColour" ) --]=]-- +function Bar:BadColour (x) + --TraceOut (string.format("%s: Window %s Bar %i", "BadColour", self.windowName, self.id)) + local n = tonumber(x) or ColourNameToRGB(x) + assert(n and n~= -1,'Bad value passed. Acceptable examples: "red", 255, 0x0000ff, "#FF0000" - Got '.. tostring(x) .. '('.. type(x) ..')') + self.badColour = n + self.shades = nil +end + +--[=[ See :Doc( "AnchorRight" ) --]=]-- +function Bar:AnchorRight (bool) + --TraceOut (string.format("%s: Window %s Bar %i", "AnchorRight", self.windowName, self.id)) + if type(bool) == "boolean" then + bool = bool + else + bool = false + end + self.anchorRight = bool + if bool == false then + self.captionPlacement = 1 + else + self.captionPlacement = 2 +end end + +--[=[ See :Doc( "Value" ) --]=]-- +function Bar:Value (val) + --TraceOut (string.format("%s: Window %s Bar %i", "Value", self.windowName, self.id)) + self.value = tonumber(val) or self.value + self.watchValue = nil +end + +--[=[ See :Doc( "Caption" ) --]=]-- +function Bar:Caption (txt) + --TraceOut (string.format("%s: Window %s Bar %i", "Caption", self.windowName, self.id)) + self.watchCaption = nil + if tonumber(txt) then + self.caption = commas(txt) + elseif txt == nil then + self.caption = "" + else + self.caption = txt + end +end + +--[=[ See :Doc( "TextStyle" ) --]=]-- +function Bar:TextStyle (x) + --TraceOut (string.format("%s: Window %s Bar %i", "TextStyle", self.windowName, self.id)) + self.textStyle = tonumber(x) or 1 +end + +--[=[ See :Doc( "Threshold" ) --]=]-- +function Bar:Threshold (x) + --TraceOut (string.format("%s: Window %s Bar %i", "Threshold", self.windowName, self.id)) + self.threshold = tonumber(x) or 30 + self.shades = nil +end + +--[=[ See :Doc( "BarStyle" ) --]=]-- +function Bar:BarStyle (x) + --TraceOut (string.format("%s: Window %s Bar %i", "BarStyle", self.windowName, self.id)) + assert ( tonumber(x) and tonumber(x) >= 0, "Invalid barstyle.") + self.barStyle = tonumber(x) +end + +--[=[ See :Doc( "Padding" ) --]=]-- +function Bar:Padding (x) + --TraceOut (string.format("%s: Window %s Bar %i", "Padding", self.windowName, self.id)) + assert( tonumber(x), "Number of pixels needed. Got " .. type(x) ) + local MiniWindow = self.parent or self + self.padding = tonumber(x) + MiniWindow:Resize() +end + +--[=[ See :Doc( "WatchValue" ) --]=]-- +function Bar:WatchValue (varName) + --TraceOut (string.format("%s: Window %s Bar %i", "WatchValue", self.windowName, self.id)) + self.value = nil + self.watchValue = varName +end + +--[=[ See :Doc( "WatchCaption" ) --]=]-- +function Bar:WatchCaption (varName) + --TraceOut (string.format("%s: Window %s Bar %i", "WatchCaption", self.windowName, self.id)) + self.caption = nil + self.watchCaption = varName +end + +--[=[ Internal Function that hides in metatables ]=]-- +local function idx (self, k) + local varName, val = rawget (self, "watch" .. capitalize(k) ) or "" + if (k == "value" or k == "caption" ) then + for z in varName:gmatch("([^%.%[%]]+)") do + local parent = val or Global + z = tonumber(z) or z + val = parent[z] + end + return val + else + local Parent = getmetatable(self)["parent"] --parent is hidden in a metatable so it doesn't tprint. Hooray for aesthetically pleasing wastes of processor cycles. + val = rawget (self, k) + val = val or Parent[k] + return val +end end + +--[=[ Internal Function that hides in metatables ]=]-- +local function newidx (self, k, v) + if (k == "value" and rawget (self,watchValue) ) or (k == "caption" and rawget (self, watchCaption) ) then + self["watch" .. capitalize(k)] = nil + end + rawset(self, k, v) +end + + +-- End Bar Functions + + +-- Global Functions + +--[=[ See :Doc( "New" ) --]=]-- +function _M:New (winName) + --TraceOut (string.format("%s: Window %s", "New", winName)) + local mt = { + __index = + function (self, key) + if key == "cellWidth" then + return self.windowWidth / self.columns + elseif key == "gaugeWidth" then + return self.cellWidth - 10 + else + return _M[key] + end end , + __metatable = {class = "Box"}; } + local q = {} + setmetatable(q,mt) -- Window table inherits the module + q.Bars = {} + q.Bar = {} + for k,v in pairs(Bar) do q.Bar[k] = v end -- a separate instance of Bar so that... + setmetatable(q.Bar, {parent = q, class = "Bar", __index= + function (self, key) + local mt = getmetatable(self) + if key =="parent" then + return mt.parent + else + return mt.parent[key] + end end , + }) -- Bar table instance inherits it's MiniWindow table instance + q.windowName = winName or CreateGUID() -- Will create a guid if none passed in. Fine for plugin use. + check (WindowCreate (q.windowName, 0, 0, 1, 1, q.windowPosition, q.windowFlags, q.backgroundColour) ) + check (WindowFont (q.windowName, q.fontID, q.fontName, q.fontSize, q.fontBold, q.fontItalic, q.fontUnderline, q.fontStrikeout, q.fontCharset, q.fontPitchAndFamily) ) + q.fontHeight = WindowFontInfo (q.windowName, q.fontID, 1) -- Default font height + q.Bar.cellHeight = q.fontHeight + q.Bar.cellPadding + q.Bar.gaugeHeight = q.Bar.cellHeight -- Default size of bars. + return q +end + +--[=[ See :Doc( "BackgroundColour" ) --]=]-- +function _M:BackgroundColour (col) + assert (col, "Nil passed. specify a colour.") + local n = tonumber(col) or ColourNameToRGB(col) + assert(n and n~= -1,'Bad value passed. Acceptable examples: "red", 255, 0x0000ff, "#FF0000" - Got '.. tostring(x) .. '('.. type(x) ..')') + self.backgroundColour = n + self.matteHilight, self.matteShadow = self.backgroundColour,self.backgroundColour + for i = 1,10 do + self.matteHilight = AdjustColour(self.matteHilight,2) + self.matteShadow = AdjustColour(self.matteShadow,3) + end +end + +--[=[ See :Doc( "Rows" ) --]=]-- +function _M:Rows(num) + assert(type(num)=="number" and num > 0, "How many rows? Need a positive number. Got " .. type(num) ) + assert(self.parent == nil, "Pass a MiniWindow") + self.rows = num + self:Resize() +end + +--[=[ See :Doc( "Columns" ) --]=]-- +function _M:Columns(num) + assert(type(num)=="number" and num > 0, "How many columns? Need a positive number. Got " .. type(num) ) + assert(self.parent == nil, "Pass a MiniWindow") + self.rows = math.ceil(#self.Bars/num) + self.columns = num + self:Resize() +end + +--[=[ See :Doc( "AddBar" ) --]=]-- +function _M:AddBar(...) + --TraceOut (string.format("%s: Window %s", "AddBar", self.windowName)) + return self:InsertBar(#self.Bars + 1, ...) +end + +--[=[ See :Doc( "InsertBar" ) --]=]-- +function _M:InsertBar(index, ...) + --TraceOut (string.format("%s: Window %s Bar %i", "InsertBar", self.windowName, index)) + assert(self ~= _M , "Pass a table created from ".. _NAME .. ":New(), not ".. _NAME .. " itself.") + assert(self.parent == nil, "Attempt to add a Bar to a Bar. Use table from ".. _NAME .. ":New() instead.") + assert(index, "Bars index must be passed.") + local MiniWindow = self.parent or self +--[[-- Expected possible values: + 1= Caption, + 2= Value, + 3= GoodColor, + 4= BadColor, + 5= AnchoredRight, (whether the 0 value is on the left or right side of the gauge.) + 6= BarStyle (enumerated in InfoBox.barStyles ) --]]-- + local args={...} + table.insert (self.Bars, index, {}) -- Add a table for new bar. + setmetatable(self.Bars[index],{__metatable={parent = self.Bar}, __index = idx, __newindex= newidx}) + for i = index, #self.Bars do + self.Bars[i].id = i -- a way to find our index in the future + end + for k,v in ipairs(args) do -- update with optional parameters passed in + MiniWindow.Bar[ MiniWindow.Bar[k] ] (MiniWindow.Bars[index], v) -- This line of code is why MW.Bar[1] = "Caption". Bar[1] thru Bar[5] define which function the optional parameters call. Neat, hunh? + end + self:Resize() + return self.Bars[index] +end + +--[=[ See :Doc( "RemoveBar" ) --]=]-- +function _M:RemoveBar(index) + --TraceOut (string.format("%s: Window %s", "RemoveBar", self.windowName)) + assert(self ~= _M , "Call from a table created from ".. _NAME .. ":New(), not ".. _NAME .. " itself.") + assert(self.parent == nil, "Attempt to remove a Bar from a Bar. Use table from ".. _NAME .. ":New() instead.") + assert(index, "Bars index must be passed.") + table.remove (self.Bars, index) + local otheraxis = {columns = "rows", rows = "columns"} -- Shrink the grid if appropriate + if (self[self.axis] -1 ) * self[ otheraxis[self.axis] ] >= #self.Bars then + self[self.axis] = self[self.axis] -1 + self:Resize() + end + for i = index, #self.Bars do + self.Bars[i].id = i +end end + +--[=[ See :Doc( "Update" ) --]=]-- +function _M:Update (force) + --TraceOut (string.format("%s: Window %s", "Update", self.windowName)) + assert(self ~= _M , "Pass a table called from ".. _NAME .. ":New(), not ".. _NAME .. " itself.") + --Note: It is possible to pass any table instance into this. i.e. foo, foo.Bar, foo.Bars[i] + --It may be bad style, but it intentionally will work. foo.Bars[i] still updates the entire window, not just its region. + if os.time() > (self.lastUpdated or 0) or force then + local MiniWindow = self.parent or self + check (WindowCreate (self.windowName, 0, 0, self.windowWidth, self.windowHeight, self.windowPosition, self.windowFlags, GetInfo(278)) ) + check (WindowRectOp (self.windowName, 2, 2, 2, -2, -2, self.backgroundColour) ) -- "erase" miniwindw + local vertical,horizontal, curRow, curCol, t = 6, 0, 1, 1 + for _, curBar in ipairs(self.Bars) do + local finishY = vertical + curBar.cellHeight + curBar.padding + if curRow > self.rows or finishY > self.windowHeight then + vertical = 6 + curCol = curCol + 1 + curRow = 1 + if curCol > self.columns then --Maybe Fonts are distorting the grid + self:Resize() -- Resize/CalcWindowHeight will fix it + self:Update() -- and we need to redraw. + return -- and stop execution of the outdated update. + end end + horizontal = (curCol -1) * self.cellWidth + vertical = Draw(curBar, vertical, horizontal) + curRow=curRow+1 + end + check (WindowRectOp (self.windowName, 5, 0, 1, -1, -2, 10, 15) ) -- 3D border effect on canvas + WindowRectOp (self.windowName, 2, self.windowWidth - 2 , 0, 0, 0, GetInfo(278), nil) + WindowShow (self.windowName, true) + self.lastUpdated = os.time() + return true + else + return false +end end + +--[=[ See :Doc( "WindowPosition" ) --]=]-- +function _M:WindowPosition(pos) + assert(type(pos) == "number" and (pos >= 4 and pos <=11), "Invalid window position passed. Use " .. _NAME .. ".windowPositions[ ] if unsure.") + assert(self ~= _M and self.parent == nil, "Pass a table created from ".. _NAME .. ":New(), not ".. _NAME .. " itself.") + world.WindowPosition(self.windowName, 0,0,pos, self.windowFlags) + if ( (self.windowPosition == 5 or self.windowPosition == 9) and (pos ~= 5 and pos ~=9) or + (self.windowPosition ~= 5 and self.windowPosition ~= 9) and (pos == 5 or pos ==9) ) then + self.displaceOutput = (pos == 5 or pos == 9) + self.columns, self.rows = self.rows, self.columns + self.axis = "columns" + end + self.windowPosition = pos + self:Resize() +end + +--[=[ See :Doc( "ResizeOutput" ) --]=]-- +function _M:ResizeOutput() + local maxWidth, maxHeight = 0,0 + local left, top, width, height = GetInfo(272), GetInfo(273), GetInfo(274), GetInfo(275) + local bOff, bCol, bWid, oCol, oSty = GetInfo(276), GetInfo(282), GetInfo(277), GetInfo(278), GetInfo(279) + local t={} + for _, v in ipairs(WindowList() or {}) do + local tmpPos, shown = WindowInfo(v, 7), WindowInfo(v,5) + if shown then + t[tmpPos] = (t[tmpPos] or 0) + 1 + end end + local function sum (...) + local args, res= {...}, 0 + for _,n in ipairs(args) do + if type(t[n]) == "number" then res = (res + t[n]) end + end + return res + end + if self.displaceOutput then + if self.windowPosition == 9 or self.windowPosition == 10 then + if sum(9,10) == 1 then + height = -self.windowHeight - 8 + else + height = -math.max(math.abs(height), self.windowHeight) + end + elseif self.windowPosition == 11 then + if t[11] == 1 then + left = self.windowWidth + else + left = math.max ( left, self.windowWidth) + end + elseif self.windowPosition == 4 or self.windowPosition == 5 then + if sum(4,5) == 1 then + top = self.windowHeight + else + top = math.max( top , self.windowHeight) + end + else + if sum(6,7,8) == 1 then + width = -1 * self.windowWidth + else + width = -1 * math.max( math.abs(width) , self.windowWidth ) + end end end + if sum(11) == 0 then left = 4 end + if sum(9,10) == 0 then height = 0 end + if sum(5, 4) == 0 then top = 0 end + if sum(6, 7, 8) == 0 then width = 0 end + TextRectangle(left, top, width, height, bOff, bCol, bWid, oCol, oSty) +end + +--[=[ See :Doc( "Resize" ) --]=]-- +function _M:Resize() + assert (self ~= _M , "Resize a window, not the module.") + assert (not self.parent, "Resize() is for MiniWindows, not Bars.") + local sharedWindow, winwidths = {}, 0 + local sidewindows = {} + CalcWindowHeight(self) + if self.windowPosition == 5 or self.windowPosition == 9 then + local padptrn = "padS[EW]$" + if self.windowPosition == 5 then padptrn = "padN[EW]$" end + for _,v in ipairs(WindowList() ) do + if v:find(padptrn) then + WindowDelete(v) + elseif WindowInfo(v,5) then + local Position = WindowInfo(v, 7) + sidewindows[Position] = sidewindows[Position] or {topmost = 100000, bottommost = 0, leftmost = 100000, rightmost = 0, topwidth = 0, leftheight = 0, rightheight = 0} + sidewindows[Position].topmost = math.min( sidewindows[Position].topmost, WindowInfo(v, 11) ) + sidewindows[Position].bottommost = math.max( sidewindows[Position].bottommost, WindowInfo(v, 13) ) + sidewindows[Position].leftmost = math.min(sidewindows[Position].leftmost, WindowInfo(v, 10) ) + sidewindows[Position].rightmost = math.max(sidewindows[Position].rightmost, WindowInfo(v, 12 ) ) + if WindowInfo(v,11) == sidewindows[Position].topmost then + sidewindows[Position].topwidth = WindowInfo(v,3) + end + if Position == self.windowPosition then + sharedWindow[#sharedWindow +1] = v + sidewindows[Position].leftmost = math.min(sidewindows[Position].leftmost, WindowInfo(v, 10) ) + sidewindows[Position].rightmost = math.max(sidewindows[Position].rightmost, WindowInfo(v, 12) ) + if sidewindows[Position].leftmost == WindowInfo(v, 10) then + sidewindows[Position].leftheight = WindowInfo ( v, 4 ) + end + if sidewindows[Position].rightmost == WindowInfo(v, 12) then + sidewindows[Position].rightheight = WindowInfo ( v, 4 ) + end end end end + +--[[ Prevent overlapping Auto-centered windows. + Windows will be arranged: + LttttR + L R + L R + BBBBBB --]] + + if self.windowPosition == 5 then + if sidewindows[11] and sidewindows[11].topmost < sidewindows[5].bottommost then + sidewindows[4] = sidewindows[4] or {topwidth = 0 } + sidewindows[4].topwidth = math.max(sidewindows[4].topwidth, sidewindows[11].topwidth ) + WindowCreate(self.windowName .. "padNW", 0,0,sidewindows[11].topwidth,0, 4, 0, 0) + WindowShow(self.windowName .. "padNW") + end + + if sidewindows[7] and sidewindows[7].topmost < sidewindows[5].bottommost then + sidewindows[6] = sidewindows[6] or {topwidth = 0 } + sidewindows[6].topwidth = math.max(sidewindows[6].topwidth, sidewindows[7].topwidth ) + WindowCreate(self.windowName .. "padNE", 0,0,sidewindows[7].topwidth,0, 6, 0, 0) + WindowShow(self.windowName .. "padNE") + end + elseif self.windowPosition == 9 then + if sidewindows[11] and sidewindows[11].bottommost > GetInfo(280) - sidewindows[9].leftheight then + WindowCreate(self.windowName .. "padSW", 0,0,0,sidewindows[9].leftheight, 10, 0, 0) + WindowShow(self.windowName .. "padSW") + end + if sidewindows[7] and sidewindows[7].bottommost > GetInfo(280) - sidewindows[9].rightheight then + WindowCreate(self.windowName .. "padSE", 0,0,0, sidewindows[9].rightheight, 8, 0, 0) + WindowShow(self.windowName .. "padSE") + end end + sidewindows[self.windowPosition -1] = sidewindows[self.windowPosition -1] or {topwidth = 0} + sidewindows[self.windowPosition +1] = sidewindows[self.windowPosition +1] or {topwidth = 0} + self.windowWidth = math.floor( (GetInfo(281) - sidewindows[self.windowPosition -1].topwidth - sidewindows[self.windowPosition +1].topwidth ) / #sharedWindow) + if WindowInfo(self.windowName, 6) then -- we're hidden and a sharedwindow isn't an infobox that will resize itself. + for _,p in ipairs({4,6,8,10}) do + sidewindows[p] = sidewindows[p] or {topwidth = 0} + end + winwidths = (sidewindows[self.windowPosition - 1].topwidth) + (sidewindows[self.windowPosition + 1].topwidth) + for _,v in ipairs(sharedWindow) do + if v ~= self.windowName then + winwidths = winwidths + WindowInfo(v,3) + end end + self.windowWidth = GetInfo(281) - winwidths + end end + self:ResizeOutput() +end + +--[=[ See :Doc( "CloseWindow" ) --]=]-- +function _M:CloseWindow () + local wins = {"", "glass", "NE", "NW", "SE", "SW"} + for i = 1,5 do + WindowDelete(self.windowName .. wins[i]) + self:ResizeOutput() +end end + +--[=[ See :Doc( "Font" ) --]=]-- +function _M:Font(...) + --[=[ Optional parameters: + -- Name, string + -- Size, number + -- Bold, boolean + -- Italic, boolean + -- Underline, boolean + -- Strikeout, boolean + -- Charset, number + -- PitchAndFamily, number + --]=] + assert(self ~= _M , "Pass a table created from ".. _NAME .. ":New(), not ".. _NAME .. " itself.") + local fontParams = {} + local gaugeRatio = (self.gaugeHeight or self.Bar.gaugeHeight) / (self.cellHeight or self.Bar.cellHeight) + for k,v in ipairs(fontProps) do fontParams[k] = self[v] end + local MiniWindow = self.parent or self + local args = {...} + if args[1] == nil then + if self == MiniWindow then + local defaultFont = {} + for _,f in ipairs(fontProps) do self[f] = nil ; defaultFont[#defaultFont +1] = self[f] end + check( WindowFont (self.windowName, unpack(defaultFont) ) ) + self.fontHeight = WindowFontInfo (self.windowName, self.fontID, 1) + self.Bar.cellHeight = self.fontHeight + self.Bar.cellPadding + self.Bar.gaugeHeight = self.Bar.cellHeight * gaugeRatio + else + for _,f in ipairs(fontProps) do self[f] = nil end + self.fontHeight = nil + self.cellHeight = nil + self.gaugeHeight = self.cellHeight * gaugeRatio + end + else + for k,v in ipairs(args) do + fontParams[k + 1] = v + self[fontProps[k + 1] ] = v + end + self.fontName, self.fontSize = name, fontParams[1] + if self == MiniWindow then + MiniWindow.windowHeight = _M.windowHeight + check(WindowFont(MiniWindow.windowName, unpack(fontParams) ) ) + MiniWindow.Bar.cellHeight = WindowFontInfo (MiniWindow.windowName, MiniWindow.fontID, 1) + MiniWindow.Bar.cellPadding + else + fontParams[1]= "f" .. self.id + check(WindowFont(self.windowName, unpack(fontParams) ) ) + for k,v in ipairs(fontProps) do if fontParams[k] ~= self.parent[v] then self[v] = fontParams[k] end end + self.fontHeight = WindowFontInfo (self.windowName, self.fontID, 1) + self.cellHeight = self.fontHeight + self.cellPadding + self.gaugeHeight = self.cellHeight * gaugeRatio + end end + MiniWindow:Resize() +end + +--[=[ See :Doc( "ReopenWindow" ) --]=]-- +function _M:ReopenWindow() + local MiniWindow = self.parent or self + check(WindowCreate(MiniWindow.windowName, 0,0,MiniWindow.windowWidth,MiniWindow.windowHeight, MiniWindow.windowPosition, MiniWindow.windowFlags, MiniWindow.backgroundColour) ) + WindowShow(MiniWindow.windowName) + MiniWindow:Resize() + local font = {} + for k,v in ipairs (fontProps) do font[k] = MiniWindow[v] end + WindowFont (MiniWindow.windowName, unpack(font)) + for _, Bar in ipairs(MiniWindow.Bars) do + if Bar.fontID ~= MiniWindow.fontID then + for k,v in ipairs (fontProps) do font[k] = Bar[v] end + WindowFont (Bar.windowName, unpack(font)) + end end + MiniWindow:Update() +end + +--[=[ See :Doc( "CaptionPlacement" ) --]=]-- +function _M:CaptionPlacement (x) + assert((self.id and x>=0 and x<=5) or (not self.parent and x ==nil),"call MiniWindow:CaptionPlacement() or Bar:CaptionPlacement(x), x must be a value in the ".. _NAME .. ".captionPlacements table. Got ".. tostring(x) .. " (" .. type(x) ..")") + local m, MiniWindow = 5, self.parent or self + if self.parent then self.captionPlacement = x end + local startCol, endCol, barID + if self.id then -- Hit just the column + startCol = math.modf(self.id/self.rows) + endCol = startCol + else -- Hit em all + startCol = 0 + endCol = MiniWindow.columns -1 + end + for curCol = startCol, endCol do + local maxCaplength, capsPlaced = 5, {} + barID = (curCol * self.rows) + 1 + while curCol == math.modf( ( barID -1)/self.rows ) and barID <= #MiniWindow.Bars do + local cBar = MiniWindow.Bars[ barID ] + if cBar.barStyle ~= 0 then + maxCaplength = math.max(maxCaplength,WindowTextWidth(MiniWindow.windowName, cBar.fontID, strip_colours(cBar.caption), false)+5 ) + capsPlaced[cBar.captionPlacement] = true + end + barID = barID +1 + end + barID = (curCol * self.rows) + 1 + while curCol == math.modf( (barID - 1)/self.rows ) and barID <= #MiniWindow.Bars do + local cBar = MiniWindow.Bars[ barID ] + if capsPlaced[0] and not capsPlaced[3] then + cBar.gaugeLeft = maxCaplength + cBar.gaugeWidth = MiniWindow.cellWidth - cBar.gaugeLeft -8 + elseif not capsPlaced[0] and capsPlaced[3] then + cBar.gaugeLeft = nil + cBar.gaugeWidth = MiniWindow.cellWidth - maxCaplength -8 + elseif capsPlaced[0] and capsPlaced[3] then + cBar.gaugeLeft = maxCaplength + cBar.gaugeWidth = MiniWindow.cellWidth - (2 * maxCaplength) - 2 + else + cBar.gaugeLeft = nil + cBar.gaugeWidth = nil + end + barID = barID + 1 +end end end + + +--[[-- Friend Functions --]]-- + +--[=[ Internal Function ]=]-- +function CalcWindowHeight (self) + local MiniWindow = self.parent or self + local tmpHeights = {(MiniWindow.Bar.cellHeight + MiniWindow.Bar.padding) * MiniWindow.rows, 0} + local modOffset = 0 + local otheraxis = {columns = "rows", rows = "columns"} + if MiniWindow[ otheraxis[MiniWindow.axis] ] == 0 then + MiniWindow[ otheraxis[MiniWindow.axis] ] = 1 + end + if #MiniWindow.Bars > (MiniWindow.rows * MiniWindow.columns) then -- Is the grid big enough? + repeat + MiniWindow[MiniWindow.axis] = MiniWindow[MiniWindow.axis] + 1 + until #MiniWindow.Bars <= MiniWindow.columns * MiniWindow.rows + end + + MiniWindow:CaptionPlacement() + for _,tmpBar in ipairs(MiniWindow.Bars or {}) do -- Calculate the single largest column size. + if ( (tmpBar.id + modOffset) -1 ) % MiniWindow.rows == 0 then + tmpHeights[ #tmpHeights + 1 ] = tmpBar.cellHeight + tmpBar.padding + else + tmpHeights[#tmpHeights] = tmpHeights[#tmpHeights] + tmpBar.cellHeight + tmpBar.padding + end + if (tmpBar.cellHeight + tmpBar.padding) > (MiniWindow.Bar.cellHeight + MiniWindow.Bar.padding) and + #MiniWindow.Bars < (MiniWindow.rows*MiniWindow.columns) then + modOffset = -(tmpBar.id % MiniWindow.rows) + end + end + MiniWindow.windowHeight = math.max(unpack(tmpHeights) ) + _M.windowHeight + check (WindowCreate (MiniWindow.windowName, 0, 0, MiniWindow.windowWidth, MiniWindow.windowHeight, MiniWindow.windowPosition, MiniWindow.windowFlags, MiniWindow.backgroundColour) ) + WindowShow(MiniWindow.windowName) +end + +--[=[ Internal Function used in DoFade ]=]-- +function SplitRGB (Colour) + local _, r,g,b + if type(Colour) == "number" or colour_names[Colour] then + _,_, b,g,r = string.format("%06x", (colour_names[Colour] or Colour) ):find("(%x%x)(%x%x)(%x%x)") + elseif (type(Colour) == "string") then --HTML Formatted string "#RRGGBB" or something similar + _,_, r,g,b = Colour:find("(%x%x)(%x%x)(%x%x)") + end + r,g,b = tonumber(r, 16), tonumber(g,16), tonumber(b,16) + return r,g,b , string.format("#%02x%02x%02x", r,g,b):upper() +end + +--[=[ Internal Function used in DoFade ]=]-- +function CalcShades(self, shades) -- the number of shades including start and end + local c, step, Cs = {}, {}, {} + local r1, g1, b1 = SplitRGB(self.goodColour) + local r2, g2, b2 = SplitRGB(self.badColour) + step.r = (r1-r2)/shades + step.g = (g1-g2)/shades + step.b = (b1-b2)/shades + for i = 0, shades do + Cs[i+1] = tonumber(string.format("%02x%02x%02x", math.floor(b1 - (step.b * i) ) % 256 , math.floor(g1 - (step.g * i) ) % 256 , math.floor(r1 - (step.r * i) ) % 256 ),16) + end + Cs[#Cs] = self.badColour + return Cs, step, step.r, step.g, step.b +end + +--[=[ Internal Function used for color codes ]=]-- +function capitalize (s) + return s:gsub("%a",string.upper, 1) +end -- capitalize + +--[=[ Internal Function used in PrintText ]=]-- +function strip_colours (s) + s=s or "" + s = s:gsub ("@@", "\0") -- change @@ to 0x00 + s = s:gsub ("@.([^@]*)", "%1") + return (s:gsub ("%z", "@") ) -- put @ back +end + +--[=[ Internal Function used in Caption, graciously borrowed from Nick Gammon ]=]-- +function commas (num) + assert (type (num) == "number" or + type (num) == "string") + + local result = "" + + -- split number into 3 parts, eg. -1234.545e22 + -- sign = + or - + -- before = 1234 + -- after = .545e22 + + local sign, before, after = + string.match (tostring (num), "^([%+%-]?)(%d*)(%.?.*)$") + + -- pull out batches of 3 digits from the end, put a comma before them + + while string.len (before) > 3 do + result = "," .. string.sub (before, -3, -1) .. result + before = string.sub (before, 1, -4) -- remove last 3 digits + end -- while + + -- we want the original sign, any left-over digits, the comma part, + -- and the stuff after the decimal point, if any + return sign .. before .. result .. after + +end -- function commas + +--[=[ Populates color codes tables ]=]-- +for i,v in ipairs(ansiCodes) do + ansiColors[v] = GetNormalColour (i) + ansiColors[capitalize(v)] = GetBoldColour (i) +end + + + +--[=[ Documentation - MW:Doc() will be easier to read then the source of the table ]=]-- + +_Doc = { +AddBar = [[ +Applies To: MiniWindow table +Prototype: myBar = MW:AddBar(caption, value, goodColour, badColour, anchorRight, barStyle) + +Adds a new bar to the end of the [MiniWindow].Bars table and returns a reference to this table. + +caption = string; if a number is passed, commas are added to the ciphers +value = number; the percentage of the bar that is filled. Overmax percentages are accepted, and goodColour is drawn 15% brighter. +goodColour = string|number; the string is checked against names of colours or HTML formatting, the long number value of a color is also accepted. +badColour = string|number; same as goodColour +anchorRight = boolean; if true, 100% is on the left, 0% on the right. Automatically sets caption to be innerRight if true. +barStyle = number; a bitmask of barStyles values that specify a frame and fill type.]], +CaptionPlacement = [[ +Applies To: Miniwindow table, Bar +Prototype: Bar:CaptionPlacement(n) or MW:CaptionPlacement() + +Sets where text is drawn in the bar and calculates gauge sizes as appropriate. If calling against the MiniWindow itself, do not pass a parameter in the function to recalculate all gauge sizes and placements. +Setting a value to the MiniWindow.Bar.captionPlacement value will change the default label placement. + +n = number; a value of 0-5 which are enumerated in the captionPlacements table.]], +CloseWindow = [[ +Applies To: Miniwindow +Prototype: MW:CloseWindow() + +Intended to be called from OnPluginDisable or OnPluginClose. Deletes the MiniWindow from MushClient's list of miniwindows. +Call MW:ReopenWindow() in the OnPluginEnable function. +]], --']] +Columns = [[ +Applies To: Bar +Prototype: Bar:Columns(n) + +Sets the number of columns into which the miniwindow is divided. + +n = number; The number of columns.]], +Font = [[ +Applies To: MiniWindow, Bar +Prototype: MW:Font([fontName, fontSize, fontBold, fontItalic, fontUnderline, fontStrikeout, fontPitchAndFamily]) + +If no parameters are passed, deletes font settings on the specific object so it will reinherit from a parent object. +Parameters omitted will retrieve settings from those named values. Specified values set named value on object as well. + +See MushClient documentation for "WindowFont" for information on parameters.]], +InsertBar = [[ +Applies To: MiniWindow +Prototype: myBar = MW:InsertBar(n, caption, value, goodColour, badColour, anchorRight, barStyle) + +Inserts a new bar at position n and returns a reference to this new bar table. + +n = number; The 1-based index of the new bar. +caption = string; if a number is passed, commas are added to the ciphers +value = number; the percentage of the bar that is filled. Overmax percentages are accepted, and goodColour is drawn 15% brighter. +goodColour = string|number; the string is checked against names of colours or HTML formatting, the long number value of a color is also accepted. +badColour = string|number; same as goodColour +anchorRight = boolean; if true, 100% is on the left, 0% on the right. Automatically sets caption to be innerRight if true. +barStyle = number; a bitmask of barStyles values that specify a frame and fill type.]], +New = [[ +Applies To: Module +Prototype: MW = ]] .. _NAME .. [[:New([name]) + +Creates a new miniwindow table for you to populate with bars. The returned table has a metatable with its __index value referencing ]] .. _NAME .. [[. + +name = string; If specified, sets the name of the window returned by MushClient's WindowList function. Omitting this value generates a GUID for MushClient to use for the window name. This name is stored in the MW.windowName value.]], --']] +ReopenWindow = [[ +Applies To: MiniWindow +Protoype: MW:ReopenWindow() + +Intended to be used in the OnPluginEnabled callback so that fonts are reloaded after the miniwindow is deleted with WindowDelete() (i.e. OnPluginDisabled called MW:CloseWindow() (but not MW = nil) which deletes the window from WindowList(). ]], +RemoveBar = [[ +Applies To: MiniWindow +Prototype: MW:RemoveBar(n) + +Deletes the specified bar from the Bars table. + +n = number; The index of the bar to delete. A bar stores its index in the Bar.id value for your convenience.]], +Resize = [[ +Applies To: MiniWindow +Prototype: MW:Resize() + +This is called internally when necessary, the only time you need to be aware of it is for windows positioned at the top-center or bottom-center of the screen since they grow to the available width. It is recommended to place a call in the OnPluginWorldOutputResized callback in this scenario.]], +ResizeOutput = [[ +Applies To: MiniWindow +Prototype: MW:ResizeOutput() + +Called internally when positioning miniwindows at the left-center, lower-left, or bottom-center positions. Ff you wish another window to resize the Mud's text area, call it manually after setting that Miniwindow's .displaceOutput value to true.]], --']] +Rows = [[ +Applies To: MiniWindow +Prototype: MW:Rows(n) + +Sets the number of rows in a miniwindow to a specific value. If the MW.axis value is equal to "rows" it may still grow when new bars exceed the available space. + +n = number; A positive number of rows]], +Update = [[ +Applies To: MiniWindow +Prototype: updated = MW:Update() + +Draws or redraws the Miniwindow. This function will only redraw once a second to prevent excessive CPU utilization during speedwalk or lagbursts. + +updated = boolean; True if the window was redrawn this call, false if it had been drawn already in the past second and not updated.]], +WindowPosition = [[ +Applies To: MiniWindow +Prototype: MW:WindowPosition(n) + +Sets the location for the MiniWindow. + +n = number; a value between 4 and 11. Values are enumerated in the .windowPositions table.]], +axis = [[ +Applies To: MiniWindow +ProtoType: MW.axis = <"rows"|"columns"> + +Determines which way the grid scales as new bars demand additional space. MW.windowHeight grows as new rows are added. MW.windowWidth remains the same as new columns divide that space into smaller pieces.]], +backgroundColour = [[ +Applies To: MiniWindow +ProtoType: MW.backgroundColour = n + +The colour of the miniwindow. + +n = number; The number value of the colour desired. i.e. colour_names.indigo, not "indigo"]], +barStyles = [[ +Applies To: All +Prototype: N/A + +A table enumerating the possible barStyle fills and frames. + +none = 0; no frame +sunken = 1; a raised bar in a recessed frame +raised = 2; a recessed bar in a raised frame +raisedCap = 4; a recessed bar in a raised frame that fills the whole cell, regardless of captionPlacement +flat = 8; a single pixel frame, untouched gauge effect +glass = 16; recessed frame and a pretty visual effect on the bar + +solid = 32; a plain color fill +gradientScale = 64; a gradient that goes from 0 to .value +gradientFixed = 128; gradient goes from 0 to 100, with backgroundColour covering .value +1 to 100 +gradientShift = 256; The thermometer effect. Gradient that has its midpoint at .value.]], +captionPlacements = [[ +Applies To: ALL +Prototype: N/A + +A table enumerating values for the location of labels. + +left = 0; Text is drawn to the left of the gauge. +innerLeft = 1; Text is drawn left justified close to the 0 value +innerRight = 2; Text is drawn right justified by the 100 value +right = 3; Text is drawn to the right of the gauge +center = 4; Text is drawn centered within the gauge. +centerCell = 5; Text is drawn centered within the entire bar.]], +columns = [[Applies To: MiniWindow +Prototype: MW.columns = n + +The number of columns the MW is divided into. Setting this value directly bypasses validation in the Columns function. + +n = number; Expected to be a positive, non-zero integer.]], +customColourCodes = [[ +Applies to: MiniWindow, Bar +Prototype: Bar.customColourCodes = {a=val, [b=val2, ...]} + +A table used for drawing different colours within the caption. See caption for more information. + +a = char; a single character key identifying the attached value. +val = number; the number value of the desired colour. i.e. {i= colour_names.indigo}]], +displaceOutput = [[ +Applies To: MiniWindow +Prototype: MW.displaceOutput = bool + +Set to true and call MW:ResizeOutput() if you want to shrink the area that mud text arrives in so your window doesn't float above it. MiniWindows placed at the left-center, lower-left, or bottom-center (W,SW,S positions) automatically set this value to true.]], --']] +fontBold = [[ +Applies To: MiniWindow, Bar +Prototype: Bar.fontBold = bool + +This property can be used to specify the default value for the Font function, or be used to retrieve its last set value.]], +fontCharset = [[ +Applies To: MiniWindow, Bar +Prototype: Bar.fontCharset = bool + +This property can be used to specify the default value for the Font function, or be used to retrieve its last set value. +See MushClient's WindowFont documentation for more information]], --']] +fontID = [[ +Applies To: MiniWindow, Bar +Prototype: foo = Bar.fontID + +This property is used internally and really shouldn't be needed in your scripting.]], --']] +fontItalic = [[ +Applies To: MiniWindow, Bar +Prototype: Bar.fontItalic = bool + +This property can be used to specify the default value for the Font function, or be used to retrieve its last set value. +See MushClient's WindowFont documentation for more information]], --']] +fontName = [[ +Applies To: Module and MiniWindow, Bar +ProtoType: ]].._NAME..[[.fontName = "font name" | foo = MW.fontName | foo = Bar.fontName + +You can change the fontName property on the module which will affect MiniWindows subsequently returned by the New() function. +This property on MiniWindows and Bars shouldn't be changed by your scripting directly. Use the Font() function to change the loaded font.]], --']] +fontPadding = [[ +Applies To: ALL +Prototype: MW.fontPadding = n + +The number of pixels to offset the font placement from the top of the cell.]], +fontPitchAndFamily = [[ +Applies To: MiniWindow, Bar +Prototype: Bar.fontPitchAndFamily = number + +This property can be used to specify the default value for the Font function, or be used to retrieve its last set value. +See MushClient's WindowFont documentation for more information]], --']] +fontSize = [[ +Applies To: MiniWindow, Bar +Prototype: Bar.fontSize = bool + +This property can be used to specify the default value for the Font function, or be used to retrieve its last set value. +See MushClient's WindowFont documentation for more information]], --']] +fontStrikeout = [[ +Applies To: MiniWindow, Bar +Prototype: Bar.fontStrikeout = bool + +This property can be used to specify the default value for the Font function, or be used to retrieve its last set value. +See MushClient's WindowFont documentation for more information]], --']] +fontUnderline = [[ +Applies To: MiniWindow, Bar +Prototype: Bar.fontUnderline = bool + +This property can be used to specify the default value for the Font function, or be used to retrieve its last set value. +See MushClient's WindowFont documentation for more information]], --']] +rows = [[ +Applies To: MiniWindow +Prototype: MW.rows = n + +The number of rows. Setting this value directly bypasses validation in the Rows function. + +n = number; Expected to be a positive, non-zero integer.]], +textStyle = [[ +Applies To: Bar +Prototype: Bar.textStyle = n + +The adornment on the caption text. + +n = number; Expected values range from 0-5. See textStyles for more information]], +textStyles = [[ +Applies To: All +Prototype: N/A + +The table that enumerates textStyle values. Matting can be added to the other text styles for a little more clarity. + +plain = 0; +matte = 1; +raised = 2; +sunken = 4;]], +windowFlags = [[ +Applies To: Module, MiniWindow +Prototype: ]].._NAME..[[.windowFlags = n + +Flags passed to the MushClient WindowCreate function. See MushClient documentation for more information.]], +windowHeight = [[ +Applies To: Module, MiniWindow +Prototype: N/A + +The MiniWindow.windowHeight is set dynamically to be .rows * .cellHeight + some padding. Setting this value manually is not recommended.]], +windowPosition = [[ +Applies To: Module, MiniWindow +Prototype: ]].._NAME..[[.windowPosition = n + +Setting this on the module will set the initial placement of all MiniWindows returned by the New() function. It is recommended to not set this value directly on MiniWindows, instead use the MW:WindowPosition() function. + +n= number; Expected values range from 4-11. See windowPositions table for more information.]], +windowPositions = [[ +Applies To: All +Prototype: N/A + +Table enumerating windowPosition values. Placements are named after the cardinal points of the compass. + +NE = 4; +N = 5; +NW = 6; +E = 7; +SE = 8; +S = 9; +SW = 10; +W = 11;]], +windowWidth = [[ +Applies To: Module, MiniWindow +Prototype: MW.windowWidth = n + +The Number of pixels the miniwindow is wide. + +n = number; Expected to be a positive integer]], +AnchorRight = [[ +Applies To: Bar +Prototype: Bar:AnchorRight(bool) + +If True, then the 0 value is drawn on the right side of the gauge and captionPlacement, if set to innerLeft, is set to innerRight.]], +BadColour = [[ +Applies To: Bar +Prototype: Bar:BadColour(colour) + +Set the color for close to 0 values. + +colour = string|number; colour can be the name of a color ("red"), an HTML formatted string ("#FF0000"), or a number (255)]], +BarStyle = [[ +Applies To: Bar +Prototype: Bar:BarStyle(n) + +A bitmask number representing the frame + fill desired for the bar. + +n = number; 0 is text only, see barStyles for other values]], +Caption = [[ +Applies To: Bar +Prototype: Bar:Caption(label) + +Sets the text for the bar. If label is a number, commas are added for readability. + +label = string|number; The desired text to print.]], +ColourText = [[ +Applies To: Bar +Prototype: Bar:ColourText(val, threshold, good, bad [, neut]) + +Sets the textColour value to specified color. +Last three paramters can be specified as a name of a color ("red"), an HTML formatted string ("#FF0000"), or a number (255) + +val = number; The value to be checked. +threshold = number; the value to check against. +good :: val > threshold (or val >=threshold if neut is not specified) +bad :: val < threshold +neut :: val == threshold]], +GoodColour = [[ +Applies To: Bar +Prototype: Bar:GoodColour(val) + +The color for solid bars with value > threshold, or the non-zero side of gradients.]], +Padding = [[ +Applies To: Bar +Prototype: Bar:Padding(n) + +The number of pixels to add to the bottom of a gauge before drawing the next gauge in the column. + +n = number; A number of pixels. Negative values will cause overlapping gauges.]], +TextColour = [[ +Applies To: Bar +Prototype: Bar:TextColour(val) + +The default color for text to be printed in if no other colour codes are specified in the caption value. If colour codes are specified, this function sets the value of the @~ identifier. + +val = string|number; name of a color ("red"), an HTML formatted string ("#FF0000"), or a number (255)]], +TextStyle = [[ +Applies To: Bar +Prototype: Bar:TextStyle(n) + +Sets the adornments to printed text. + +n = number; value from 0-5. see textStyles for more information.]], +Threshold = [[ +Applies To: Bar +Prototype: Bar:Threshold(n) + +Sets the value that goodColour transitions to badColour for bars with a solid barstyle, or sets where the midpoint of the gradient is for gradientFixed barstyles. + +n = number; a value from 0 to 100.]], +Value = [[ +Applies To: Bar +Prototype: Bar:Value(n) + +Sets what percent of the gauge is filled. Values over 100 will be drawn as 100% with goodColour 15% brighter, if possible. + +n = number; Percent to draw in the gauge. ]], +WatchCaption = [[ +Applies To: Bar +Prototype: Bar:WatchCaption(varname) + +Specifies the name of a variable that contains the text displayed for a given bar. Unlike the Caption function, a variable containing a number will not display the additional commas. + +varname = string; the name of a variable. ("foo", "tbl.foo")]], +WatchValue = [[ +Applies To: Bar +Prototype: Bar:WatchValue(varname) + +Specifies the name of a variable that contains the percent of the gauge to draw. + +varname = string; the name of a variable. ("percentHP", "tbl.nested[fighterhealth]")]], +anchorRight = [[ +Applies To: Bar +Prototype: Bar.anchorRight = bool + +Value that determines which side of the gauge has the 0 value. You can set this value directly safely to a boolean value. ]], +badColour = [[ +Applies To: Bar +Prototype: Bar.badColour = n + +The number value of the color drawn near 0 values for gradients, or when value is less than or equal to threshold for solid fills. The BadColour function sets this value to the number equivalent to a color. +Bar:BadColour("indigo") -- ok +Bar.badColour = 8519755 -- ok +Bar.badColour = "indigo" -- NOT OK!!!! + +n = number; the number value for a colour.]], +barStyle = [[ +Applies To: Bar +Prototype: Bar.barStyle = n + +The bitmasked number determining how a bar is drawn. See barStyles for the enumeration of possible styles. + +n= number;]], +caption = [[ +Applies To: Bar +Prototype: Bar.caption = txt + +The text to display for a bar's label. This value does not modify numbers when printing. +Bar:Caption(1000) --> prints 1,000 +Bar.caption = 1000 --> prints 1000 + +Additional color settings can be specified with an "@x" delimiter where x is a single character. The 16 default ansi colors are taken from MushClient's settings and are set to c,m,y,k,r,g,b,w and their bold values C,M,Y,K... The colour that's in the textColour value can be referred to with "@~". Additional colours can be specified by adding a table to the customColourCodes value with a single character key, and the number value of the colour. +"@@" is needed to actually print an @ symbol in a caption. +i.e.: +MW.customColourCodes = {z = 255} +MW.Bars[2].customColourCodes = {z = 128} +MW.Bars[1].caption = "@zVery Red" +MW.Bars[2].caption = "@zNot so red" +MW.Bars[3].caption = "@zVery Red @~textColour Colour" + +txt = string; the label.]], --']] +captionPlacement = [[ +Applies To: Bar +Prototype: Bar.captionPlacement = n + +The value of where the caption is placed. It is recommended to set this value with the CaptionPlacement() function instead of setting the value directly. + +n = number; a value ranging from 0 to 5]], +cellHeight = [[ +Applies To: Bar +Prototype: Bar.cellHeight = n + +The number of pixels from the top of the bar to the bottom of the gauge. Note that the padding value is added to this to determine the top of the following gauge. This value is calculated dynamically when a font is loaded. +This should be a lesser used value since it is mostly handled internally. +n = number; ]], +cellPadding = [[ +Applies To: Bar +Prototype: Bar.cellPadding = n + +Used mostly internally, this value is added to the height of a font to make the gauge a little bigger. It is only used to calculate cellHeight when a font is loaded. + +n = number; number of pixels]], +gaugeHeight = [[ +Applies To: Bar +Prototype: Bar.gaugeHeight = n + +Value that determines the top edge of the gauge. The internal draw routine uses cellHeight - gaugeHeight to determine coordinates for drawing so that gauges are naturally aligned to the bottom of the cell. + +n = number; the number of pixels high a gauge should be]], +gaugeLeft = [[ +Applies To: Bar +Prototype: Bar.gaugeLeft = n + +The number of pixels the gauge appears from the edge of the cell. Recalculated automatically by the CaptionPlacement function. + +n = number; number of pixels.]], +goodColour = [[ +Applies To: Bar +Prototype: Bar.goodColour = n + +The number value of the color drawn near 100% values for gradients, or when value is greater than threshold for solid fills. The GoodColour function sets this value to the number equivalent to a color. +Bar:GoodColour("indigo") -- ok +Bar.goodColour = 8519755 -- ok +Bar.goodColour = "indigo" -- NOT OK! + +n = number; the number value for a colour.]], +padding = [[ +Applies To: Bar +Prototype: Bar.padding = n + +The number of pixels from the bottom of this gauge to the top of the next cell. + +n = number; numberof pixels]], +textColour = [[ +Applies To: Bar +Prototype: Bar.textColour = n + +The number value of the colour for printed text. If there are no colour codes specified in the caption. See caption for more information.]], +textStyle = [[ +Applies To: Bar +Prototype: Bar.textStyle = n + +n = number; 0-5. see textStyles for details.]], +threshold = [[ +Applies To: Bar +Prototype: Bar.threshold = n + +The percentage value where goodColour changes to badColour for solid fills, or where the midpoint of the gradient is for gradientFixed fills. + +n = number; ]], +value = [[ +Applies To: Bar +Prototype: Bar.value = n + +The percentage of the bar to draw. Values greater than 100% will draw as 100% with the colour 15% brighter, if possible. Values lower than 0 don't draw. + +n = number; percent of gauge to draw]], --']] +id = [[ +Applies To: Bar +Prototype: Bar.id = n + +It is recommended that you don't change this value. It is maintained internally. This value contains the index of this bar in the Bars table. It is useful for situations where you're dynamically adding and removing bars but kept a variable reference returned from the AddBar or InsertBar functions and may have lost track of which index this bar may be.]], +Bar = [[ +Applies To: MiniWindow, Module +Prototype: MW.Bar = {...} + +The Bar table contains the default values for newly created bars. A newly created Miniwindow (returned from the ]].._NAME..[[:New() function) has a new table with the values from ]].._NAME..[[.Bar copied into it. This table has a metatable with its __index value referring to the miniwindow that contains it.]], +Bars = [[ +Applies To: MiniWindow +Prototype: MW.Bars = {...} + +The Bars table contains nested tables of duplicated Bar tables with customized values. The Update function gets the settings for what to draw by looping through the Bars table's subtables. ]], --']] +gaugeWidth = [[Applies To: Bar +Prototype: Bar.gaugeWidth = n + +The number of pixels the gauge extends within a bar. This property's default value is implemented in a metatable to dynamically return the appropriate width. Setting a value trumps the __index calculation, of course. + +n = number; the number of pixels from the left edge ot the gauge to the right edge.]], --']] +["*Inheritance"] = [[Applies To: General Info +Prototype: N/A + +This topic does not relate to one specific value or function. Its purpose is to document how the the metatables __index link. +Assuming: + MW = InfoBox:New() + MW:AddBar("Test") + print (MW.Bars[1].foo) + + will search for a value foo in + MW.Bars[1], + MW.Bar, + MW, + then InfoBox + ]], + +["button"] =[[ +Applies To: Bar +Protoype: bar.button = {mouseUp = "funcname", ...} + + +This value expects a table with certain keys paired to the _names_ of functions you write. If there is a table present a Hotspot is added that is drawn over the entire region of the cell (not just the gauge). +Missing keys are fine. (i.e. {mouseUp="f"} is OK. {mouseUp="f", mouseDown="", cancelMouseDown=""... is not necessary.) + +Expected keys are named: +mouseUp +mouseDown +cancelMouseDown +tooltipText +mouseOver +cancelMouseOver +cursor + +Your functions should be structured as: + function myClickFunction (flags, strBarsIndex) + local id = tonumber(strBarsIndex) -- because tbl["1"] is a different key than tbl[1] + ... + MW.Bars[id].caption = "Clicked" + end +]], + +["cellTop"] =[[ +Applies To: Bar +Protoype: x = bar.cellTop + +This value is set by the Update function. It is provided if you wish to add any custom coding and need to know where a bar was drawn. Setting this value produces no effect and will be overwritten the next time the Update function is called. +]], + +["cellLeft"] =[[ +Applies To: Bar +Protoype: x = bar.cellLeft + +This value is set by the Update function. It is provided if you wish to add any custom coding and need to know where a bar was drawn. Setting this value produces no effect and will be overwritten the next time the Update function is called. +]], + +["Fade"] =[[ +Applies To: Bar +Protoype: bar:Fade(bool) + +Calling this function sets the fade value and recalculates the shades table to which the fade effect refers. It's not required to call this function, since the draw routine will recalculate the shades table if necessary. There is an interesting bug that can be exploited by calling this function however. + +Try the following: + for x = 100,30,-10 do + local foo = MW:AddBar("", x, "green", "red", false, MW.barStyles.glass + MW.barStyles.gradientScale) + foo:Fade(true) + foo.badColour = colour_names.dodgerblue + end + +It's a bug, but it looks cool. Also this is why using the functions to set values is recommended! +]], + +["cellWidth"] =[[ +Applies To: Bar +Protoype: x = bar.cellWidth + +The value for this property is generated by the Miniwindow's __index metamethod. The function in the metamethod returns (windowWidth / columns) for you. You should never have a reason to set your own value, and doing so will probably break things in uncool ways. +]], --']] + +["*AddYourOwn"] =[[ +Applies To: ALL +Protoype: N/A + +A Bar is a table, after all, and you might find it useful to attach your own data, or a reference, to a bar. This is mostly safe to do as the module uses the pairs() and ipairs() functions in limited places. +pairs() is used to copy InfoBox.Bar to MW.Bar +ipairs() is used on the MW.Bar table to find the functions for the default parameters for AddBar. +ipairs() is used on the MW.Bars table to draw the bars. + +Other than avoiding numerical indices in the 2 Bar(s) tables, it should be safe to add to a table as you see fit. +]], + +--[=[ +[""] =[[ +Applies To: +Protoype: + + +]], + +--]=]-- ']] +} + +function Doc (self, topic) + if topic and _Doc[topic] then + print() + print (_Doc[topic],"\n") + else + local p = require "pairsByKeys" + print ("\nAdditional help can be found on the following functions and values\n") + local t , i={}, 0 + for k,v in p(_Doc) do -- t[#t+1] = k end + local s= "%-20s" + i = i+1 + Tell(s:format(k)) + if i == 4 then + print() + i=0 + end end + print("\n\nSyntax: ".. GetInfo(36) .. _NAME .. ':Doc("topic")\n') +end end diff --git a/cosmic rage/lua/addxml.lua b/cosmic rage/lua/addxml.lua new file mode 100644 index 0000000..5047863 --- /dev/null +++ b/cosmic rage/lua/addxml.lua @@ -0,0 +1,158 @@ +-- addxml.lua + +-- lets you add triggers, aliases, timers, macros using XML code +-- +-- See: http://www.gammon.com.au/forum/?id=7123 + +--[[ + +This lets you add items by simply setting up a table of their attributes and then adding it. + +Exposed functions are: + + addxml.trigger -- add a trigger + addxml.alias -- add an alias + addxml.timer -- add a timer + addxml.macro -- add a macro + addxml.save -- convert one of the above back into a table + +Example of adding a trigger: + +require "addxml" +addxml.trigger { match = "swordfish", + regexp = true, + ['repeat'] = true, -- repeat is lua keyword + send = "hi there", + sequence = 50, + enabled = true, + name = "boris", + } + +Example of converting a trigger back into a table: + +require "tprint" +require "addxml" +tprint (addxml.save ("trigger", "boris")) + +--]] + + +module (..., package.seeall) + +local html_replacements = { + ["<"] = "<", + [">"] = ">", + ["&"] = "&", + ['"'] = """, + } + +-- fix text so that < > & and double-quote are escaped +local function fixhtml (s) + + return (string.gsub (tostring (s), '[<>&"]', + function (str) + return html_replacements [str] or str + end )) + +end -- fixhtml + + +local function GeneralAdd (t, which, plural) + + assert (type (t) == "table", "Table must be supplied to add a " .. which) + + local k, v + local xml = {} + + local send = fixhtml (t.send or "") -- send is done differently + t.send = nil + + -- turn into XML options + for k, v in pairs (t) do + + -- fix true/false to y/n + if v == true then + v = "y" + elseif v == false then + v = "n" + end -- if true or false + + table.insert (xml, k .. '="' .. fixhtml (v) .. '"') + end -- for loop + + assert (ImportXML (string.format ( + "<%s><%s %s >%s", + plural, -- eg. triggers + which, -- eg. trigger + table.concat (xml, "\n"), -- eg. match="nick" + send, -- eg. "go north" + which, -- eg. trigger + plural) -- eg. triggers + ) == 1, "Import of " .. which .. " failed") + +end -- GeneralAdd + +function trigger (t) + GeneralAdd (t, "trigger", "triggers") + -- force script entry-point resolution + if t.name and t.script then + SetTriggerOption (t.name, "script", t.script) + end -- if trigger has a name, and a script name +end -- addxml.trigger + +function alias (t) + GeneralAdd (t, "alias", "aliases") + -- force script entry-point resolution + if t.name and t.script then + SetAliasOption (t.name, "script", t.script) + end -- if alias has a name, and a script name +end -- addxml.alias + +function timer (t) + GeneralAdd (t, "timer", "timers") + -- force script entry-point resolution + if t.name and t.script then + SetTimerOption (t.name, "script", t.script) + end -- if timer has a name, and a script name +end -- addxml.timer + +function macro (t) + GeneralAdd (t, "macro", "macros") +end -- addxml.macro + +function save (which, name) + + local typeconversion = + { + trigger = 0, + alias = 1, + timer = 2, + macro = 3, + -- variable = 4, + -- keypad = 5 + } + + local itemtype = assert (typeconversion [which], "Unknown type: " .. which) + + local xml = ExportXML (itemtype, name) + + -- if not found returns empty string + assert (xml ~= "", "Can't find " .. which .. ": " .. name) + + -- parse back into table entries + local xmlnodes = assert (utils.xmlread (xml), "Bad XML") + + -- all attributes should be a couple of levels down + local result = xmlnodes.nodes [1].nodes [1].attributes + + -- find "send" text + + -- another level? + if xmlnodes.nodes [1].nodes [1].nodes then + if xmlnodes.nodes [1].nodes [1].nodes [1].name == "send" then + result.send = xmlnodes.nodes [1].nodes [1].nodes [1].content + end -- have a "send" field + end -- have a child node + + return result +end -- addxml.save diff --git a/cosmic rage/lua/alphanum.lua b/cosmic rage/lua/alphanum.lua new file mode 100644 index 0000000..7b50f7f --- /dev/null +++ b/cosmic rage/lua/alphanum.lua @@ -0,0 +1,80 @@ +-- alphanum.lua +-- +-- Adapted somewhat from: http://www.davekoelle.com/files/alphanum.lua +-- Also see: http://www.davekoelle.com/alphanum.html +-- +-- Implements a sort function that does a more "human readable" sort order. +-- It breaks the sort strings into "chunks" and then compares each one naturally, +-- depending on whether it is a string or a number (eg. z9.doc compares less than z20.doc) +-- It also does a case-insensitive compare (so "nick" and "Nick" come out together). + +-- See also: http://www.gammon.com.au/forum/?id=8698 + +--[[ +Example: + +require "alphanum" + +t={ +"z18.doc","z19.doc","z2.doc","z16.doc","z17.doc", +"z1.doc","z101.doc","z102.doc","z11.doc","z12.doc", +"z13.doc","z14.doc","z15.doc","z20.doc","z3.doc", +"z4.doc","z5.doc","z6.doc","z10.doc","z100.doc", +"z7.doc","z8.doc","z9.doc", "Z9A.doc", +} + +table.sort(t, alphanum (t)) + +for i=1, #t do + print(t[i]) +end + +--]] + +function alphanum (t) + assert (type (t) == "table", "Must pass table to be sorted to alphanum") + + local function chunkString(str) + local c = {} + for a, b in tostring (str):gmatch("(%d*)(%D*)") do + if a ~= "" then c[#c+1] = tonumber(a) end + if b ~= "" then c[#c+1] = b end + end + return c + end + + local chunks = {} + -- build temporary table of the keys + for i=1, #t do + chunks [t [i]] = chunkString (t [i]) + end + + return function (a, b) -- return our sort comparison function + + -- lookup chunked information from previously-built table + local achunks = chunks [a] + local bchunks = chunks [b] + + for i = 1, math.min (#achunks, #bchunks) do + local as, bs = achunks [i], bchunks [i] + + -- if one is a string, make them both strings + if type (as) == "string" or type (bs) == "string" then + as = (tostring (as)):upper () + bs = (tostring (bs)):upper () + end -- at least one is a string + + -- if they are equal, move onto the next chunk + if as ~= bs then + return as < bs + end -- if + end -- for each chunk + + -- still equal? the one with fewer chunks compares less + return #achunks < #bchunks + + end -- sort function + +end -- alphanum + +return alphanum diff --git a/cosmic rage/lua/check.lua b/cosmic rage/lua/check.lua new file mode 100644 index 0000000..34d8820 --- /dev/null +++ b/cosmic rage/lua/check.lua @@ -0,0 +1,29 @@ +-- +-- check.lua +-- +-- ---------------------------------------------------------- +-- return-code checker for MUSHclient functions that return error codes +-- ---------------------------------------------------------- +-- +--[[ + +Call for those MUSHclient functions that return a result code (like eOK). +Not all functions return such a code. + +eg. + +require "check + check (SetVariable ("abc", "def")) --> works ok + check (SetVariable ("abc-", "def")) --> The name of this object is invalid + +--]] + +function check (result) + if result ~= error_code.eOK then + error (error_desc [result] or + string.format ("Unknown error code: %i", result), + 2) -- error level - whoever called this function + end -- if +end -- function check + +return check \ No newline at end of file diff --git a/cosmic rage/lua/checkplugin.lua b/cosmic rage/lua/checkplugin.lua new file mode 100644 index 0000000..9cbcc63 --- /dev/null +++ b/cosmic rage/lua/checkplugin.lua @@ -0,0 +1,90 @@ +-- checkplugin.lua + +-- Checks the nominated plugin is installed + +function do_plugin_check_now (id, name) + + local me -- who am I? plugin or main world script? + local location -- location to attempt to load plugin from + + -- allow for being called from main world script + if GetPluginID () == "" then + me = "world script" + location = GetInfo (60) + else + me = GetPluginName () .. " plugin" + location = GetPluginInfo(GetPluginID (), 20) + end -- if + + -- first check if installed + if not IsPluginInstalled (id) then + ColourNote ("white", "green", "Plugin '" .. name .. "' not installed. Attempting to install it...") + LoadPlugin (location .. name .. ".xml") + + if IsPluginInstalled (id) then + ColourNote ("white", "green", "Success!") + + -- here if still not installed + else + ColourNote ("white", "red", string.rep ("-", 80)) + ColourNote ("white", "red", "Plugin '" .. name .. "' not installed. Please download and install it.") + ColourNote ("white", "red", "It is required for the correct operation of the " .. me) + ColourNote ("white", "red", string.rep ("-", 80)) + return -- skip enabled check + end -- if not installed + end -- plugin was not installed + + + -- now make sure enabled (suggested by Fiendish - version 4.74+ ) + + if not GetPluginInfo(id, 17) then + ColourNote ("white", "green", "Plugin '" .. name .. "' not enabled. Attempting to enable it...") + EnablePlugin(id, true) + if GetPluginInfo(id, 17) then + ColourNote ("white", "green", "Success!") + else + ColourNote ("white", "red", string.rep ("-", 80)) + ColourNote ("white", "red", "Plugin '" .. name .. "' not enabled. Please make sure it can be enabled.") + ColourNote ("white", "red", "It is required for the correct operation of the " .. me) + ColourNote ("white", "red", string.rep ("-", 80)) + end -- if + end -- if not enabled + +end -- do_plugin_check_now + + +function checkplugin (id, name) + + if GetOption ("enable_timers") ~= 1 then + ColourNote ("white", "red", "WARNING! Timers not enabled. Plugin dependency checks will not work properly.") + end -- if timers disabled + + -- give them time to load + DoAfterSpecial (2, + "do_plugin_check_now ('" .. id .. "', '" .. name .. "')", + sendto.script) +end -- checkplugin + +function load_ppi (id, name) +local PPI = require "ppi" + + local ppi = PPI.Load(id) + if ppi then + return ppi + end + + ColourNote ("white", "green", "Plugin '" .. name .. "' not installed. Attempting to install it...") + LoadPlugin (GetPluginInfo(GetPluginID (), 20) .. name .. ".xml") + + ppi = PPI.Load(id) -- try again + if ppi then + ColourNote ("white", "green", "Success!") + return ppi + end + + ColourNote ("white", "red", string.rep ("-", 80)) + ColourNote ("white", "red", "Plugin '" .. name .. "' not installed. Please download and install it.") + ColourNote ("white", "red", string.rep ("-", 80)) + + return nil +end -- function load_ppi \ No newline at end of file diff --git a/cosmic rage/lua/colors.lua b/cosmic rage/lua/colors.lua new file mode 100644 index 0000000..486ed92 --- /dev/null +++ b/cosmic rage/lua/colors.lua @@ -0,0 +1,269 @@ +----------------------------------------------------------------------------- +-- Provides support for color manipulation in HSL color space. +-- +-- http://sputnik.freewisdom.org/lib/colors/ +-- +-- License: MIT/X +-- +-- (c) 2008 Yuri Takhteyev (yuri@freewisdom.org) * +-- +-- * rgb_to_hsl() implementation was contributed by Markus Fleck-Graffe. +----------------------------------------------------------------------------- + +module(..., package.seeall) + +local Color = {} +local Color_mt = {__metatable = {}, __index = Color} + +----------------------------------------------------------------------------- +-- Instantiates a new "color". +-- +-- @param H hue (0-360) _or_ an RGB string ("#930219") +-- @param S saturation (0.0-1.0) +-- @param L lightness (0.0-1.0) +-- @return an instance of Color +----------------------------------------------------------------------------- +function new(H, S, L) + if type(H) == "string" and H:sub(1,1)=="#" and H:len() == 7 then + H, S, L = rgb_string_to_hsl(H) + end + assert(Color_mt) + return setmetatable({H = H, S = S, L = L}, Color_mt) +end + +----------------------------------------------------------------------------- +-- Converts an HSL triplet to RGB +-- (see http://homepages.cwi.nl/~steven/css/hsl.html). +-- +-- @param h hue (0-360) +-- @param s saturation (0.0-1.0) +-- @param L lightness (0.0-1.0) +-- @return an R, G, and B component of RGB +----------------------------------------------------------------------------- + +function hsl_to_rgb(h, s, L) + h = h/360 + local m1, m2 + if L<=0.5 then + m2 = L*(s+1) + else + m2 = L+s-L*s + end + m1 = L*2-m2 + + local function _h2rgb(m1, m2, h) + if h<0 then h = h+1 end + if h>1 then h = h-1 end + if h*6<1 then + return m1+(m2-m1)*h*6 + elseif h*2<1 then + return m2 + elseif h*3<2 then + return m1+(m2-m1)*(2/3-h)*6 + else + return m1 + end + end + + return _h2rgb(m1, m2, h+1/3), _h2rgb(m1, m2, h), _h2rgb(m1, m2, h-1/3) +end + +----------------------------------------------------------------------------- +-- Converts an RGB triplet to HSL. +-- (see http://easyrgb.com) +-- +-- @param r red (0.0-1.0) +-- @param g green (0.0-1.0) +-- @param b blue (0.0-1.0) +-- @return corresponding H, S and L components +----------------------------------------------------------------------------- + +function rgb_to_hsl(r, g, b) + --r, g, b = r/255, g/255, b/255 + local min = math.min(r, g, b) + local max = math.max(r, g, b) + local delta = max - min + + local h, s, l = 0, 0, ((min+max)/2) + + if l > 0 and l < 0.5 then s = delta/(max+min) end + if l >= 0.5 and l < 1 then s = delta/(2-max-min) end + + if delta > 0 then + if max == r and max ~= g then h = h + (g-b)/delta end + if max == g and max ~= b then h = h + 2 + (b-r)/delta end + if max == b and max ~= r then h = h + 4 + (r-g)/delta end + h = h / 6; + end + + if h < 0 then h = h + 1 end + if h > 1 then h = h - 1 end + + return h * 360, s, l +end + +function rgb_string_to_hsl(rgb) + return rgb_to_hsl(tonumber(rgb:sub(2,3), 16)/255, + tonumber(rgb:sub(4,5), 16)/255, + tonumber(rgb:sub(6,7), 16)/255) +end + +----------------------------------------------------------------------------- +-- Converts the color to an RGB string. +-- +-- @return a 6-digit RGB representation of the color prefixed +-- with "#" (suitable for inclusion in HTML) +----------------------------------------------------------------------------- + +function Color:to_rgb() + local rgb = {hsl_to_rgb(self.H, self.S, self.L)} + local buffer = "#" + for i,v in ipairs(rgb) do + buffer = buffer..string.format("%02x",math.floor(v*255+0.5)) + end + return buffer +end + +----------------------------------------------------------------------------- +-- Creates a new color with hue different by delta. +-- +-- @param delta a delta for hue. +-- @return a new instance of Color. +----------------------------------------------------------------------------- +function Color:hue_offset(delta) + return new((self.H + delta) % 360, self.S, self.L) +end + +----------------------------------------------------------------------------- +-- Creates a complementary color. +-- +-- @return a new instance of Color +----------------------------------------------------------------------------- +function Color:complementary() + return self:hue_offset(180) +end + +----------------------------------------------------------------------------- +-- Creates two neighboring colors (by hue), offset by "angle". +-- +-- @param angle the difference in hue between this color and the +-- neighbors +-- @return two new instances of Color +----------------------------------------------------------------------------- +function Color:neighbors(angle) + local angle = angle or 30 + return self:hue_offset(angle), self:hue_offset(360-angle) +end + +----------------------------------------------------------------------------- +-- Creates two new colors to make a triadic color scheme. +-- +-- @return two new instances of Color +----------------------------------------------------------------------------- +function Color:triadic() + return self:neighbors(120) +end + +----------------------------------------------------------------------------- +-- Creates two new colors, offset by angle from this colors complementary. +-- +-- @param angle the difference in hue between the complementary and +-- the returned colors +-- @return two new instances of Color +----------------------------------------------------------------------------- +function Color:split_complementary(angle) + return self:neighbors(180-(angle or 30)) +end + +----------------------------------------------------------------------------- +-- Creates a new color with saturation set to a new value. +-- +-- @param saturation the new saturation value (0.0 - 1.0) +-- @return a new instance of Color +----------------------------------------------------------------------------- +function Color:desaturate_to(saturation) + return new(self.H, saturation, self.L) +end + +----------------------------------------------------------------------------- +-- Creates a new color with saturation set to a old saturation times r. +-- +-- @param r the multiplier for the new saturation +-- @return a new instance of Color +----------------------------------------------------------------------------- +function Color:desaturate_by(r) + return new(self.H, self.S*r, self.L) +end + +----------------------------------------------------------------------------- +-- Creates a new color with lightness set to a new value. +-- +-- @param lightness the new lightness value (0.0 - 1.0) +-- @return a new instance of Color +----------------------------------------------------------------------------- +function Color:lighten_to(lightness) + return new(self.H, self.S, lightness) +end + +----------------------------------------------------------------------------- +-- Creates a new color with lightness set to a old lightness times r. +-- +-- @param r the multiplier for the new lightness +-- @return a new instance of Color +----------------------------------------------------------------------------- +function Color:lighten_by(r) + return new(self.H, self.S, self.L*r) +end + +----------------------------------------------------------------------------- +-- Creates n variations of this color using supplied function and returns +-- them as a table. +-- +-- @param f the function to create variations +-- @param n the number of variations +-- @return a table with n values containing the new colors +----------------------------------------------------------------------------- +function Color:variations(f, n) + n = n or 5 + local results = {} + for i=1,n do + table.insert(results, f(self, i, n)) + end + return results +end + +----------------------------------------------------------------------------- +-- Creates n tints of this color and returns them as a table +-- +-- @param n the number of tints +-- @return a table with n values containing the new colors +----------------------------------------------------------------------------- +function Color:tints(n) + local f = function (color, i, n) + return color:lighten_to(color.L + (1-color.L)/n*i) + end + return self:variations(f, n) +end + +----------------------------------------------------------------------------- +-- Creates n shades of this color and returns them as a table +-- +-- @param n the number of shades +-- @return a table with n values containing the new colors +----------------------------------------------------------------------------- +function Color:shades(n) + local f = function (color, i, n) + return color:lighten_to(color.L - (color.L)/n*i) + end + return self:variations(f, n) +end + +function Color:tint(r) + return self:lighten_to(self.L + (1-self.L)*r) +end + +function Color:shade(r) + return self:lighten_to(self.L - self.L*r) +end + +Color_mt.__tostring = Color.to_rgb diff --git a/cosmic rage/lua/commas.lua b/cosmic rage/lua/commas.lua new file mode 100644 index 0000000..a37b897 --- /dev/null +++ b/cosmic rage/lua/commas.lua @@ -0,0 +1,223 @@ +-- commas.lua +-- ---------------------------------------------------------- +-- Rounding, duration, comma functions +-- See forum thread: +-- http://www.gammon.com.au/forum/?id=7805 + +--[[ + +This function rounds any number to the closest integer. +The "tricky" case is exactly half-way. +That is, should 1.5 round to 1 or 2? How about -1.5? + +This function rounds 1.5 "up" to 2, and -1.5 "down" to -2. + +--]] + +-- ---------------------------------------------------------- + + +-- round "up" to absolute value, so we treat negative differently +-- that is, round (-1.5) will return -2 + +function round (x) + if x >= 0 then + return math.floor (x + 0.5) + end -- if positive + + return math.ceil (x - 0.5) +end -- function round + +--[[ + +Duration + +This function is designed to display a time interval in "short form". +That is, rounded to the nearest major time interval. Some examples of intervals: + + + * 3.6 days - displays "4 d" + * 3.5 days - displays "4 d" + * 3.4 days - displays "3 d" + + * 3.6 hours - displays "4 h" + * 3.5 hours - displays "4 h" + * 3.4 hours - displays "3 h" + + * 3.6 minutes - displays "4 m" + * 3.5 minutes - displays "4 m" + * 3.4 minutes - displays "3 m" + + * 59 seconds - displays "59 s" + * 58 seconds - displays "58 s" + * 57 seconds - displays "57 s" ... and so on to "0 s" + + +--]] + +-- ---------------------------------------------------------- + +function convert_time (secs) + + -- handle negative numbers + local sign = "" + if secs < 0 then + secs = math.abs (secs) + sign = "-" + end -- if negative seconds + + -- weeks + if secs >= (60 * 60 * 24 * 6.5) then + return sign .. round (secs / (60 * 60 * 24 * 7)) .. " w" + end -- 6.5 or more days + + -- days + if secs >= (60 * 60 * 23.5) then + return sign .. round (secs / (60 * 60 * 24)) .. " d" + end -- 23.5 or more hours + + -- hours + if secs >= (60 * 59.5) then + return sign .. round (secs / (60 * 60)) .. " h" + end -- 59.5 or more minutes + + -- minutes + if secs >= 59.5 then + return sign .. round (secs / 60) .. " m" + end -- 59.5 or more seconds + + -- seconds + return sign .. round (secs) .. " s" +end -- function convert_time + +--[[ + +Commas in numbers + +This function adds commas to big numbers. +For example 123456 becomes "123,456". + +--]] + +-- ---------------------------------------------------------- + +function commas (num) + assert (type (num) == "number" or + type (num) == "string") + + local result = "" + + -- split number into 3 parts, eg. -1234.545e22 + -- sign = + or - + -- before = 1234 + -- after = .545e22 + + local sign, before, after = + string.match (tostring (num), "^([%+%-]?)(%d*)(%.?.*)$") + + -- pull out batches of 3 digits from the end, put a comma before them + + while string.len (before) > 3 do + result = "," .. string.sub (before, -3, -1) .. result + before = string.sub (before, 1, -4) -- remove last 3 digits + end -- while + + -- we want the original sign, any left-over digits, the comma part, + -- and the stuff after the decimal point, if any + return sign .. before .. result .. after + +end -- function commas + + +-- trim leading and trailing spaces from a string +function trim (s) + return (string.gsub (s, "^%s*(.-)%s*$", "%1")) +end -- trim + + +--[[ + +Shuffle a table + +-- see: http://en.wikipedia.org/wiki/Fisher-Yates_shuffle + +Example: + +cards = { "Ace", "King", "Queen", "Jack", 10, 9, 8, 7, 6, 5, 4, 3, 2 } + +shuffle (cards) + +--]] + +function shuffle(t) + local n = #t + + while n >= 2 do + -- n is now the last pertinent index + local k = math.random(n) -- 1 <= k <= n + -- Quick swap + t[n], t[k] = t[k], t[n] + n = n - 1 + end + + return t +end + + +--[[ + +Directory scanner. + +Calls function "f" for every file found in a path starting at "path". +Recurses to handle nested directories. Function "f" is called with two +arguments: (full) filename, statistics + +See utils.readdir for the exact names of the entries supplied for each file. + +See: http://www.gammon.com.au/forum/?id=9906 + + +Example: + + +plugins = {} + +-- this function is called for every found file +function load_file (name, stats) + + if stats.size > 0 and + string.match (name:lower (), "%.xml$") and + not stats.hidden then + table.insert (plugins, name) + end -- if + +end -- load_file + +-- Scan plugins folder, passing each file found to "load_file" function. + +scan_dir (GetInfo (60), load_file) + +--]] + + +function scan_dir (path, f) + + -- find all files in that directory + local t = assert (utils.readdir (path .. "\\*")) + + for k, v in pairs (t) do + + -- recurse to process subdirectory + if v.directory then + + if k ~= "." and k ~= ".." then + scan_dir (path .. "\\" .. k, f) + end -- not current or owner directory + + else -- call supplied function + f (path .. "\\" .. k, v) + end -- if + + end -- for + +end -- scan_dir diff --git a/cosmic rage/lua/copytable.lua b/cosmic rage/lua/copytable.lua new file mode 100644 index 0000000..1efb68d --- /dev/null +++ b/cosmic rage/lua/copytable.lua @@ -0,0 +1,89 @@ +-- copytable.lua + +--[[ + +Table copying functions. + +See: http://www.gammon.com.au/forum/?id=8042 + +Ideas by Shaun Biggs, David Haley, Nick Gammon + +Date: 21st July 2007 + +This is intended to copy tables (make a real copy, rather than just the table +reference). + +You can do a deep or shallow copy. + +Shallow: Simply copies the keys and values. +If a value is a table, you will get the same table as in the original. + +Deep: Copies keys and values recursively. +If a value is a table, makes a copy of that table, and so on. + +Deep copy based on: http://lua-users.org/wiki/CopyTable + +Restrictions: Items must be "safe" to copy (eg. not file IO userdata). + +The deep copied tables share the same metatable as the original ones. +To change this, change the line: + + return setmetatable(new_table, getmetatable(object)) + +to: + + return setmetatable(new_table, _copy (getmetatable(object)) + +Example: + +t1 = { + m = { a = 1, b = 2 }, + n = { c = 3, d = 4 }, + } + +require "copytable" -- load this file + +t2 = copytable.shallow (t1) -- shallow copy +t3 = copytable.deep (t1) -- copies sub tables as well + +--]] + +module (..., package.seeall) + + +function deep (object) + local lookup_table = {} + + local function _copy (object) + if type (object) ~= "table" then + return object + elseif lookup_table [object] then + return lookup_table [object] + end -- if + + local new_table = {} + lookup_table [object] = new_table + + for index, value in pairs (object) do + new_table [_copy (index)] = _copy (value) + end -- for + + return setmetatable (new_table, getmetatable (object)) + end -- function _copy + + return _copy (object) +end -- function deepcopy + +function shallow (t) + assert (type (t) == "table", "You must specify a table to copy") + + local result = {} + + for k, v in pairs (t) do + result [k] = v + end -- for each table element + + -- copy the metatable + return setmetatable (result, getmetatable (t)) + +end -- function shallow diff --git a/cosmic rage/lua/declare.lua b/cosmic rage/lua/declare.lua new file mode 100644 index 0000000..709b88d --- /dev/null +++ b/cosmic rage/lua/declare.lua @@ -0,0 +1,47 @@ +-- declare.lua +-- See: http://www.gammon.com.au/forum/?id=7327 +-- +-- If you use this inside a function you cannot access global variables that have +-- not already been declared, and must declare all local variables + +function force_declarations () + setfenv (2, setmetatable ({}, + { + __index = function (t, n) + error("variable '"..n.."' is not declared", 2) + end, + __newindex = function (t, n, v) + error("assign to undeclared variable '"..n.."'", 2) + end }) + ) +end -- force_declarations + +return force_declarations + +--[[ + + Example of use: + + + require "declare" + +function test (x) + -- capture any global variables we want + local print = print + + -- after this we can't access global variables, and must declare local ones + force_declarations () + + -- must declare every variable now before we use it + local a, b, c + + print (a) + a = 1 + b = 2 + c = x * 2 + print (c) +end -- test + +test (1) + +--]] diff --git a/cosmic rage/lua/gauge.lua b/cosmic rage/lua/gauge.lua new file mode 100644 index 0000000..2c828b1 --- /dev/null +++ b/cosmic rage/lua/gauge.lua @@ -0,0 +1,186 @@ +--[[ + + Function to draw a gauge (health bar). + + You specify the starting point, width, and height. + Also the name to show for the mouse-over window (eg. "HP). + + Author: Nick Gammon + Date: 14 February 2010 + + --]] + +function gauge (win, -- miniwindow ID to draw in + name, -- string, eg: "HP" + current, max, -- current and max value (eg. 50, 100) + -- if max is nil, then current is a percentage + left, top, width, height, -- where to put it inside the window + fg_colour, bg_colour, -- colour for bar, colour for unfilled part + ticks, tick_colour, -- number of ticks to draw, and in what colour + frame_colour, -- colour for frame around bar + shadow_colour, -- colour for shadow, nil for no shadow + no_gradient) -- don't use the gradient fill effect + + local Fraction + + if not current then + return + end -- if + + -- max == nil, means current is a percentage + if max then + if max <= 0 then + return + end -- no divide by zero + + Fraction = current / max + else + Fraction = current / 100 + end -- if + + -- fraction in range 0 to 1 + Fraction = math.min (math.max (Fraction, 0), 1) + + -- set up some defaults + height = height or 15 + fg_colour = fg_colour or ColourNameToRGB "mediumblue" + bg_colour = bg_colour or ColourNameToRGB "rosybrown" + ticks = ticks or 5 + tick_colour = tick_colour or ColourNameToRGB "silver" + frame_colour = frame_colour or ColourNameToRGB "lightgrey" + + -- shadow + if shadow_colour then + WindowRectOp (win, miniwin.rect_fill, left + 2, top + 2, left + width + 2, top + height + 2, shadow_colour) + end -- if + + -- background colour - for un-filled part + WindowRectOp (win, miniwin.rect_fill, left, top, left + width, top + height, bg_colour) -- fill entire box + + -- how big filled part is + local gauge_width = (width - 2) * Fraction + + -- box size must be > 0 or WindowGradient fills the whole thing + if math.floor (gauge_width) > 0 then + + if no_gradient then + WindowRectOp (win, miniwin.rect_fill, left+1, top, left+1+gauge_width, top+height, fg_colour) + else + -- top half + WindowGradient (win, left, top, + left + gauge_width, top + height / 2, + 0x000000, -- black + fg_colour, 2) -- vertical top to bottom + + -- bottom half + WindowGradient (win, left, top + height / 2, + left + gauge_width, top + height-1, + fg_colour, + 0x000000, -- black + 2) -- vertical top to bottom + end + + end -- non-zero + + -- draw tick marks if wanted + if ticks > 0 then + + -- show ticks (if there are 5 ticks there are 6 gaps) + local ticks_at = width / (ticks + 1) + + -- ticks + for i = 1, ticks do + WindowLine (win, left + (i * ticks_at), top, + left + (i * ticks_at), top + height, + tick_colour, 0, 1) + end -- for + + end -- ticks wanted + + -- draw a box around it (frame) + WindowRectOp (win, miniwin.rect_frame, left, top, left + width, top + height, frame_colour) + + if name and #name > 0 then + -- mouse-over information: add hotspot + WindowAddHotspot (win, name, left, top, left + width, top + height, + "", "", "", "", "", "", 0, 0) + + -- store numeric values in case they mouse over it + if max then + WindowHotspotTooltip(win, name, string.format ("%s\t%i / %i (%i%%)", + name, current, max, Fraction * 100) ) + else + WindowHotspotTooltip(win, name, string.format ("%s\t(%i%%)", + name, Fraction * 100) ) + end -- if + + end -- hotspot wanted + +end -- function gauge + +-- find which element in an array has the largest text size +function max_text_width (win, font_id, t, utf8) + local max = 0 + for _, s in ipairs (t) do + max = math.max (max, WindowTextWidth (win, font_id, s, utf8)) + end -- for each item + return max +end -- max_text_width + +-- get font from preferred font list +function get_preferred_font (t) + local fonts = utils.getfontfamilies () + + -- convert to upper-case + local f2 = {} + for k in pairs (fonts) do + f2 [k:upper ()] = true + end -- for + + for _, s in ipairs (t) do + if f2 [s:upper ()] then + return s + end -- if + end -- for each item + + return "Courier" +end -- get_preferred_font + +function capitalize (x) + return string.upper (string.sub(x, 1, 1)) .. string.lower (string.sub(x, 2)) +end -- capitalize + +function draw_3d_box (win, left, top, width, height) + local right = left + width + local bottom = top + height + + WindowCircleOp (win, miniwin.circle_round_rectangle, left, top, right, bottom, 0x505050, 0, 3, 0, 1) -- dark grey border (3 pixels) + WindowCircleOp (win, miniwin.circle_round_rectangle, left + 1, top + 1, right - 1, bottom - 1, 0x7C7C7C, 0, 1, 0, 1) -- lighter inner border + WindowCircleOp (win, miniwin.circle_round_rectangle, left + 2, top + 2, right - 2, bottom - 2, 0x000000, 0, 1, 0, 1) -- black inside that + WindowLine (win, left + 1, top + 1, right - 1, top + 1, 0xC2C2C2, 0, 1) -- light top edge + WindowLine (win, left + 1, top + 1, left + 1, bottom - 1, 0xC2C2C2, 0, 1) -- light left edge (for 3D look) +end -- draw_3d_box + +function draw_text_box (win, font, left, top, text, utf8, text_colour, fill_colour, border_colour) +local width = WindowTextWidth (win, font, text, utf8) +local font_height = WindowFontInfo (win, font, 1) + + WindowRectOp (win, miniwin.rect_fill, left - 3, top, left + width + 3, top + font_height + 4, fill_colour) -- fill + WindowText (win, font, text, left, top + 2, 0, 0, text_colour, utf8) -- draw text + WindowRectOp (win, miniwin.rect_frame, left - 3, top, left + width + 3, top + font_height + 4, border_colour) -- border + return width +end -- draw_text_box + +-- text with a black outline +function outlined_text(win, font, text, startx, starty, endx, endy, color, utf8) + WindowText(win, font, text, startx-1, starty-1, endx, endy, 0x000000, utf8) + WindowText(win, font, text, startx-1, starty, endx, endy, 0x000000, utf8) + WindowText(win, font, text, startx-1, starty+1, endx, endy, 0x000000, utf8) + WindowText(win, font, text, startx, starty-1, endx, endy, 0x000000, utf8) + WindowText(win, font, text, startx, starty+1, endx, endy, 0x000000, utf8) + WindowText(win, font, text, startx+1, starty-1, endx, endy, 0x000000, utf8) + WindowText(win, font, text, startx+1, starty, endx, endy, 0x000000, utf8) + WindowText(win, font, text, startx+1, starty+1, endx, endy, 0x000000, utf8) + WindowText(win, font, text, startx, starty, endx, endy, color, utf8) +end + diff --git a/cosmic rage/lua/getlines.lua b/cosmic rage/lua/getlines.lua new file mode 100644 index 0000000..30f4160 --- /dev/null +++ b/cosmic rage/lua/getlines.lua @@ -0,0 +1,48 @@ +-- getlines.lua +-- getlines iterator - iterates over a string and returns one item per line + +function getlines (str) + + local pos = 0 + + -- the for loop calls this for every iteration + -- returning nil terminates the loop + local function iterator (s) + + if not pos then + return nil + end -- end of string, exit loop + + local oldpos = pos + 1 -- step past previous newline + pos = string.find (s, "\n", oldpos) -- find next newline + + if not pos then -- no more newlines, return rest of string + return string.sub (s, oldpos) + end -- no newline + + return string.sub (s, oldpos, pos - 1) + + end -- iterator + + return iterator, str +end -- getlines + +return getlines + +--[=[ + + Example of use: + + require "getlines" + + test = [[ +every good +boy +deserves +fruit]] + +for l in getlines (test) do + print ('"' .. l .. '"') +end -- for + +--]=] diff --git a/cosmic rage/lua/getstyle.lua b/cosmic rage/lua/getstyle.lua new file mode 100644 index 0000000..279ac44 --- /dev/null +++ b/cosmic rage/lua/getstyle.lua @@ -0,0 +1,49 @@ +-- getstyle.lua +-- + +--[[ + +See forum thread: http://www.gammon.com.au/forum/?id=7818 + +GetStyle: + Finds a style run corresponding to a given column + + Returns nil if style run not found (eg. column out of range) + + If style run found returns: + * the style table (see below) + * the character at that column + * the style run number (eg. style 3) + +The style table should contain the following: + + t.text --> text of that (entire) style run + t.length --> length of the (entire) style run + t.textcolour --> text colour (RGB number) + t.backcolour --> background colour (RGB number) + t.style --> style bits (1=bold, 2=underline, 4=italic) + +--]] + +function GetStyle (styleRuns, wantedColumn) +local currentColumn = 1 + + -- check arguments + assert (type (styleRuns) == "table", + "First argument to GetStyle must be table of style runs") + + assert (type (wantedColumn) == "number" and wantedColumn >= 1, + "Second argument to GetStyle must be column number to find") + + -- go through each style + for item, style in ipairs (styleRuns) do + local position = wantedColumn - currentColumn + 1 -- where letter is in style + currentColumn = currentColumn + style.length -- next style starts here + if currentColumn > wantedColumn then -- if we are within this style + return style, string.sub (style.text, position, position), item -- done + end -- if found column + end -- for each style + + -- if not found: result is nil + +end -- function GetStyle diff --git a/cosmic rage/lua/getworld.lua b/cosmic rage/lua/getworld.lua new file mode 100644 index 0000000..ac66b42 --- /dev/null +++ b/cosmic rage/lua/getworld.lua @@ -0,0 +1,111 @@ + +-- table of worlds we couldn't open +cannot_open_world = cannot_open_world or {} -- set flag here if can't open world +-- getworld.lua +-- + +--[[ + +See forum thread: http://www.gammon.com.au/forum/?id=7991 + +This simplifies sending triggered lines to another, dummy, world. + +get_a_world (name) - returns a world pointer to the named world, opening it if necessary + +send_to_world (name, styles) - sends the style runs to the named world, calling get_a_world + to get it + +--]] + + +-- make the named world, if necessary - adds "extra" lines to the world file (eg. plugins) +function make_world (name, extra, folder) + + local filename = GetInfo (57) + if folder then + filename = filename .. folder .. "\\" + end -- if folder wanted + + filename = filename .. name .. ".mcl" + local f = io.open (filename, "r") + + if f then + f:close () + return + end -- world file exists + + f = io.output (filename) -- create world file + + assert (f:write ([[ + + + + + + + + + ]] .. extra .. [[ + + + ]])) + + f:close () -- close world file now + + -- and open the file ;P + Open (filename) + +end -- make_world + +-- open a world by name, return world object or nil if cannot +function get_a_world (name, folder) + + -- try to find world + local w = GetWorld (name) -- get world + + -- if not found, try to open it in worlds directory + + if not cannot_open_world [name] and not w then + local filename = GetInfo (57) + if folder then + filename = filename .. folder .. "\\" + end -- if folder wanted + + filename = filename .. name .. ".mcl" + Open (filename) -- get MUSHclient to open it + Activate () -- make our original world active again + w = GetWorld (name) -- try again to get the world object + if w then + w:DeleteOutput () -- delete "welcome to MUSHclient" message + else + ColourNote ("white", "red", "Can't open world file: " .. filename) + cannot_open_world [name] = true -- don't repeatedly show failure message + end -- can't find world + end -- can't find world first time around + + return w + +end -- get_a_world + +-- send the styles (eg. from a trigger) to the named world, opening it if necessary +function send_to_world (name, styles) + + local w = get_a_world (name) + + if w then -- if present + for _, v in ipairs (styles) do + w:ColourTell (RGBColourToName (v.textcolour), + RGBColourToName (v.backcolour), + v.text) + end -- for each style run + w:Note ("") -- wrap up line + + end -- world found + + return w -- so they can check if we succeeded + +end -- send_to_world diff --git a/cosmic rage/lua/json.lua b/cosmic rage/lua/json.lua new file mode 100644 index 0000000..cc44cd0 --- /dev/null +++ b/cosmic rage/lua/json.lua @@ -0,0 +1,24 @@ +--[[ + Licensed according to the included 'LICENSE' document + Author: Thomas Harning Jr +]] +local decode = require("json.decode") +local encode = require("json.encode") +local util = require("json.util") + +local _G = _G + +local _ENV = nil + +local json = { + _VERSION = "1.3.4", + _DESCRIPTION = "LuaJSON : customizable JSON decoder/encoder", + _COPYRIGHT = "Copyright (c) 2007-2014 Thomas Harning Jr. ", + decode = decode, + encode = encode, + util = util +} + +_G.json = json + +return json diff --git a/cosmic rage/lua/json/decode.lua b/cosmic rage/lua/json/decode.lua new file mode 100644 index 0000000..b2c357c --- /dev/null +++ b/cosmic rage/lua/json/decode.lua @@ -0,0 +1,171 @@ +--[[ + Licensed according to the included 'LICENSE' document + Author: Thomas Harning Jr +]] +local lpeg = require("lpeg") + +local error = error +local pcall = pcall + +local jsonutil = require("json.util") +local merge = jsonutil.merge +local util = require("json.decode.util") + +local decode_state = require("json.decode.state") + +local setmetatable, getmetatable = setmetatable, getmetatable +local assert = assert +local ipairs, pairs = ipairs, pairs +local string_char = require("string").char + +local type = type + +local require = require + +local _ENV = nil + +local modulesToLoad = { + "composite", + "strings", + "number", + "others" +} +local loadedModules = { +} + +local json_decode = {} + +json_decode.default = { + unicodeWhitespace = true, + initialObject = false, + nothrow = false +} + +local modes_defined = { "default", "strict", "simple" } + +json_decode.simple = {} + +json_decode.strict = { + unicodeWhitespace = true, + initialObject = true, + nothrow = false +} + +for _,name in ipairs(modulesToLoad) do + local mod = require("json.decode." .. name) + if mod.mergeOptions then + for _, mode in pairs(modes_defined) do + mod.mergeOptions(json_decode[mode], mode) + end + end + loadedModules[#loadedModules + 1] = mod +end + +-- Shift over default into defaultOptions to permit build optimization +local defaultOptions = json_decode.default +json_decode.default = nil + +local function generateDecoder(lexer, options) + -- Marker to permit detection of final end + local marker = {} + local parser = lpeg.Ct((options.ignored * lexer)^0 * lpeg.Cc(marker)) * options.ignored * (lpeg.P(-1) + util.unexpected()) + local decoder = function(data) + local state = decode_state.create(options) + local parsed = parser:match(data) + assert(parsed, "Invalid JSON data") + local i = 0 + while true do + i = i + 1 + local item = parsed[i] + if item == marker then break end + if type(item) == 'function' and item ~= jsonutil.undefined and item ~= jsonutil.null then + item(state) + else + state:set_value(item) + end + end + if options.initialObject then + assert(type(state.previous) == 'table', "Initial value not an object or array") + end + -- Make sure stack is empty + assert(state.i == 0, "Unclosed elements present") + return state.previous + end + if options.nothrow then + return function(data) + local status, rv = pcall(decoder, data) + if status then + return rv + else + return nil, rv + end + end + end + return decoder +end + +local function buildDecoder(mode) + mode = mode and merge({}, defaultOptions, mode) or defaultOptions + for _, mod in ipairs(loadedModules) do + if mod.mergeOptions then + mod.mergeOptions(mode) + end + end + local ignored = mode.unicodeWhitespace and util.unicode_ignored or util.ascii_ignored + -- Store 'ignored' in the global options table + mode.ignored = ignored + + --local grammar = { + -- [1] = mode.initialObject and (ignored * (object_type + array_type)) or value_type + --} + local lexer + for _, mod in ipairs(loadedModules) do + local new_lexer = mod.generateLexer(mode) + lexer = lexer and lexer + new_lexer or new_lexer + end + return generateDecoder(lexer, mode) +end + +-- Since 'default' is nil, we cannot take map it +local defaultDecoder = buildDecoder(json_decode.default) +local prebuilt_decoders = {} +for _, mode in pairs(modes_defined) do + if json_decode[mode] ~= nil then + prebuilt_decoders[json_decode[mode]] = buildDecoder(json_decode[mode]) + end +end + +--[[ +Options: + number => number decode options + string => string decode options + array => array decode options + object => object decode options + initialObject => whether or not to require the initial object to be a table/array + allowUndefined => whether or not to allow undefined values +]] +local function getDecoder(mode) + mode = mode == true and json_decode.strict or mode or json_decode.default + local decoder = mode == nil and defaultDecoder or prebuilt_decoders[mode] + if decoder then + return decoder + end + return buildDecoder(mode) +end + +local function decode(data, mode) + local decoder = getDecoder(mode) + return decoder(data) +end + +local mt = {} +mt.__call = function(self, ...) + return decode(...) +end + +json_decode.getDecoder = getDecoder +json_decode.decode = decode +json_decode.util = util +setmetatable(json_decode, mt) + +return json_decode diff --git a/cosmic rage/lua/json/decode/array.lua b/cosmic rage/lua/json/decode/array.lua new file mode 100644 index 0000000..cbdea4c --- /dev/null +++ b/cosmic rage/lua/json/decode/array.lua @@ -0,0 +1,64 @@ +--[[ + Licensed according to the included 'LICENSE' document + Author: Thomas Harning Jr +--]] +local lpeg = require("lpeg") + +local util = require("json.decode.util") +local jsonutil = require("json.util") + +local table_maxn = require("table").maxn + +local unpack = unpack + +module("json.decode.array") + +-- Utility function to help manage slighly sparse arrays +local function processArray(array) + local max_n = table_maxn(array) + -- Only populate 'n' if it is necessary + if #array ~= max_n then + array.n = max_n + end + if jsonutil.InitArray then + array = jsonutil.InitArray(array) or array + end + return array +end + +local defaultOptions = { + trailingComma = true +} + +default = nil -- Let the buildCapture optimization take place +strict = { + trailingComma = false +} + +local function buildCapture(options, global_options) + local ignored = global_options.ignored + -- arrayItem == element + local arrayItem = lpeg.V(util.types.VALUE) + local arrayElements = lpeg.Ct(arrayItem * (ignored * lpeg.P(',') * ignored * arrayItem)^0 + 0) / processArray + + options = options and jsonutil.merge({}, defaultOptions, options) or defaultOptions + local capture = lpeg.P("[") + capture = capture * ignored + * arrayElements * ignored + if options.trailingComma then + capture = capture * (lpeg.P(",") + 0) * ignored + end + capture = capture * lpeg.P("]") + return capture +end + +function register_types() + util.register_type("ARRAY") +end + +function load_types(options, global_options, grammar) + local capture = buildCapture(options, global_options) + local array_id = util.types.ARRAY + grammar[array_id] = capture + util.append_grammar_item(grammar, "VALUE", lpeg.V(array_id)) +end diff --git a/cosmic rage/lua/json/decode/calls.lua b/cosmic rage/lua/json/decode/calls.lua new file mode 100644 index 0000000..88642fd --- /dev/null +++ b/cosmic rage/lua/json/decode/calls.lua @@ -0,0 +1,116 @@ +--[[ + Licensed according to the included 'LICENSE' document + Author: Thomas Harning Jr +--]] +local lpeg = require("lpeg") +local tostring = tostring +local pairs, ipairs = pairs, ipairs +local next, type = next, type +local error = error + +local util = require("json.decode.util") + +local buildCall = require("json.util").buildCall + +local getmetatable = getmetatable + +module("json.decode.calls") + +local defaultOptions = { + defs = nil, + -- By default, do not allow undefined calls to be de-serialized as call objects + allowUndefined = false +} + +-- No real default-option handling needed... +default = nil +strict = nil + +local isPattern +if lpeg.type then + function isPattern(value) + return lpeg.type(value) == 'pattern' + end +else + local metaAdd = getmetatable(lpeg.P("")).__add + function isPattern(value) + return getmetatable(value).__add == metaAdd + end +end + +local function buildDefinedCaptures(argumentCapture, defs) + local callCapture + if not defs then return end + for name, func in pairs(defs) do + if type(name) ~= 'string' and not isPattern(name) then + error("Invalid functionCalls name: " .. tostring(name) .. " not a string or LPEG pattern") + end + -- Allow boolean or function to match up w/ encoding permissions + if type(func) ~= 'boolean' and type(func) ~= 'function' then + error("Invalid functionCalls item: " .. name .. " not a function") + end + local nameCallCapture + if type(name) == 'string' then + nameCallCapture = lpeg.P(name .. "(") * lpeg.Cc(name) + else + -- Name matcher expected to produce a capture + nameCallCapture = name * "(" + end + -- Call func over nameCallCapture and value to permit function receiving name + + -- Process 'func' if it is not a function + if type(func) == 'boolean' then + local allowed = func + func = function(name, ...) + if not allowed then + error("Function call on '" .. name .. "' not permitted") + end + return buildCall(name, ...) + end + else + local inner_func = func + func = function(...) + return (inner_func(...)) + end + end + local newCapture = (nameCallCapture * argumentCapture) / func * ")" + if not callCapture then + callCapture = newCapture + else + callCapture = callCapture + newCapture + end + end + return callCapture +end + +local function buildCapture(options) + if not options -- No ops, don't bother to parse + or not (options.defs and (nil ~= next(options.defs)) or options.allowUndefined) then + return nil + end + -- Allow zero or more arguments separated by commas + local value = lpeg.V(util.types.VALUE) + local argumentCapture = (value * (lpeg.P(",") * value)^0) + 0 + local callCapture = buildDefinedCaptures(argumentCapture, options.defs) + if options.allowUndefined then + local function func(name, ...) + return buildCall(name, ...) + end + -- Identifier-type-match + local nameCallCapture = lpeg.C(util.identifier) * "(" + local newCapture = (nameCallCapture * argumentCapture) / func * ")" + if not callCapture then + callCapture = newCapture + else + callCapture = callCapture + newCapture + end + end + return callCapture +end + +function load_types(options, global_options, grammar) + local capture = buildCapture(options, global_options) + if capture then + util.append_grammar_item(grammar, "VALUE", capture) + end +end diff --git a/cosmic rage/lua/json/decode/composite.lua b/cosmic rage/lua/json/decode/composite.lua new file mode 100644 index 0000000..cd9c289 --- /dev/null +++ b/cosmic rage/lua/json/decode/composite.lua @@ -0,0 +1,190 @@ +--[[ + Licensed according to the included 'LICENSE' document + Author: Thomas Harning Jr +]] +local pairs = pairs +local type = type + +local lpeg = require("lpeg") + +local util = require("json.decode.util") +local jsonutil = require("json.util") + +local rawset = rawset + +local assert = assert +local tostring = tostring + +local error = error +local getmetatable = getmetatable + +local _ENV = nil + +local defaultOptions = { + array = { + trailingComma = true + }, + object = { + trailingComma = true, + number = true, + identifier = true, + setObjectKey = rawset + }, + calls = { + defs = nil, + -- By default, do not allow undefined calls to be de-serialized as call objects + allowUndefined = false + } +} + +local modeOptions = { + default = nil, + strict = { + array = { + trailingComma = false + }, + object = { + trailingComma = false, + number = false, + identifier = false + } + } +} + +local function BEGIN_ARRAY(state) + state:push() + state:new_array() +end +local function END_ARRAY(state) + state:end_array() + state:pop() +end + +local function BEGIN_OBJECT(state) + state:push() + state:new_object() +end +local function END_OBJECT(state) + state:end_object() + state:pop() +end + +local function END_CALL(state) + state:end_call() + state:pop() +end + +local function SET_KEY(state) + state:set_key() +end + +local function NEXT_VALUE(state) + state:put_value() +end + +local function mergeOptions(options, mode) + jsonutil.doOptionMerge(options, true, 'array', defaultOptions, mode and modeOptions[mode]) + jsonutil.doOptionMerge(options, true, 'object', defaultOptions, mode and modeOptions[mode]) + jsonutil.doOptionMerge(options, true, 'calls', defaultOptions, mode and modeOptions[mode]) +end + + +local isPattern +if lpeg.type then + function isPattern(value) + return lpeg.type(value) == 'pattern' + end +else + local metaAdd = getmetatable(lpeg.P("")).__add + function isPattern(value) + return getmetatable(value).__add == metaAdd + end +end + + +local function generateSingleCallLexer(name, func) + if type(name) ~= 'string' and not isPattern(name) then + error("Invalid functionCalls name: " .. tostring(name) .. " not a string or LPEG pattern") + end + -- Allow boolean or function to match up w/ encoding permissions + if type(func) ~= 'boolean' and type(func) ~= 'function' then + error("Invalid functionCalls item: " .. name .. " not a function") + end + local function buildCallCapture(name) + return function(state) + if func == false then + error("Function call on '" .. name .. "' not permitted") + end + state:push() + state:new_call(name, func) + end + end + local nameCallCapture + if type(name) == 'string' then + nameCallCapture = lpeg.P(name .. "(") * lpeg.Cc(name) / buildCallCapture + else + -- Name matcher expected to produce a capture + nameCallCapture = name * "(" / buildCallCapture + end + -- Call func over nameCallCapture and value to permit function receiving name + return nameCallCapture +end + +local function generateNamedCallLexers(options) + if not options.calls or not options.calls.defs then + return + end + local callCapture + for name, func in pairs(options.calls.defs) do + local newCapture = generateSingleCallLexer(name, func) + if not callCapture then + callCapture = newCapture + else + callCapture = callCapture + newCapture + end + end + return callCapture +end + +local function generateCallLexer(options) + local lexer + local namedCapture = generateNamedCallLexers(options) + if options.calls and options.calls.allowUndefined then + lexer = generateSingleCallLexer(lpeg.C(util.identifier), true) + end + if namedCapture then + lexer = lexer and lexer + namedCapture or namedCapture + end + if lexer then + lexer = lexer + lpeg.P(")") * lpeg.Cc(END_CALL) + end + return lexer +end + +local function generateLexer(options) + local ignored = options.ignored + local array_options, object_options = options.array, options.object + local lexer = + lpeg.P("[") * lpeg.Cc(BEGIN_ARRAY) + + lpeg.P("]") * lpeg.Cc(END_ARRAY) + + lpeg.P("{") * lpeg.Cc(BEGIN_OBJECT) + + lpeg.P("}") * lpeg.Cc(END_OBJECT) + + lpeg.P(":") * lpeg.Cc(SET_KEY) + + lpeg.P(",") * lpeg.Cc(NEXT_VALUE) + if object_options.identifier then + -- Add identifier match w/ validation check that it is in key + lexer = lexer + lpeg.C(util.identifier) * ignored * lpeg.P(":") * lpeg.Cc(SET_KEY) + end + local callLexers = generateCallLexer(options) + if callLexers then + lexer = lexer + callLexers + end + return lexer +end + +local composite = { + mergeOptions = mergeOptions, + generateLexer = generateLexer +} + +return composite diff --git a/cosmic rage/lua/json/decode/number.lua b/cosmic rage/lua/json/decode/number.lua new file mode 100644 index 0000000..94ed3b8 --- /dev/null +++ b/cosmic rage/lua/json/decode/number.lua @@ -0,0 +1,100 @@ +--[[ + Licensed according to the included 'LICENSE' document + Author: Thomas Harning Jr +]] +local lpeg = require("lpeg") +local tonumber = tonumber +local jsonutil = require("json.util") +local merge = jsonutil.merge +local util = require("json.decode.util") + +local _ENV = nil + +local digit = lpeg.R("09") +local digits = digit^1 + +-- Illegal octal declaration +local illegal_octal_detect = #(lpeg.P('0') * digits) * util.denied("Octal numbers") + +local int = (lpeg.P('-') + 0) * (lpeg.R("19") * digits + illegal_octal_detect + digit) + +local frac = lpeg.P('.') * digits + +local exp = lpeg.S("Ee") * (lpeg.S("-+") + 0) * digits + +local nan = lpeg.S("Nn") * lpeg.S("Aa") * lpeg.S("Nn") +local inf = lpeg.S("Ii") * lpeg.P("nfinity") +local ninf = lpeg.P('-') * lpeg.S("Ii") * lpeg.P("nfinity") +local hex = (lpeg.P("0x") + lpeg.P("0X")) * lpeg.R("09","AF","af")^1 + +local defaultOptions = { + nan = true, + inf = true, + frac = true, + exp = true, + hex = false +} + +local modeOptions = {} + +modeOptions.strict = { + nan = false, + inf = false +} + +local nan_value = 0/0 +local inf_value = 1/0 +local ninf_value = -1/0 + +--[[ + Options: configuration options for number rules + nan: match NaN + inf: match Infinity + frac: match fraction portion (.0) + exp: match exponent portion (e1) + DEFAULT: nan, inf, frac, exp +]] +local function mergeOptions(options, mode) + jsonutil.doOptionMerge(options, false, 'number', defaultOptions, mode and modeOptions[mode]) +end + +local function generateLexer(options) + options = options.number + local ret = int + if options.frac then + ret = ret * (frac + 0) + else + ret = ret * (#frac * util.denied("Fractions", "number.frac") + 0) + end + if options.exp then + ret = ret * (exp + 0) + else + ret = ret * (#exp * util.denied("Exponents", "number.exp") + 0) + end + if options.hex then + ret = hex + ret + else + ret = #hex * util.denied("Hexadecimal", "number.hex") + ret + end + -- Capture number now + ret = ret / tonumber + if options.nan then + ret = ret + nan / function() return nan_value end + else + ret = ret + #nan * util.denied("NaN", "number.nan") + end + if options.inf then + ret = ret + ninf / function() return ninf_value end + inf / function() return inf_value end + else + ret = ret + (#ninf + #inf) * util.denied("+/-Inf", "number.inf") + end + return ret +end + +local number = { + int = int, + mergeOptions = mergeOptions, + generateLexer = generateLexer +} + +return number diff --git a/cosmic rage/lua/json/decode/object.lua b/cosmic rage/lua/json/decode/object.lua new file mode 100644 index 0000000..a4b8362 --- /dev/null +++ b/cosmic rage/lua/json/decode/object.lua @@ -0,0 +1,103 @@ +--[[ + Licensed according to the included 'LICENSE' document + Author: Thomas Harning Jr +--]] +local lpeg = require("lpeg") + +local util = require("json.decode.util") +local merge = require("json.util").merge + +local tonumber = tonumber +local unpack = unpack +local print = print +local tostring = tostring + +local rawset = rawset + +module("json.decode.object") + +-- BEGIN LPEG < 0.9 SUPPORT +local initObject, applyObjectKey +if not (lpeg.Cg and lpeg.Cf and lpeg.Ct) then + function initObject() + return {} + end + function applyObjectKey(tab, key, val) + tab[key] = val + return tab + end +end +-- END LPEG < 0.9 SUPPORT + +local defaultOptions = { + number = true, + identifier = true, + trailingComma = true +} + +default = nil -- Let the buildCapture optimization take place + +strict = { + number = false, + identifier = false, + trailingComma = false +} + +local function buildItemSequence(objectItem, ignored) + return (objectItem * (ignored * lpeg.P(",") * ignored * objectItem)^0) + 0 +end + +local function buildCapture(options, global_options) + local ignored = global_options.ignored + local string_type = lpeg.V(util.types.STRING) + local integer_type = lpeg.V(util.types.INTEGER) + local value_type = lpeg.V(util.types.VALUE) + options = options and merge({}, defaultOptions, options) or defaultOptions + local key = string_type + if options.identifier then + key = key + lpeg.C(util.identifier) + end + if options.number then + key = key + integer_type + end + local objectItems + local objectItem = (key * ignored * lpeg.P(":") * ignored * value_type) + -- BEGIN LPEG < 0.9 SUPPORT + if not (lpeg.Cg and lpeg.Cf and lpeg.Ct) then + local set_key = applyObjectKey + if options.setObjectKey then + local setObjectKey = options.setObjectKey + set_key = function(tab, key, val) + setObjectKey(tab, key, val) + return tab + end + end + + objectItems = buildItemSequence(objectItem / set_key, ignored) + objectItems = lpeg.Ca(lpeg.Cc(false) / initObject * objectItems) + -- END LPEG < 0.9 SUPPORT + else + objectItems = buildItemSequence(lpeg.Cg(objectItem), ignored) + objectItems = lpeg.Cf(lpeg.Ct(0) * objectItems, options.setObjectKey or rawset) + end + + + local capture = lpeg.P("{") * ignored + capture = capture * objectItems * ignored + if options.trailingComma then + capture = capture * (lpeg.P(",") + 0) * ignored + end + capture = capture * lpeg.P("}") + return capture +end + +function register_types() + util.register_type("OBJECT") +end + +function load_types(options, global_options, grammar) + local capture = buildCapture(options, global_options) + local object_id = util.types.OBJECT + grammar[object_id] = capture + util.append_grammar_item(grammar, "VALUE", lpeg.V(object_id)) +end diff --git a/cosmic rage/lua/json/decode/others.lua b/cosmic rage/lua/json/decode/others.lua new file mode 100644 index 0000000..9fab7a8 --- /dev/null +++ b/cosmic rage/lua/json/decode/others.lua @@ -0,0 +1,62 @@ +--[[ + Licensed according to the included 'LICENSE' document + Author: Thomas Harning Jr +]] +local lpeg = require("lpeg") +local jsonutil = require("json.util") +local merge = jsonutil.merge +local util = require("json.decode.util") + +-- Container module for other JavaScript types (bool, null, undefined) + +local _ENV = nil + +-- For null and undefined, use the util.null value to preserve null-ness +local booleanCapture = + lpeg.P("true") * lpeg.Cc(true) + + lpeg.P("false") * lpeg.Cc(false) + +local nullCapture = lpeg.P("null") +local undefinedCapture = lpeg.P("undefined") + +local defaultOptions = { + allowUndefined = true, + null = jsonutil.null, + undefined = jsonutil.undefined +} + +local modeOptions = {} + +modeOptions.simple = { + null = false, -- Mapped to nil + undefined = false -- Mapped to nil +} +modeOptions.strict = { + allowUndefined = false +} + +local function mergeOptions(options, mode) + jsonutil.doOptionMerge(options, false, 'others', defaultOptions, mode and modeOptions[mode]) +end + +local function generateLexer(options) + -- The 'or nil' clause allows false to map to a nil value since 'nil' cannot be merged + options = options.others + local valueCapture = ( + booleanCapture + + nullCapture * lpeg.Cc(options.null or nil) + ) + if options.allowUndefined then + valueCapture = valueCapture + undefinedCapture * lpeg.Cc(options.undefined or nil) + else + valueCapture = valueCapture + #undefinedCapture * util.denied("undefined", "others.allowUndefined") + end + return valueCapture +end + +local others = { + mergeOptions = mergeOptions, + generateLexer = generateLexer +} + +return others diff --git a/cosmic rage/lua/json/decode/state.lua b/cosmic rage/lua/json/decode/state.lua new file mode 100644 index 0000000..693d5df --- /dev/null +++ b/cosmic rage/lua/json/decode/state.lua @@ -0,0 +1,189 @@ +--[[ + Licensed according to the included 'LICENSE' document + Author: Thomas Harning Jr +]] + +local setmetatable = setmetatable +local jsonutil = require("json.util") +local assert = assert +local type = type +local next = next +local unpack = require("table").unpack or unpack + +local _ENV = nil + +local state_ops = {} +local state_mt = { + __index = state_ops +} + +function state_ops.pop(self) + self.previous_set = true + self.previous = self.active + local i = self.i + -- Load in this array into the active item + self.active = self.stack[i] + self.active_state = self.state_stack[i] + self.active_key = self.key_stack[i] + self.stack[i] = nil + self.state_stack[i] = nil + self.key_stack[i] = nil + + self.i = i - 1 +end + +function state_ops.push(self) + local i = self.i + 1 + self.i = i + + self.stack[i] = self.active + self.state_stack[i] = self.active_state + self.key_stack[i] = self.active_key +end + +function state_ops.put_object_value(self, trailing) + local object_options = self.options.object + if trailing and object_options.trailingComma then + if not self.active_key then + return + end + end + assert(self.active_key, "Missing key value") + object_options.setObjectKey(self.active, self.active_key, self:grab_value()) + self.active_key = nil +end + +function state_ops.put_array_value(self, trailing) + -- Safety check + if trailing and not self.previous_set and self.options.array.trailingComma then + return + end + local new_index = self.active_state + 1 + self.active_state = new_index + self.active[new_index] = self:grab_value() +end + +function state_ops.put_value(self, trailing) + if self.active_state == 'object' then + self:put_object_value(trailing) + else + self:put_array_value(trailing) + end +end + +function state_ops.new_array(self) + local new_array = {} + if jsonutil.InitArray then + new_array = jsonutil.InitArray(new_array) or new_array + end + self.active = new_array + self.active_state = 0 + self.active_key = nil + self:unset_value() +end + +function state_ops.end_array(self) + if self.previous_set or self.active_state ~= 0 then + -- Not an empty array + self:put_value(true) + end + if self.active_state ~= #self.active then + -- Store the length in + self.active.n = self.active_state + end +end + +function state_ops.new_object(self) + local new_object = {} + self.active = new_object + self.active_state = 'object' + self.active_key = nil + self:unset_value() +end + +function state_ops.end_object(self) + if self.previous_set or next(self.active) then + -- Not an empty object + self:put_value(true) + end +end + +function state_ops.new_call(self, name, func) + -- TODO setup properly + local new_call = {} + new_call.name = name + new_call.func = func + self.active = new_call + self.active_state = 0 + self.active_key = nil + self:unset_value() +end + +function state_ops.end_call(self) + if self.previous_set or self.active_state ~= 0 then + -- Not an empty array + self:put_value(true) + end + if self.active_state ~= #self.active then + -- Store the length in + self.active.n = self.active_state + end + local func = self.active.func + if func == true then + func = jsonutil.buildCall + end + self.active = func(self.active.name, unpack(self.active, 1, self.active.n or #self.active)) +end + + +function state_ops.unset_value(self) + self.previous_set = false + self.previous = nil +end + +function state_ops.grab_value(self) + assert(self.previous_set, "Previous value not set") + self.previous_set = false + return self.previous +end + +function state_ops.set_value(self, value) + assert(not self.previous_set, "Value set when one already in slot") + self.previous_set = true + self.previous = value +end + +function state_ops.set_key(self) + assert(self.active_state == 'object', "Cannot set key on array") + local value = self:grab_value() + local value_type = type(value) + if self.options.object.number then + assert(value_type == 'string' or value_type == 'number', "As configured, a key must be a number or string") + else + assert(value_type == 'string', "As configured, a key must be a string") + end + self.active_key = value +end + + +local function create(options) + local ret = { + options = options, + stack = {}, + state_stack = {}, + key_stack = {}, + i = 0, + active = nil, + active_key = nil, + previous = nil, + active_state = nil + + } + return setmetatable(ret, state_mt) +end + +local state = { + create = create +} + +return state diff --git a/cosmic rage/lua/json/decode/strings.lua b/cosmic rage/lua/json/decode/strings.lua new file mode 100644 index 0000000..4272f29 --- /dev/null +++ b/cosmic rage/lua/json/decode/strings.lua @@ -0,0 +1,133 @@ +--[[ + Licensed according to the included 'LICENSE' document + Author: Thomas Harning Jr +]] +local lpeg = require("lpeg") +local jsonutil = require("json.util") +local util = require("json.decode.util") +local merge = jsonutil.merge + +local tonumber = tonumber +local string_char = require("string").char +local floor = require("math").floor +local table_concat = require("table").concat + +local error = error + +local _ENV = nil + +local function get_error(item) + local fmt_string = item .. " in string [%q] @ %i:%i" + return lpeg.P(function(data, index) + local line, line_index, bad_char, last_line = util.get_invalid_character_info(data, index) + local err = fmt_string:format(bad_char, line, line_index) + error(err) + end) * 1 +end + +local bad_unicode = get_error("Illegal unicode escape") +local bad_hex = get_error("Illegal hex escape") +local bad_character = get_error("Illegal character") +local bad_escape = get_error("Illegal escape") + +local knownReplacements = { + ["'"] = "'", + ['"'] = '"', + ['\\'] = '\\', + ['/'] = '/', + b = '\b', + f = '\f', + n = '\n', + r = '\r', + t = '\t', + v = '\v', + z = '\z' +} + +-- according to the table at http://da.wikipedia.org/wiki/UTF-8 +local function utf8DecodeUnicode(code1, code2) + code1, code2 = tonumber(code1, 16), tonumber(code2, 16) + if code1 == 0 and code2 < 0x80 then + return string_char(code2) + end + if code1 < 0x08 then + return string_char( + 0xC0 + code1 * 4 + floor(code2 / 64), + 0x80 + code2 % 64) + end + return string_char( + 0xE0 + floor(code1 / 16), + 0x80 + (code1 % 16) * 4 + floor(code2 / 64), + 0x80 + code2 % 64) +end + +local function decodeX(code) + code = tonumber(code, 16) + return string_char(code) +end + +local doSimpleSub = lpeg.C(lpeg.S("'\"\\/bfnrtvz")) / knownReplacements +local doUniSub = lpeg.P('u') * (lpeg.C(util.hexpair) * lpeg.C(util.hexpair) + bad_unicode) +local doXSub = lpeg.P('x') * (lpeg.C(util.hexpair) + bad_hex) + +local defaultOptions = { + badChars = '', + additionalEscapes = false, -- disallow untranslated escapes + escapeCheck = #lpeg.S('bfnrtv/\\"xu\'z'), -- no check on valid characters + decodeUnicode = utf8DecodeUnicode, + strict_quotes = false +} + +local modeOptions = {} + +modeOptions.strict = { + badChars = '\b\f\n\r\t\v', + additionalEscapes = false, -- no additional escapes + escapeCheck = #lpeg.S('bfnrtv/\\"u'), --only these chars are allowed to be escaped + strict_quotes = true +} + +local function mergeOptions(options, mode) + jsonutil.doOptionMerge(options, false, 'strings', defaultOptions, mode and modeOptions[mode]) +end + +local function buildCaptureString(quote, badChars, escapeMatch) + local captureChar = (1 - lpeg.S("\\" .. badChars .. quote)) + (lpeg.P("\\") / "" * escapeMatch) + -- During error, force end + local captureString = captureChar^0 + (-#lpeg.P(quote) * bad_character + -1) + return lpeg.P(quote) * lpeg.Cs(captureString) * lpeg.P(quote) +end + +local function generateLexer(options) + options = options.strings + local quotes = { '"' } + if not options.strict_quotes then + quotes[#quotes + 1] = "'" + end + local escapeMatch = doSimpleSub + escapeMatch = escapeMatch + doXSub / decodeX + escapeMatch = escapeMatch + doUniSub / options.decodeUnicode + if options.escapeCheck then + escapeMatch = options.escapeCheck * escapeMatch + bad_escape + end + if options.additionalEscapes then + escapeMatch = options.additionalEscapes + escapeMatch + end + local captureString + for i = 1, #quotes do + local cap = buildCaptureString(quotes[i], options.badChars, escapeMatch) + if captureString == nil then + captureString = cap + else + captureString = captureString + cap + end + end + return captureString +end + +local strings = { + mergeOptions = mergeOptions, + generateLexer = generateLexer +} + +return strings diff --git a/cosmic rage/lua/json/decode/util.lua b/cosmic rage/lua/json/decode/util.lua new file mode 100644 index 0000000..2493bf3 --- /dev/null +++ b/cosmic rage/lua/json/decode/util.lua @@ -0,0 +1,121 @@ +--[[ + Licensed according to the included 'LICENSE' document + Author: Thomas Harning Jr +]] +local lpeg = require("lpeg") +local select = select +local pairs, ipairs = pairs, ipairs +local tonumber = tonumber +local string_char = require("string").char +local rawset = rawset +local jsonutil = require("json.util") + +local error = error +local setmetatable = setmetatable + +local table_concat = require("table").concat + +local merge = require("json.util").merge + +local _ENV = nil + +local function get_invalid_character_info(input, index) + local parsed = input:sub(1, index) + local bad_character = input:sub(index, index) + local _, line_number = parsed:gsub('\n',{}) + local last_line = parsed:match("\n([^\n]+.)$") or parsed + return line_number, #last_line, bad_character, last_line +end + +local function build_report(msg) + local fmt = msg:gsub("%%", "%%%%") .. " @ character: %i %i:%i [%s] line:\n%s" + return lpeg.P(function(data, pos) + local line, line_index, bad_char, last_line = get_invalid_character_info(data, pos) + local text = fmt:format(pos, line, line_index, bad_char, last_line) + error(text) + end) * 1 +end +local function unexpected() + local msg = "unexpected character" + return build_report(msg) +end +local function denied(item, option) + local msg + if option then + msg = ("'%s' denied by option set '%s'"):format(item, option) + else + msg = ("'%s' denied"):format(item) + end + return build_report(msg) +end + +-- 09, 0A, 0B, 0C, 0D, 20 +local ascii_space = lpeg.S("\t\n\v\f\r ") +local unicode_space +do + local chr = string_char + local u_space = ascii_space + -- \u0085 \u00A0 + u_space = u_space + lpeg.P(chr(0xC2)) * lpeg.S(chr(0x85) .. chr(0xA0)) + -- \u1680 \u180E + u_space = u_space + lpeg.P(chr(0xE1)) * (lpeg.P(chr(0x9A, 0x80)) + chr(0xA0, 0x8E)) + -- \u2000 - \u200A, also 200B + local spacing_end = "" + for i = 0x80,0x8b do + spacing_end = spacing_end .. chr(i) + end + -- \u2028 \u2029 \u202F + spacing_end = spacing_end .. chr(0xA8) .. chr(0xA9) .. chr(0xAF) + u_space = u_space + lpeg.P(chr(0xE2, 0x80)) * lpeg.S(spacing_end) + -- \u205F + u_space = u_space + lpeg.P(chr(0xE2, 0x81, 0x9F)) + -- \u3000 + u_space = u_space + lpeg.P(chr(0xE3, 0x80, 0x80)) + -- BOM \uFEFF + u_space = u_space + lpeg.P(chr(0xEF, 0xBB, 0xBF)) + unicode_space = u_space +end + +local identifier = lpeg.R("AZ","az","__") * lpeg.R("AZ","az", "__", "09") ^0 + +local hex = lpeg.R("09","AF","af") +local hexpair = hex * hex + +local comments = { + cpp = lpeg.P("//") * (1 - lpeg.P("\n"))^0 * lpeg.P("\n"), + c = lpeg.P("/*") * (1 - lpeg.P("*/"))^0 * lpeg.P("*/") +} + +local comment = comments.cpp + comments.c + +local ascii_ignored = (ascii_space + comment)^0 + +local unicode_ignored = (unicode_space + comment)^0 + +-- Parse the lpeg version skipping patch-values +-- LPEG <= 0.7 have no version value... so 0.7 is value +local DecimalLpegVersion = lpeg.version and tonumber(lpeg.version():match("^(%d+%.%d+)")) or 0.7 + +local function setObjectKeyForceNumber(t, key, value) + key = tonumber(key) or key + return rawset(t, key, value) +end + +local util = { + unexpected = unexpected, + denied = denied, + ascii_space = ascii_space, + unicode_space = unicode_space, + identifier = identifier, + hex = hex, + hexpair = hexpair, + comments = comments, + comment = comment, + ascii_ignored = ascii_ignored, + unicode_ignored = unicode_ignored, + DecimalLpegVersion = DecimalLpegVersion, + get_invalid_character_info = get_invalid_character_info, + setObjectKeyForceNumber = setObjectKeyForceNumber +} + +return util diff --git a/cosmic rage/lua/json/encode.lua b/cosmic rage/lua/json/encode.lua new file mode 100644 index 0000000..5a13adc --- /dev/null +++ b/cosmic rage/lua/json/encode.lua @@ -0,0 +1,161 @@ +--[[ + Licensed according to the included 'LICENSE' document + Author: Thomas Harning Jr +]] +local type = type +local assert, error = assert, error +local getmetatable, setmetatable = getmetatable, setmetatable + +local ipairs, pairs = ipairs, pairs +local require = require + +local output = require("json.encode.output") + +local util = require("json.util") +local util_merge, isCall = util.merge, util.isCall + +local _ENV = nil + +--[[ + List of encoding modules to load. + Loaded in sequence such that earlier encoders get priority when + duplicate type-handlers exist. +]] +local modulesToLoad = { + "strings", + "number", + "calls", + "others", + "array", + "object" +} +-- Modules that have been loaded +local loadedModules = {} + +local json_encode = {} + +-- Configuration bases for client apps +local modes_defined = { "default", "strict" } + +json_encode.default = {} +json_encode.strict = { + initialObject = true -- Require an object at the root +} + +-- For each module, load it and its defaults +for _,name in ipairs(modulesToLoad) do + local mod = require("json.encode." .. name) + if mod.mergeOptions then + for _, mode in pairs(modes_defined) do + mod.mergeOptions(json_encode[mode], mode) + end + end + loadedModules[name] = mod +end + +-- NOTE: Nested not found, so assume unsupported until use case arises +local function flattenOutput(out, value) + assert(type(value) ~= 'table') + out = out or {} + out[#out + 1] = value + return out +end + +-- Prepares the encoding map from the already provided modules and new config +local function prepareEncodeMap(options) + local map = {} + for _, name in ipairs(modulesToLoad) do + local encodermap = loadedModules[name].getEncoder(options[name]) + for valueType, encoderSet in pairs(encodermap) do + map[valueType] = flattenOutput(map[valueType], encoderSet) + end + end + return map +end + +--[[ + Encode a value with a given encoding map and state +]] +local function encodeWithMap(value, map, state, isObjectKey) + local t = type(value) + local encoderList = assert(map[t], "Failed to encode value, unhandled type: " .. t) + for _, encoder in ipairs(encoderList) do + local ret = encoder(value, state, isObjectKey) + if false ~= ret then + return ret + end + end + error("Failed to encode value, encoders for " .. t .. " deny encoding") +end + + +local function getBaseEncoder(options) + local encoderMap = prepareEncodeMap(options) + if options.preProcess then + local preProcess = options.preProcess + return function(value, state, isObjectKey) + local ret = preProcess(value, isObjectKey or false) + if nil ~= ret then + value = ret + end + return encodeWithMap(value, encoderMap, state) + end + end + return function(value, state, isObjectKey) + return encodeWithMap(value, encoderMap, state) + end +end +--[[ + Retreive an initial encoder instance based on provided options + the initial encoder is responsible for initializing state + State has at least these values configured: encode, check_unique, already_encoded +]] +function json_encode.getEncoder(options) + options = options and util_merge({}, json_encode.default, options) or json_encode.default + local encode = getBaseEncoder(options) + + local function initialEncode(value) + if options.initialObject then + local errorMessage = "Invalid arguments: expects a JSON Object or Array at the root" + assert(type(value) == 'table' and not isCall(value, options), errorMessage) + end + + local alreadyEncoded = {} + local function check_unique(value) + assert(not alreadyEncoded[value], "Recursive encoding of value") + alreadyEncoded[value] = true + end + + local outputEncoder = options.output and options.output() or output.getDefault() + local state = { + encode = encode, + check_unique = check_unique, + already_encoded = alreadyEncoded, -- To unmark encoding when moving up stack + outputEncoder = outputEncoder + } + local ret = encode(value, state) + if nil ~= ret then + return outputEncoder.simple and outputEncoder.simple(ret) or ret + end + end + return initialEncode +end + +-- CONSTRUCT STATE WITH FOLLOWING (at least) +--[[ + encoder + check_unique -- used by inner encoders to make sure value is unique + already_encoded -- used to unmark a value as unique +]] +function json_encode.encode(data, options) + return json_encode.getEncoder(options)(data) +end + +local mt = {} +mt.__call = function(self, ...) + return json_encode.encode(...) +end + +setmetatable(json_encode, mt) + +return json_encode diff --git a/cosmic rage/lua/json/encode/array.lua b/cosmic rage/lua/json/encode/array.lua new file mode 100644 index 0000000..3744409 --- /dev/null +++ b/cosmic rage/lua/json/encode/array.lua @@ -0,0 +1,110 @@ +--[[ + Licensed according to the included 'LICENSE' document + Author: Thomas Harning Jr +]] +local jsonutil = require("json.util") + +local type = type +local pairs = pairs +local assert = assert + +local table = require("table") +local math = require("math") +local table_concat = table.concat +local math_floor, math_modf = math.floor, math.modf + +local jsonutil = require("json.util") +local util_IsArray = jsonutil.IsArray + +local _ENV = nil + +local defaultOptions = { + isArray = util_IsArray +} + +local modeOptions = {} + +local function mergeOptions(options, mode) + jsonutil.doOptionMerge(options, false, 'array', defaultOptions, mode and modeOptions[mode]) +end + +--[[ + Utility function to determine whether a table is an array or not. + Criteria for it being an array: + * ExternalIsArray returns true (or false directly reports not-array) + * If the table has an 'n' value that is an integer >= 1 then it + is an array... may result in false positives (should check some values + before it) + * It is a contiguous list of values with zero string-based keys +]] +local function isArray(val, options) + local externalIsArray = options and options.isArray + + if externalIsArray then + local ret = externalIsArray(val) + if ret == true or ret == false then + return ret + end + end + -- Use the 'n' element if it's a number + if type(val.n) == 'number' and math_floor(val.n) == val.n and val.n >= 1 then + return true + end + local len = #val + for k,v in pairs(val) do + if type(k) ~= 'number' then + return false + end + local _, decim = math_modf(k) + if not (decim == 0 and 1<=k) then + return false + end + if k > len then -- Use Lua's length as absolute determiner + return false + end + end + + return true +end + +--[[ + Cleanup function to unmark a value as in the encoding process and return + trailing results +]] +local function unmarkAfterEncode(tab, state, ...) + state.already_encoded[tab] = nil + return ... +end +local function getEncoder(options) + options = options and jsonutil.merge({}, defaultOptions, options) or defaultOptions + local function encodeArray(tab, state) + if not isArray(tab, options) then + return false + end + -- Make sure this value hasn't been encoded yet + state.check_unique(tab) + local encode = state.encode + local compositeEncoder = state.outputEncoder.composite + local valueEncoder = [[ + for i = 1, (composite.n or #composite) do + local val = composite[i] + PUTINNER(i ~= 1) + val = encode(val, state) + val = val or '' + if val then + PUTVALUE(val) + end + end + ]] + return unmarkAfterEncode(tab, state, compositeEncoder(valueEncoder, '[', ']', ',', tab, encode, state)) + end + return { table = encodeArray } +end + +local array = { + mergeOptions = mergeOptions, + isArray = isArray, + getEncoder = getEncoder +} + +return array diff --git a/cosmic rage/lua/json/encode/calls.lua b/cosmic rage/lua/json/encode/calls.lua new file mode 100644 index 0000000..11dddfe --- /dev/null +++ b/cosmic rage/lua/json/encode/calls.lua @@ -0,0 +1,68 @@ +--[[ + Licensed according to the included 'LICENSE' document + Author: Thomas Harning Jr +]] +local table = require("table") +local table_concat = table.concat + +local select = select +local getmetatable, setmetatable = getmetatable, setmetatable +local assert = assert + +local jsonutil = require("json.util") + +local isCall, decodeCall = jsonutil.isCall, jsonutil.decodeCall + +local _ENV = nil + +local defaultOptions = { +} + +-- No real default-option handling needed... +local modeOptions = {} + +local function mergeOptions(options, mode) + jsonutil.doOptionMerge(options, false, 'calls', defaultOptions, mode and modeOptions[mode]) +end + + +--[[ + Encodes 'value' as a function call + Must have parameters in the 'callData' field of the metatable + name == name of the function call + parameters == array of parameters to encode +]] +local function getEncoder(options) + options = options and jsonutil.merge({}, defaultOptions, options) or defaultOptions + local function encodeCall(value, state) + if not isCall(value) then + return false + end + local encode = state.encode + local name, params = decodeCall(value) + local compositeEncoder = state.outputEncoder.composite + local valueEncoder = [[ + for i = 1, (composite.n or #composite) do + local val = composite[i] + PUTINNER(i ~= 1) + val = encode(val, state) + val = val or '' + if val then + PUTVALUE(val) + end + end + ]] + return compositeEncoder(valueEncoder, name .. '(', ')', ',', params, encode, state) + end + return { + table = encodeCall, + ['function'] = encodeCall + } +end + +local calls = { + mergeOptions = mergeOptions, + getEncoder = getEncoder +} + +return calls diff --git a/cosmic rage/lua/json/encode/number.lua b/cosmic rage/lua/json/encode/number.lua new file mode 100644 index 0000000..290b440 --- /dev/null +++ b/cosmic rage/lua/json/encode/number.lua @@ -0,0 +1,58 @@ +--[[ + Licensed according to the included 'LICENSE' document + Author: Thomas Harning Jr +]] +local tostring = tostring +local assert = assert +local jsonutil = require("json.util") +local huge = require("math").huge + +local _ENV = nil + +local defaultOptions = { + nan = true, + inf = true +} + +local modeOptions = {} +modeOptions.strict = { + nan = false, + inf = false +} + +local function mergeOptions(options, mode) + jsonutil.doOptionMerge(options, false, 'number', defaultOptions, mode and modeOptions[mode]) +end + + +local function encodeNumber(number, options) + if number ~= number then + assert(options.nan, "Invalid number: NaN not enabled") + return "NaN" + end + if number == huge then + assert(options.inf, "Invalid number: Infinity not enabled") + return "Infinity" + end + if number == -huge then + assert(options.inf, "Invalid number: Infinity not enabled") + return "-Infinity" + end + return tostring(number) +end + +local function getEncoder(options) + options = options and jsonutil.merge({}, defaultOptions, options) or defaultOptions + return { + number = function(number, state) + return encodeNumber(number, options) + end + } +end + +local number = { + mergeOptions = mergeOptions, + getEncoder = getEncoder +} + +return number diff --git a/cosmic rage/lua/json/encode/object.lua b/cosmic rage/lua/json/encode/object.lua new file mode 100644 index 0000000..4716d52 --- /dev/null +++ b/cosmic rage/lua/json/encode/object.lua @@ -0,0 +1,77 @@ +--[[ + Licensed according to the included 'LICENSE' document + Author: Thomas Harning Jr +]] +local pairs = pairs +local assert = assert + +local type = type +local tostring = tostring + +local table_concat = require("table").concat +local jsonutil = require("json.util") + +local _ENV = nil + +local defaultOptions = { +} + +local modeOptions = {} + +local function mergeOptions(options, mode) + jsonutil.doOptionMerge(options, false, 'object', defaultOptions, mode and modeOptions[mode]) +end + +--[[ + Cleanup function to unmark a value as in the encoding process and return + trailing results +]] +local function unmarkAfterEncode(tab, state, ...) + state.already_encoded[tab] = nil + return ... +end +--[[ + Encode a table as a JSON Object ( keys = strings, values = anything else ) +]] +local function encodeTable(tab, options, state) + -- Make sure this value hasn't been encoded yet + state.check_unique(tab) + local encode = state.encode + local compositeEncoder = state.outputEncoder.composite + local valueEncoder = [[ + local first = true + for k, v in pairs(composite) do + local ti = type(k) + assert(ti == 'string' or ti == 'number' or ti == 'boolean', "Invalid object index type: " .. ti) + local name = encode(tostring(k), state, true) + if first then + first = false + else + name = ',' .. name + end + PUTVALUE(name .. ':') + local val = encode(v, state) + val = val or '' + if val then + PUTVALUE(val) + end + end + ]] + return unmarkAfterEncode(tab, state, compositeEncoder(valueEncoder, '{', '}', nil, tab, encode, state)) +end + +local function getEncoder(options) + options = options and jsonutil.merge({}, defaultOptions, options) or defaultOptions + return { + table = function(tab, state) + return encodeTable(tab, options, state) + end + } +end + +local object = { + mergeOptions = mergeOptions, + getEncoder = getEncoder +} + +return object diff --git a/cosmic rage/lua/json/encode/others.lua b/cosmic rage/lua/json/encode/others.lua new file mode 100644 index 0000000..b527044 --- /dev/null +++ b/cosmic rage/lua/json/encode/others.lua @@ -0,0 +1,66 @@ +--[[ + Licensed according to the included 'LICENSE' document + Author: Thomas Harning Jr +]] +local tostring = tostring + +local assert = assert +local jsonutil = require("json.util") +local type = type + +local _ENV = nil + +-- Shortcut that works +local encodeBoolean = tostring + +local defaultOptions = { + allowUndefined = true, + null = jsonutil.null, + undefined = jsonutil.undefined +} + +local modeOptions = {} + +modeOptions.strict = { + allowUndefined = false +} + +local function mergeOptions(options, mode) + jsonutil.doOptionMerge(options, false, 'others', defaultOptions, mode and modeOptions[mode]) +end +local function getEncoder(options) + options = options and jsonutil.merge({}, defaultOptions, options) or defaultOptions + local function encodeOthers(value, state) + if value == options.null then + return 'null' + elseif value == options.undefined then + assert(options.allowUndefined, "Invalid value: Unsupported 'Undefined' parameter") + return 'undefined' + else + return false + end + end + local function encodeBoolean(value, state) + return value and 'true' or 'false' + end + local nullType = type(options.null) + local undefinedType = options.undefined and type(options.undefined) + -- Make sure that all of the types handled here are handled + local ret = { + boolean = encodeBoolean, + ['nil'] = function() return 'null' end, + [nullType] = encodeOthers + } + if undefinedType then + ret[undefinedType] = encodeOthers + end + return ret +end + +local others = { + encodeBoolean = encodeBoolean, + mergeOptions = mergeOptions, + getEncoder = getEncoder +} + +return others diff --git a/cosmic rage/lua/json/encode/output.lua b/cosmic rage/lua/json/encode/output.lua new file mode 100644 index 0000000..8293b62 --- /dev/null +++ b/cosmic rage/lua/json/encode/output.lua @@ -0,0 +1,91 @@ +--[[ + Licensed according to the included 'LICENSE' document + Author: Thomas Harning Jr +]] +local type = type +local assert, error = assert, error +local table_concat = require("table").concat +local loadstring = loadstring or load + +local io = require("io") + +local setmetatable = setmetatable + +local output_utility = require("json.encode.output_utility") + +local _ENV = nil + +local tableCompositeCache = setmetatable({}, {__mode = 'v'}) + +local TABLE_VALUE_WRITER = [[ + ret[#ret + 1] = %VALUE% +]] + +local TABLE_INNER_WRITER = "" + +--[[ + nextValues can output a max of two values to throw into the data stream + expected to be called until nil is first return value + value separator should either be attached to v1 or in innerValue +]] +local function defaultTableCompositeWriter(nextValues, beginValue, closeValue, innerValue, composite, encode, state) + if type(nextValues) == 'string' then + local fun = output_utility.prepareEncoder(defaultTableCompositeWriter, nextValues, innerValue, TABLE_VALUE_WRITER, TABLE_INNER_WRITER) + local ret = {} + fun(composite, ret, encode, state) + return beginValue .. table_concat(ret, innerValue) .. closeValue + end +end + +-- no 'simple' as default action is just to return the value +local function getDefault() + return { composite = defaultTableCompositeWriter } +end + +-- BEGIN IO-WRITER OUTPUT +local IO_INNER_WRITER = [[ + if %WRITE_INNER% then + state.__outputFile:write(%INNER_VALUE%) + end +]] +local IO_VALUE_WRITER = [[ + state.__outputFile:write(%VALUE%) +]] + +local function buildIoWriter(output) + if not output then -- Default to stdout + output = io.output() + end + local function ioWriter(nextValues, beginValue, closeValue, innerValue, composite, encode, state) + -- HOOK OUTPUT STATE + state.__outputFile = output + if type(nextValues) == 'string' then + local fun = output_utility.prepareEncoder(ioWriter, nextValues, innerValue, IO_VALUE_WRITER, IO_INNER_WRITER) + local ret = {} + output:write(beginValue) + fun(composite, ret, encode, state) + output:write(closeValue) + return nil + end + end + + local function ioSimpleWriter(encoded) + if encoded then + output:write(encoded) + end + return nil + end + return { composite = ioWriter, simple = ioSimpleWriter } +end +local function getIoWriter(output) + return function() + return buildIoWriter(output) + end +end + +local output = { + getDefault = getDefault, + getIoWriter = getIoWriter +} + +return output diff --git a/cosmic rage/lua/json/encode/output_utility.lua b/cosmic rage/lua/json/encode/output_utility.lua new file mode 100644 index 0000000..b6607d1 --- /dev/null +++ b/cosmic rage/lua/json/encode/output_utility.lua @@ -0,0 +1,54 @@ +--[[ + Licensed according to the included 'LICENSE' document + Author: Thomas Harning Jr +]] +local setmetatable = setmetatable +local assert, loadstring = assert, loadstring or load + +local _ENV = nil + +-- Key == weak, if main key goes away, then cache cleared +local outputCache = setmetatable({}, {__mode = 'k'}) +-- TODO: inner tables weak? + +local function buildFunction(nextValues, innerValue, valueWriter, innerWriter) + local putInner = "" + if innerValue and innerWriter then + -- Prepare the lua-string representation of the separator to put in between values + local formattedInnerValue = ("%q"):format(innerValue) + -- Fill in the condition %WRITE_INNER% and the %INNER_VALUE% to actually write + putInner = innerWriter:gsub("%%WRITE_INNER%%", "%%1"):gsub("%%INNER_VALUE%%", formattedInnerValue) + end + -- Template-in the value writer (if present) and its conditional argument + local functionCode = nextValues:gsub("PUTINNER(%b())", putInner) + -- %VALUE% is to be filled in by the value-to-write + valueWriter = valueWriter:gsub("%%VALUE%%", "%%1") + -- Template-in the value writer with its argument + functionCode = functionCode:gsub("PUTVALUE(%b())", valueWriter) + functionCode = [[ + return function(composite, ret, encode, state) + ]] .. functionCode .. [[ + end + ]] + return assert(loadstring(functionCode))() +end + +local function prepareEncoder(cacheKey, nextValues, innerValue, valueWriter, innerWriter) + local cache = outputCache[cacheKey] + if not cache then + cache = {} + outputCache[cacheKey] = cache + end + local fun = cache[nextValues] + if not fun then + fun = buildFunction(nextValues, innerValue, valueWriter, innerWriter) + cache[nextValues] = fun + end + return fun +end + +local output_utility = { + prepareEncoder = prepareEncoder +} + +return output_utility diff --git a/cosmic rage/lua/json/encode/strings.lua b/cosmic rage/lua/json/encode/strings.lua new file mode 100644 index 0000000..09d85a9 --- /dev/null +++ b/cosmic rage/lua/json/encode/strings.lua @@ -0,0 +1,88 @@ +--[[ + Licensed according to the included 'LICENSE' document + Author: Thomas Harning Jr +]] +local string_char = require("string").char +local pairs = pairs + +local jsonutil = require("json.util") +local util_merge = jsonutil.merge + +local _ENV = nil + +local normalEncodingMap = { + ['"'] = '\\"', + ['\\'] = '\\\\', + ['/'] = '\\/', + ['\b'] = '\\b', + ['\f'] = '\\f', + ['\n'] = '\\n', + ['\r'] = '\\r', + ['\t'] = '\\t', + ['\v'] = '\\v' -- not in official spec, on report, removing +} + +local xEncodingMap = {} +for char, encoded in pairs(normalEncodingMap) do + xEncodingMap[char] = encoded +end + +-- Pre-encode the control characters to speed up encoding... +-- NOTE: UTF-8 may not work out right w/ JavaScript +-- JavaScript uses 2 bytes after a \u... yet UTF-8 is a +-- byte-stream encoding, not pairs of bytes (it does encode +-- some letters > 1 byte, but base case is 1) +for i = 0, 255 do + local c = string_char(i) + if c:match('[%z\1-\031\128-\255]') and not normalEncodingMap[c] then + -- WARN: UTF8 specializes values >= 0x80 as parts of sequences... + -- without \x encoding, do not allow encoding > 7F + normalEncodingMap[c] = ('\\u%.4X'):format(i) + xEncodingMap[c] = ('\\x%.2X'):format(i) + end +end + +local defaultOptions = { + xEncode = false, -- Encode single-bytes as \xXX + processor = nil, -- Simple processor for the string prior to quoting + -- / is not required to be quoted but it helps with certain decoding + -- Required encoded characters, " \, and 00-1F (0 - 31) + encodeSet = '\\"/%z\1-\031', + encodeSetAppend = nil -- Chars to append to the default set +} + +local modeOptions = {} + +local function mergeOptions(options, mode) + jsonutil.doOptionMerge(options, false, 'strings', defaultOptions, mode and modeOptions[mode]) +end + +local function getEncoder(options) + options = options and util_merge({}, defaultOptions, options) or defaultOptions + local encodeSet = options.encodeSet + if options.encodeSetAppend then + encodeSet = encodeSet .. options.encodeSetAppend + end + local encodingMap = options.xEncode and xEncodingMap or normalEncodingMap + local encodeString + if options.processor then + local processor = options.processor + encodeString = function(s, state) + return '"' .. processor(s:gsub('[' .. encodeSet .. ']', encodingMap)) .. '"' + end + else + encodeString = function(s, state) + return '"' .. s:gsub('[' .. encodeSet .. ']', encodingMap) .. '"' + end + end + return { + string = encodeString + } +end + +local strings = { + mergeOptions = mergeOptions, + getEncoder = getEncoder +} + +return strings diff --git a/cosmic rage/lua/json/util.lua b/cosmic rage/lua/json/util.lua new file mode 100644 index 0000000..a4599db --- /dev/null +++ b/cosmic rage/lua/json/util.lua @@ -0,0 +1,152 @@ +--[[ + Licensed according to the included 'LICENSE' document + Author: Thomas Harning Jr +]] +local type = type +local print = print +local tostring = tostring +local pairs = pairs +local getmetatable, setmetatable = getmetatable, setmetatable +local select = select + +local _ENV = nil + +local function foreach(tab, func) + for k, v in pairs(tab) do + func(k,v) + end +end +local function printValue(tab, name) + local parsed = {} + local function doPrint(key, value, space) + space = space or '' + if type(value) == 'table' then + if parsed[value] then + print(space .. key .. '= <' .. parsed[value] .. '>') + else + parsed[value] = key + print(space .. key .. '= {') + space = space .. ' ' + foreach(value, function(key, value) doPrint(key, value, space) end) + end + else + if type(value) == 'string' then + value = '[[' .. tostring(value) .. ']]' + end + print(space .. key .. '=' .. tostring(value)) + end + end + doPrint(name, tab) +end + +local function clone(t) + local ret = {} + for k,v in pairs(t) do + ret[k] = v + end + return ret +end + +local function inner_merge(t, remaining, from, ...) + if remaining == 0 then + return t + end + if from then + for k,v in pairs(from) do + t[k] = v + end + end + return inner_merge(t, remaining - 1, ...) +end + +--[[* + Shallow-merges tables in order onto the first table. + + @param t table to merge entries onto + @param ... sequence of 0 or more tables to merge onto 't' + + @returns table 't' from input +]] +local function merge(t, ...) + return inner_merge(t, select('#', ...), ...) +end + +-- Function to insert nulls into the JSON stream +local function null() + return null +end + +-- Marker for 'undefined' values +local function undefined() + return undefined +end + +local ArrayMT = {} + +--[[ + Return's true if the metatable marks it as an array.. + Or false if it has no array component at all + Otherwise nil to get the normal detection component working +]] +local function IsArray(value) + if type(value) ~= 'table' then return false end + local meta = getmetatable(value) + local ret = meta == ArrayMT or (meta ~= nil and meta.__is_luajson_array) + if not ret then + if #value == 0 then return false end + else + return ret + end +end +local function InitArray(array) + setmetatable(array, ArrayMT) + return array +end + +local CallMT = {} + +local function isCall(value) + return CallMT == getmetatable(value) +end + +local function buildCall(name, ...) + local callData = { + name = name, + parameters = {n = select('#', ...), ...} + } + return setmetatable(callData, CallMT) +end + +local function decodeCall(callData) + if not isCall(callData) then return nil end + return callData.name, callData.parameters +end + +local function doOptionMerge(options, nested, name, defaultOptions, modeOptions) + if nested then + modeOptions = modeOptions and modeOptions[name] + defaultOptions = defaultOptions and defaultOptions[name] + end + options[name] = merge( + {}, + defaultOptions, + modeOptions, + options[name] + ) +end + +local json_util = { + printValue = printValue, + clone = clone, + merge = merge, + null = null, + undefined = undefined, + IsArray = IsArray, + InitArray = InitArray, + isCall = isCall, + buildCall = buildCall, + decodeCall = decodeCall, + doOptionMerge = doOptionMerge +} + +return json_util diff --git a/cosmic rage/lua/ltn12.lua b/cosmic rage/lua/ltn12.lua new file mode 100644 index 0000000..b42689a --- /dev/null +++ b/cosmic rage/lua/ltn12.lua @@ -0,0 +1,292 @@ +----------------------------------------------------------------------------- +-- LTN12 - Filters, sources, sinks and pumps. +-- LuaSocket toolkit. +-- Author: Diego Nehab +-- RCS ID: $Id: ltn12.lua,v 1.31 2006/04/03 04:45:42 diego Exp $ +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Declare module +----------------------------------------------------------------------------- +local string = require("string") +local table = require("table") +local base = _G +module("ltn12") + +filter = {} +source = {} +sink = {} +pump = {} + +-- 2048 seems to be better in windows... +BLOCKSIZE = 2048 +_VERSION = "LTN12 1.0.1" + +----------------------------------------------------------------------------- +-- Filter stuff +----------------------------------------------------------------------------- +-- returns a high level filter that cycles a low-level filter +function filter.cycle(low, ctx, extra) + base.assert(low) + return function(chunk) + local ret + ret, ctx = low(ctx, chunk, extra) + return ret + end +end + +-- chains a bunch of filters together +-- (thanks to Wim Couwenberg) +function filter.chain(...) + local n = table.getn(arg) + local top, index = 1, 1 + local retry = "" + return function(chunk) + retry = chunk and retry + while true do + if index == top then + chunk = arg[index](chunk) + if chunk == "" or top == n then return chunk + elseif chunk then index = index + 1 + else + top = top+1 + index = top + end + else + chunk = arg[index](chunk or "") + if chunk == "" then + index = index - 1 + chunk = retry + elseif chunk then + if index == n then return chunk + else index = index + 1 end + else base.error("filter returned inappropriate nil") end + end + end + end +end + +----------------------------------------------------------------------------- +-- Source stuff +----------------------------------------------------------------------------- +-- create an empty source +local function empty() + return nil +end + +function source.empty() + return empty +end + +-- returns a source that just outputs an error +function source.error(err) + return function() + return nil, err + end +end + +-- creates a file source +function source.file(handle, io_err) + if handle then + return function() + local chunk = handle:read(BLOCKSIZE) + if not chunk then handle:close() end + return chunk + end + else return source.error(io_err or "unable to open file") end +end + +-- turns a fancy source into a simple source +function source.simplify(src) + base.assert(src) + return function() + local chunk, err_or_new = src() + src = err_or_new or src + if not chunk then return nil, err_or_new + else return chunk end + end +end + +-- creates string source +function source.string(s) + if s then + local i = 1 + return function() + local chunk = string.sub(s, i, i+BLOCKSIZE-1) + i = i + BLOCKSIZE + if chunk ~= "" then return chunk + else return nil end + end + else return source.empty() end +end + +-- creates rewindable source +function source.rewind(src) + base.assert(src) + local t = {} + return function(chunk) + if not chunk then + chunk = table.remove(t) + if not chunk then return src() + else return chunk end + else + table.insert(t, chunk) + end + end +end + +function source.chain(src, f) + base.assert(src and f) + local last_in, last_out = "", "" + local state = "feeding" + local err + return function() + if not last_out then + base.error('source is empty!', 2) + end + while true do + if state == "feeding" then + last_in, err = src() + if err then return nil, err end + last_out = f(last_in) + if not last_out then + if last_in then + base.error('filter returned inappropriate nil') + else + return nil + end + elseif last_out ~= "" then + state = "eating" + if last_in then last_in = "" end + return last_out + end + else + last_out = f(last_in) + if last_out == "" then + if last_in == "" then + state = "feeding" + else + base.error('filter returned ""') + end + elseif not last_out then + if last_in then + base.error('filter returned inappropriate nil') + else + return nil + end + else + return last_out + end + end + end + end +end + +-- creates a source that produces contents of several sources, one after the +-- other, as if they were concatenated +-- (thanks to Wim Couwenberg) +function source.cat(...) + local src = table.remove(arg, 1) + return function() + while src do + local chunk, err = src() + if chunk then return chunk end + if err then return nil, err end + src = table.remove(arg, 1) + end + end +end + +----------------------------------------------------------------------------- +-- Sink stuff +----------------------------------------------------------------------------- +-- creates a sink that stores into a table +function sink.table(t) + t = t or {} + local f = function(chunk, err) + if chunk then table.insert(t, chunk) end + return 1 + end + return f, t +end + +-- turns a fancy sink into a simple sink +function sink.simplify(snk) + base.assert(snk) + return function(chunk, err) + local ret, err_or_new = snk(chunk, err) + if not ret then return nil, err_or_new end + snk = err_or_new or snk + return 1 + end +end + +-- creates a file sink +function sink.file(handle, io_err) + if handle then + return function(chunk, err) + if not chunk then + handle:close() + return 1 + else return handle:write(chunk) end + end + else return sink.error(io_err or "unable to open file") end +end + +-- creates a sink that discards data +local function null() + return 1 +end + +function sink.null() + return null +end + +-- creates a sink that just returns an error +function sink.error(err) + return function() + return nil, err + end +end + +-- chains a sink with a filter +function sink.chain(f, snk) + base.assert(f and snk) + return function(chunk, err) + if chunk ~= "" then + local filtered = f(chunk) + local done = chunk and "" + while true do + local ret, snkerr = snk(filtered, err) + if not ret then return nil, snkerr end + if filtered == done then return 1 end + filtered = f(done) + end + else return 1 end + end +end + +----------------------------------------------------------------------------- +-- Pump stuff +----------------------------------------------------------------------------- +-- pumps one chunk from the source to the sink +function pump.step(src, snk) + local chunk, src_err = src() + local ret, snk_err = snk(chunk, src_err) + if chunk and ret then return 1 + else return nil, src_err or snk_err end +end + +-- pumps all data from a source to a sink, using a step function +function pump.all(src, snk, step) + base.assert(src and snk) + step = step or pump.step + while true do + local ret, err = step(src, snk) + if not ret then + if err then return nil, err + else return 1 end + end + end +end + diff --git a/cosmic rage/lua/luacom5.lua b/cosmic rage/lua/luacom5.lua new file mode 100644 index 0000000..0c662c8 --- /dev/null +++ b/cosmic rage/lua/luacom5.lua @@ -0,0 +1,1001 @@ +-- +-- Enhanced functionality for the LuaCOM library +-- + + +-- startup code: presumes LuaCOM has already been initialized +-- and lies in the luacom table + +assert(luacom) +luacomE = luacom + +-- tests for other dependencies +assert(table) +assert(string) +assert(io) + + +-- +-- ExportConstants +-- +-- Exports all the constants defined in the type library +-- to the global environment +-- + +function luacomE.ExportConstants(obj, const_table) + + if luacomE.GetType(obj) == "LuaCOM" then + obj = luacom.GetTypeInfo(obj) + end + + if luacomE.GetType(obj) == "ITypeInfo" then + obj = obj:GetTypeLib() + end + + assert(luacomE.GetType(obj) == "ITypeLib") + + if const_table == nil then + const_table = _G + end + + obj:ExportConstants(const_table) +end + + + +-- +-- Proxies for luacom.CreateObject +-- + +function luacomE.CreateLocalObject(ID) + return luacom.CreateObject(ID, "local_server") +end + +function luacomE.CreateInprocObject(ID) + return luacom.CreateObject(ID, "inproc_server") +end + +-- +-- luacomE.pairs +-- +-- Returns an iterator for a COM enumerator +-- + +function luacomE.pairs(luacom_obj) + + assert(luacom_obj) + + local enumerator = luacom.GetEnumerator(luacom_obj) + + if enumerator == nil then + error("Could not get an enumerator") + return + end + + local function iterator(state, index) + local value = state:Next() + + if value == nil then + return nil + else + return index+1, value + end + + end + + return iterator, enumerator, 0 +end + + +-- +-- GetType +-- +-- Returns the type of the object (if it is managed by LuaCOM) +-- + +function luacomE.GetType(obj) + local typetable = getmetatable(obj) + + if typetable ~= nil then + return typetable.type + else + return nil + end + +end + + +------------------------------- +-- Type library related code -- +------------------------------- + +-- Copies fields of a table to another + +function luacomE._copyFields(dest, src, fields) + local function copyField(i,field) + local src_field, dest_field + if type(field) == "table" then + src_field = field[2] + dest_field = field[1] + else + src_field = field + dest_field = field + end + + if src[src_field] ~= "" then + dest[dest_field] = src[src_field] + end + end + + table.foreach(fields, copyField) +end + +-- FillTypeInfo +-- +-- Creates a table filled with the +-- type information contained in a typeinfo + +function luacomE.FillTypeInfo(rawTypeInfo) + + if rawTypeInfo.FilledTypeInfo then + return rawTypeInfo.FilledTypeInfo + end + + local doc, attr + local typeinfo = {} + + rawTypeInfo.FilledTypeInfo = typeinfo + + -- Basic information + doc = rawTypeInfo:GetDocumentation() + typeinfo.name = doc.name + typeinfo.description = doc.helpstring + + -- Now the attributes + attr = rawTypeInfo:GetTypeAttr() + + typeinfo.type = attr.typekind + typeinfo.guid = attr.GUID + + -- copies flags + table.foreach(attr.flags, function(i,v) typeinfo[i] = v end) + + -- function to fill the different types of elements + local function fillMethods(methods, num_methods) + local i, index, method, rawmethod + + index = 1 + for i = 0, num_methods - 1 do + method = {} + rawmethod = rawTypeInfo:GetFuncDesc(i) + + if rawmethod ~= nil then + method.rawMethod = rawmethod + + fields = {"name", "description", + "helpfile", "helpcontext", + {"dispid", "memid"}, {"typeinv", "invkind"}, + {"num_params", "Params"}, "parameters", "type" + } + + luacomE._copyFields(method, rawmethod, fields) + + local prototype + if method.type then + prototype = method.type.." "..method.name + prototype = prototype.."(" + end + + -- builds prototype + if method.parameters then + -- builds parameter list + local first_param = true + + local function add_param(i, param) + + if first_param then + first_param = false + else + prototype = prototype..", " + first_param = false + end + + if param.type then + prototype = prototype..param.type.." " + end + + prototype = prototype..param.name + end + + table.foreachi(method.parameters, add_param) + + end + + if prototype then + prototype = prototype..")" + method.prototype = prototype + end + + methods[index] = method + index = index+1 + end + + end + end + + local function fillEnum(values, num_values) + local i, rawConstant + + local fields = {"name", "value"} + + for i = 0, num_values - 1 do + rawConstant = rawTypeInfo:GetVarDesc(i) + constant = {} + constant.rawConstant = rawConstant + luacomE._copyFields(constant, rawConstant, fields) + + values[i+1] = constant + end + end + + + local function fillCoClass(interfaces, num_interfaces) + local i, interface, rawinterface, typeflags + + for i = 0, num_interfaces - 1 do + rawinterface = rawTypeInfo:GetImplType(i) + interface = {} + interface.dispinterface = luacomE.FillTypeInfo(rawinterface) + + -- copies impltypeflags + typeflags = rawTypeInfo:GetImplTypeFlags(i) + table.foreach(typeflags, function(i,v) interface[i] = v end) + + interfaces[i+1] = interface + end + end + + + -- Creates tables to hold components of the typeinfo + + if attr.typekind == "dispinterface" then + typeinfo.methods = {} + fillMethods(typeinfo.methods, attr.Funcs) + elseif attr.typekind == "coclass" then + typeinfo.interfaces = {} + fillCoClass(typeinfo.interfaces, attr.ImplTypes) + elseif attr.typekind == "enumeration" then + typeinfo.values = {} + fillEnum(typeinfo.values, attr.Vars) + end + + return typeinfo + +end + +-- +-- FillTypeLib +-- +-- Loads a type library and +-- creates a table that rearranges +-- the information contained in the +-- table library to ease its navigation +-- + +function luacomE.FillTypeLib(rawtlb) + + if rawtlb._luacom_isfilled then + return rawtlb + end + + -- Stores type library information + local tlb = {} + tlb._luacom_isfilled = true + + tlb.rawtlb = rawtlb + + local doc = rawtlb:GetDocumentation() + + tlb.name = doc.name + tlb.description = doc.helpstring + + -- stores typeinfos + + local typeinfo, rawtypeinfo, attr + + for i = 0, rawtlb:GetTypeInfoCount() - 1 do + + rawTypeInfo = rawtlb:GetTypeInfo(i) + typeinfo = luacomE.FillTypeInfo(rawTypeInfo) + tlb[i+1] = typeinfo + + end + + return tlb +end + + +-- +-- DumpTypeLib +-- Creates a html page describing a type library, +-- + +function luacomE.DumpTypeLib(obj, htmlfile) + + local tlb, rawtlb + + if type(obj) == "string" then + rawtlb = luacom.LoadTypeLibrary(obj) + elseif luacomE.GetType(obj) == "ITypeLib" then + rawtlb = obj + elseif luacomE.GetType(obj) == "LuaCOM" then + obj = luacom.GetTypeInfo(obj) + rawtlb = obj:GetTypeLib() + elseif luacomE.GetType(obj) == "ITypeInfo" then + rawtlb = obj:GetTypeLib() + end + + if rawtlb == nil then + error("Type library not found.") + end + + tlb = luacomE.FillTypeLib(rawtlb) + rawtlb = nil + + + if htmlfile == nil then + htmlfile = tlb.name..".html" + elseif string.sub(htmlfile, -1) == "\\" then + htmlfile = htmlfile..tlb.name..".html" + end + + local filehandle = io.open(htmlfile, "w") + + if filehandle == nil then + error("Could not create "..htmlfile..": file exists") + end + + io.output(filehandle) + + -- writes html header + io.write("\n") + io.write("") + + -- writes title + io.write("") + + if tlb.description then + io.write(tlb.description) + else + io.write(tlb.name) + end + + io.write("\n") + + io.write("

") + + if tlb.description then + io.write(tlb.description) + else + io.write(tlb.name) + end + + io.write(" Type Library") + + io.write("

\n") + io.write("
\n") + + -- + -- First, makes an index for the entire type library + -- + + io.write("

Summary

\n") + + -- Output function + local function write_typeinfo(i, typeinfo) + io.write("
  • ") + io.write("") + + if typeinfo.type ~= "dispinterface" or typeinfo.dispatchable then + io.write(""..typeinfo.name.."") + else + io.write(typeinfo.name) + end + + io.write("") + io.write("
  • ") + + if typeinfo.description and typeinfo.description ~= "" then + io.write(" - "..typeinfo.description) + end + + io.write("\n") + end + + -- filter function + local function filter_typeinfo(type) + local function filter(i,typeinfo) + + if typeinfo.type == type then + map_function(i, typeinfo) + end + end + + table.foreachi(tlb, filter) + end + + map_function = write_typeinfo + + io.write("

    Components

    \n") + filter_typeinfo("coclass") + + io.write("

    Enumerations

    \n") + filter_typeinfo("enumeration") + + io.write("

    Interfaces

    \n") + filter_typeinfo("dispinterface") + + -- + -- Now, describe each element + -- + + io.write("
    \n") + io.write("

    Detailed description

    \n") + + -- describes coclasses + + io.write("

    Components Classes

    \n") + + local function describe_coclass(i, typeinfo) + assert(typeinfo.type == "coclass") + + if typeinfo.restricted or typeinfo.hidden then + return + end + + io.write("

    ") + io.write("") + io.write(typeinfo.name) + + io.write("

    \n") + + if typeinfo.description then + io.write(typeinfo.description.."

    ") + end + + io.write("

    "..typeinfo.guid.."

    ") + + local i, default, source + + -- locates the default interface and the source interface + for i=1, table.getn(typeinfo.interfaces) do + + if typeinfo.interfaces[i].source and source == nil then + source = typeinfo.interfaces[i].dispinterface + elseif typeinfo.interfaces[i].source + and typeinfo.interfaces[i].default then + source = typeinfo.interfaces[i].dispinterface + end + + if not typeinfo.interfaces[i].source and default == nil then + default = typeinfo.interfaces[i].dispinterface + elseif typeinfo.interfaces[i].default + and not typeinfo.interfaces[i].source then + default = typeinfo.interfaces[i].dispinterface + end + + end + + if default then + if default.dispatchable then + io.write(""..default.name.."") + else + io.write(default.name) + end + + io.write(" is the default interface for this component.
    ") + end + + if source then + if source.dispatchable then + io.write(""..source.name.."") + else + io.write(source.name) + end + + io.write(" is the default set of events for this component.
    ") + end + + if typeinfo.appobject then + io.write("This is the Application object.
    ") + end + + if typeinfo.control then + io.write("This component is an OLE control.
    ") + end + + if typeinfo.cancreate then + io.write("Instances of this component can be created.
    ") + end + + end + + map_function = describe_coclass + + filter_typeinfo("coclass") + + + + -- describes enumerations + + io.write("


    Enumerations

    \n") + + local function describe_enum(i, typeinfo) + assert(typeinfo.type == "enumeration") + + io.write("

    ") + io.write("") + io.write(typeinfo.name) + + io.write("

    \n") + + if typeinfo.description and typeinfo.description ~= nil then + io.write(typeinfo.description.."

    ") + end + + local function describe_constant(i, constant) + io.write("

  • ") + io.write(constant.name.." = "..tostring(constant.value)) + io.write("
  • \n") + end + + io.write("
      \n") + table.foreachi(typeinfo.values, describe_constant) + io.write("
    \n") + end + + map_function = describe_enum + + filter_typeinfo("enumeration") + + + -- describes interfaces + + io.write("

    Interfaces

    \n") + + local function describe_interface(i, typeinfo) + assert(typeinfo.type == "dispinterface") + + io.write("

    ") + io.write("") + io.write(typeinfo.name) + io.write("

    \n") + io.write("
    "..typeinfo.guid.."

    ") + + local function describe_method_use(method) + io.write("LuaCOM examples:

    ") + + local function param_lister() + local first_param = true + local function add_param(i, param) + if param["in"] or (not param.out) then + local name + if param.default then + local default = tostring(param.default) + if default == "" then default = "?" end + name = param.name .. "=" .. default + else + name = param.name + end + if param.opt then name = "[" .. name .. "]" end + if first_param then + io.write(name) + first_param = false + else + io.write(", " .. name) + end + end + end + return add_param + end + + local function retval_lister(first_retval) + local has_retval = false + return function(i, param) + if param.out then + if first_retval then + io.write(param.name) + first_retval = false + else + io.write(", " .. param.name) + end + has_retval = true + end + end, function() return has_retval end + end + + if method.typeinv == "propget" then + if method.num_params == 0 then + io.write("com_obj." .. method.name .. "
    ") + io.write("com_obj:get" .. method.name .. "()") + else + io.write("com_obj:get" .. method.name .. "(") + table.foreachi(method.parameters, param_lister()) + io.write(")") + end + elseif method.typeinv == "propput" then + if method.num_params == 1 then + io.write("com_obj." .. method.name .. " = " .. method.parameters[1].name .. "
    ") + io.write("com_obj:set" .. method.name .. "(" .. method.parameters[1].name .. ")
    ") + else + io.write("com_obj:set" .. method.name .. "(") + table.foreachi(method.parameters, param_lister()) + io.write(")") + end + else + if method.type ~= "void" then + io.write("retval") + table.foreachi(method.parameters, retval_lister(false)) + io.write(" = ") + else + local lister, checker = retval_lister(true) + table.foreachi(method.parameters, lister) + if checker() then io.write(" = ") end + end + io.write("com_obj:" .. method.name .. "(") + table.foreachi(method.parameters, param_lister()) + io.write(")
    ") + end + end + + local function describe_method(i, method) + if method.rawMethod == nil then + return + end + + io.write("

  • ") + io.write(method.name) + + if method.prototype then + io.write("
    "..method.prototype.."
    \n") + else + io.write("
    ") + end + + if method.description then + io.write(method.description.."
    \n") + end + + describe_method_use(method) + + io.write("

    ") + + io.write("

  • \n") + end + + io.write("
      \n") + table.foreachi(typeinfo.methods, describe_method) + io.write("
    \n") + end + + map_function = describe_interface + + filter_typeinfo("dispinterface") + + io.write("") + + io.output():close() + + return htmlfile + +end + + + +-- +-- shows TypeLib dump to the user +-- + +function luacomE.ViewTypeLib(obj) + + local filename = os.getenv("TEMP") + + if filename == nil then + filename = os.getenv("TMP") + end + + if filename == nil then + filename = luacom.GetCurrentDirectory() + end + + if string.sub(filename, -1) ~= "\\" then + filename = filename.."\\" + end + + filename = luacomE.DumpTypeLib(obj, filename) + + local browser = luacom.CreateObject("InternetExplorer.Application") + + browser.Visible = true + browser:Navigate2(filename) + + return filename +end + +local interface_proto = { + constants = {}, + typedefs = {}, + properties = {}, + methods = {} +} + +--[[function interface_proto:AddConstant(type, name, value) + table.insert(self.constants, { type = type, name = name, value = value }) +end]]-- + +--[[function interface_proto:AddTypedef(type, typedef) + table.insert(self.typedefs, { type = type, typedef = typedef }) +end]]-- + +function interface_proto:AddMethod(methodinfo) + table.insert(self.methods, methodinfo) +end + +function interface_proto:AddProperty(propertyinfo) + table.insert(self.properties, propertyinfo) +end + +function interface_proto:Write(file) + local start_id = 0 + + local function attribute_writer(line_break) + local first_attribute = true + return function(name, value) + if not first_attribute then + if line_break then + file:write(",\n ") + else + file:write(", ") + end + else + if line_break then file:write(" ") end + end + first_attribute = false + if(type(name) == "number") then + file:write(value) + else + file:write(name .. "(" .. value .. ")") + end + end + end + + local function constant_writer(i, constant) + file:write("\n" .. " const " .. constant.type .. " " .. constant.name .. " = " .. + constant.value .. ";\n") + end + + local function typedef_writer(i, typedef) + file:write("\n" .. " typedef " .. typedef.type .. " " .. typedef.typedef .. ";\n") + end + + local function param_writer() + local first_param = true + return function(i, param) + if not first_param then file:write(",\n ") end + first_param = false + if param.attributes then + file:write("[") + table.foreach(param.attributes, attribute_writer(false)) + file:write("] ") + end + file:write(param.type .. " " .. param.name) + end + end + + local function property_writer(i, property) + if not property.attributes then + property.attributes = { id = tostring(start_id + i) } + end + file:write("\n [\n") + if property.attributes.id == nil then + property.attributes.id = tostring(start_id + i) + end + table.foreach(property.attributes, attribute_writer(true)) + file:write("\n ]\n ") + file:write(property.type .. " " .. property.name .. ";\n") + end + + local function method_writer(i, method) + if not method.attributes then + method.attributes = { id = tostring(start_id + i) } + end + file:write("\n [\n") + if method.attributes.id == nil then + method.attributes.id = tostring(start_id + i) + end + table.foreach(method.attributes, attribute_writer(true)) + file:write("\n ]\n ") + if method.type then + file:write(method.type) + else + file:write("void") + end + file:write(" " .. method.name .. "(") + if method.parameters then + file:write("\n ") + table.foreachi(method.parameters, param_writer()) + file:write("\n );\n") + else + file:write("void" .. ");\n") + end + end + + if self.attributes then + file:write("[\n ") + table.foreach(self.attributes, attribute_writer(true)) + file:write("\n]\n") + end + file:write("dispinterface " .. self.name .. "\n{") + if self.interface ~= nil then + file:write(" interface " .. self.interface) + else +-- table.foreachi(self.constants, constant_writer) +-- file:write("\n") +-- table.foreachi(self.typedefs, typedef_writer) + file:write("\n properties:\n") + table.foreachi(self.properties, property_writer) + start_id = table.getn(self.properties) + file:write("\n methods:\n") + table.foreachi(self.methods, method_writer) + end + file:write("\n};\n\n") +end + +local coclass_proto = { + interfaces = {} +} + +function coclass_proto:AddInterface(attributes) + table.insert(self.interfaces, attributes) +end + +function coclass_proto:Write(file) + local function attribute_writer(line_break) + local first_attribute = true + return function(name, value) + if not first_attribute then + if line_break then + file:write(",\n ") + else + file:write(", ") + end + end + first_attribute = false + if(type(name) == "number") then + file:write(value) + else + file:write(name .. "(" .. value .. ")") + end + end + end + + local function interface_writer(i, interface) + local name = interface.name + interface.name = nil + file:write("[") + table.foreach(interface, attribute_writer(false)) + file:write("] ") + file:write("dispinterface " .. name .. ";\n") + interface.name = name + end + + if self.attributes then + file:write("[\n ") + table.foreach(self.attributes, attribute_writer(true)) + file:write("\n]\n") + end + file:write("coclass " .. self.name .. "\n{\n") + table.foreachi(self.interfaces, interface_writer) + file:write("};\n\n") +end + +local library_proto = { + interfaces = {}, + coclasses = {}, + imports = {}, + typedefs = {}, + AddTypedef = interface_proto.AddTypedef +} + +function library_proto:AddInterface(attributes) + local name = attributes.name + attributes.name = nil + local interface = attributes.interface + attributes.interface = nil + local newinterface = { name = name, attributes = attributes, interface = interface, __index = interface_proto } + setmetatable(newinterface, newinterface) + table.insert(self.interfaces, newinterface) + if interface ~= nil then + return nil + else + return newinterface + end +end + +function library_proto:AddCoclass(attributes) + local name = attributes.name + attributes.name = nil + local newcoclass = { name = name, attributes = attributes, __index = coclass_proto } + setmetatable(newcoclass, newcoclass) + table.insert(self.coclasses, newcoclass) + return newcoclass +end + +function library_proto:AddImport(library) + table.insert(self.imports, library) +end + +function library_proto:WriteODL(filename) + local file = io.open(filename .. ".odl","w+") + + local function attribute_writer(line_break) + local first_attribute = true + return function(name, value) + if not first_attribute then + if line_break then + file:write(",\n ") + else + file:write(", ") + end + end + first_attribute = false + if(type(name) == "number") then + file:write(value) + else + file:write(name .. "(" .. value .. ")") + end + end + end + + local function import_writer(i, import) + file:write(" " .. "importlib(\"" .. import .. "\");\n") + end + + local function typedef_writer(i, typedef) + file:write("\n" .. " typedef " .. typedef.type .. " " .. typedef.typedef .. ";\n") + end + + local function interface_writer(i, interface) + interface:Write(file) + end + + local function coclass_writer(i, coclass) + coclass:Write(file) + end + + if self.attributes then + file:write("[\n ") + table.foreach(self.attributes, attribute_writer(true)) + file:write("\n]\n") + end + file:write("library " .. self.name .. "\n{\n") + table.foreachi(self.imports, import_writer) + table.foreachi(self.typedefs, typedef_writer) + table.foreachi(self.interfaces, interface_writer) + table.foreachi(self.coclasses, coclass_writer) + file:write("};\n\n") + file:close() +end + +function library_proto:WriteTLB(filename) + self:WriteODL(filename) + os.execute("midl " .. filename .. ".odl") +end + +function luacomE.NewLibrary(attributes) + local name = attributes.name + attributes.name = nil + local newlibrary = { name = name, attributes = attributes, __index = library_proto } + setmetatable(newlibrary, newlibrary) + return newlibrary +end diff --git a/cosmic rage/lua/mapper.lua b/cosmic rage/lua/mapper.lua new file mode 100644 index 0000000..fed3c93 --- /dev/null +++ b/cosmic rage/lua/mapper.lua @@ -0,0 +1,1633 @@ +-- mapper.lua + +--[[ + +Author: Nick Gammon +Date: 11th March 2010 +Amended: 15th August 2010 +Amended: 2nd October 2010 +Amended: 18th October 2010 to added find callback +Amended: 16th November 2010 to add symbolic constants (miniwin.xxxx) +Amended: 18th November 2010 to add more timing and count of times called + Also added zooming with the mouse wheel. +Amended: 26th November 2010 to check timers are enabled when speedwalking. +Amended: 11th November 2014 to allow for detecting mouse-overs of rooms + +Generic MUD mapper. + +Exposed functions: + +init (t) -- call once, supply: + t.config -- ie. colours, sizes + t.get_room -- info about room (uid) + t.show_help -- function that displays some help + t.room_click -- function that handles RH click on room (uid, flags) + t.room_mouseover -- function that handles mouse-over a room (uid, flags) + t.room_cancelmouseover -- function that handles cancelled mouse-over of a room (uid, flags) + t.timing -- true to show timing + t.show_completed -- true to show "Speedwalk completed." + t.show_other_areas -- true to show non-current areas + t.show_up_down -- follow up/down exits + t.show_area_exits -- true to draw a circle around rooms leading to other areas + t.speedwalk_prefix -- if not nil, speedwalk by prefixing with this + +zoom_in () -- zoom in map view +zoom_out () -- zoom out map view +mapprint (message) -- like print, but uses mapper colour +maperror (message) -- like print, but prints in red +hide () -- hides map window (eg. if plugin disabled) +show () -- show map window (eg. if plugin enabled) +save_state () -- call to save plugin state (ie. in OnPluginSaveState) +draw (uid) -- draw map - starting at room 'uid' +start_speedwalk (path) -- starts speedwalking. path is a table of directions/uids +build_speedwalk (path) -- builds a client speedwalk string from path +cancel_speedwalk () -- cancel current speedwalk, if any +check_we_can_find () -- returns true if doing a find is OK right now +find (f, show_uid, count, walk) -- generic room finder +find_paths (uid, f) -- lower-level room finder (for getting back a path) + +Exposed variables: + +win -- the window (in case you want to put up menus) +VERSION -- mapper version +last_hyperlink_uid -- room uid of last hyperlink click (destination) +last_speedwalk_uid -- room uid of last speedwalk attempted (destination) + -- functions required to be global by the client (eg. for mouseup) + +Room info should include: + + name (what to show as room name) + exits (table keyed by direction, value is exit uid) + area (area name) + hovermessage (what to show when you mouse-over the room) + bordercolour (colour of room border) - RGB colour + borderpen (pen style of room border) - see WindowCircleOp (values 0 to 6) + borderpenwidth(pen width of room border) - eg. 1 for normal, 2 for current room + fillcolour (colour to fill room) - RGB colour, nil for default + fillbrush (brush to fill room) - see WindowCircleOp (values 0 to 12) + +--]] + +module (..., package.seeall) + +VERSION = 2.6 -- for querying by plugins + +require "movewindow" +require "copytable" +require "gauge" +require "pairsbykeys" +require "mw" + +local FONT_ID = "fn" -- internal font identifier +local FONT_ID_UL = "fnu" -- internal font identifier - underlined + +-- size of room box +local ROOM_SIZE = 10 + +-- how far away to draw rooms from each other +local DISTANCE_TO_NEXT_ROOM = 15 + +-- supplied in init +local config -- configuration table +local supplied_get_room +local room_click +local room_mouseover +local room_cancelmouseover +local timing -- true to show timing and other info +local show_completed -- true to show "Speedwalk completed." +local show_other_areas -- true to draw other areas +local show_area_exits -- true to show area exits +local show_up_down -- true to show up/down exits + +-- current room number +local current_room + +-- our copy of rooms info +local rooms = {} +local last_visited = {} + +-- other locals +local HALF_ROOM, connectors, half_connectors, arrows +local plan_to_draw, speedwalks, drawn, drawn_coords +local last_drawn, depth, windowinfo, font_height +local walk_to_room_name +local total_times_drawn = 0 +local total_time_taken = 0 + +local function build_room_info () + + HALF_ROOM = ROOM_SIZE / 2 + local THIRD_WAY = DISTANCE_TO_NEXT_ROOM / 3 + local DISTANCE_LESS1 = DISTANCE_TO_NEXT_ROOM - 1 + + -- how to draw a line from this room to the next one (relative to the center of the room) + connectors = { + n = { x1 = 0, y1 = - HALF_ROOM, x2 = 0, y2 = - HALF_ROOM - DISTANCE_LESS1, at = { 0, -1 } }, + s = { x1 = 0, y1 = HALF_ROOM, x2 = 0, y2 = HALF_ROOM + DISTANCE_LESS1, at = { 0, 1 } }, + e = { x1 = HALF_ROOM, y1 = 0, x2 = HALF_ROOM + DISTANCE_LESS1, y2 = 0, at = { 1, 0 }}, + w = { x1 = - HALF_ROOM, y1 = 0, x2 = - HALF_ROOM - DISTANCE_LESS1, y2 = 0, at = { -1, 0 }}, + + ne = { x1 = HALF_ROOM, y1 = - HALF_ROOM, x2 = HALF_ROOM + DISTANCE_LESS1 , y2 = - HALF_ROOM - DISTANCE_LESS1, at = { 1, -1 } }, + se = { x1 = HALF_ROOM, y1 = HALF_ROOM, x2 = HALF_ROOM + DISTANCE_LESS1 , y2 = HALF_ROOM + DISTANCE_LESS1, at = { 1, 1 } }, + nw = { x1 = - HALF_ROOM, y1 = - HALF_ROOM, x2 = - HALF_ROOM - DISTANCE_LESS1 , y2 = - HALF_ROOM - DISTANCE_LESS1, at = {-1, -1 } }, + sw = { x1 = - HALF_ROOM, y1 = HALF_ROOM, x2 = - HALF_ROOM - DISTANCE_LESS1 , y2 = HALF_ROOM + DISTANCE_LESS1, at = {-1, 1 } }, + + } -- end connectors + + -- how to draw a stub line + half_connectors = { + n = { x1 = 0, y1 = - HALF_ROOM, x2 = 0, y2 = - HALF_ROOM - THIRD_WAY, at = { 0, -1 } }, + s = { x1 = 0, y1 = HALF_ROOM, x2 = 0, y2 = HALF_ROOM + THIRD_WAY, at = { 0, 1 } }, + e = { x1 = HALF_ROOM, y1 = 0, x2 = HALF_ROOM + THIRD_WAY, y2 = 0, at = { 1, 0 }}, + w = { x1 = - HALF_ROOM, y1 = 0, x2 = - HALF_ROOM - THIRD_WAY, y2 = 0, at = { -1, 0 }}, + + ne = { x1 = HALF_ROOM, y1 = - HALF_ROOM, x2 = HALF_ROOM + THIRD_WAY , y2 = - HALF_ROOM - THIRD_WAY, at = { 1, -1 } }, + se = { x1 = HALF_ROOM, y1 = HALF_ROOM, x2 = HALF_ROOM + THIRD_WAY , y2 = HALF_ROOM + THIRD_WAY, at = { 1, 1 } }, + nw = { x1 = - HALF_ROOM, y1 = - HALF_ROOM, x2 = - HALF_ROOM - THIRD_WAY , y2 = - HALF_ROOM - THIRD_WAY, at = {-1, -1 } }, + sw = { x1 = - HALF_ROOM, y1 = HALF_ROOM, x2 = - HALF_ROOM - THIRD_WAY , y2 = HALF_ROOM + THIRD_WAY, at = {-1, 1 } }, + + } -- end half_connectors + + -- how to draw one-way arrows (relative to the center of the room) + arrows = { + n = { - 2, - HALF_ROOM - 2, 2, - HALF_ROOM - 2, 0, - HALF_ROOM - 6 }, + s = { - 2, HALF_ROOM + 2, 2, HALF_ROOM + 2, 0, HALF_ROOM + 6 }, + e = { HALF_ROOM + 2, -2, HALF_ROOM + 2, 2, HALF_ROOM + 6, 0 }, + w = { - HALF_ROOM - 2, -2, - HALF_ROOM - 2, 2, - HALF_ROOM - 6, 0 }, + + ne = { HALF_ROOM + 3, - HALF_ROOM, HALF_ROOM + 3, - HALF_ROOM - 3, HALF_ROOM, - HALF_ROOM - 3 }, + se = { HALF_ROOM + 3, HALF_ROOM, HALF_ROOM + 3, HALF_ROOM + 3, HALF_ROOM, HALF_ROOM + 3 }, + nw = { - HALF_ROOM - 3, - HALF_ROOM, - HALF_ROOM - 3, - HALF_ROOM - 3, - HALF_ROOM, - HALF_ROOM - 3 }, + sw = { - HALF_ROOM - 3, HALF_ROOM, - HALF_ROOM - 3, HALF_ROOM + 3, - HALF_ROOM, HALF_ROOM + 3}, + + } -- end of arrows + +end -- build_room_info + +local default_config = { + -- assorted colours + BACKGROUND_COLOUR = { name = "Background", colour = ColourNameToRGB "lightseagreen", }, + ROOM_COLOUR = { name = "Room", colour = ColourNameToRGB "cyan", }, + EXIT_COLOUR = { name = "Exit", colour = ColourNameToRGB "darkgreen", }, + EXIT_COLOUR_UP_DOWN = { name = "Exit up/down", colour = ColourNameToRGB "darkmagenta", }, + EXIT_COLOUR_IN_OUT = { name = "Exit in/out", colour = ColourNameToRGB "#3775E8", }, + UNKNOWN_ROOM_COLOUR = { name = "Unknown room", colour = ColourNameToRGB "#00CACA", }, + MAPPER_NOTE_COLOUR = { name = "Messages", colour = ColourNameToRGB "lightgreen" }, + + ROOM_NAME_TEXT = { name = "Room name text", colour = ColourNameToRGB "#BEF3F1", }, + ROOM_NAME_FILL = { name = "Room name fill", colour = ColourNameToRGB "#105653", }, + ROOM_NAME_BORDER = { name = "Room name box", colour = ColourNameToRGB "black", }, + + AREA_NAME_TEXT = { name = "Area name text", colour = ColourNameToRGB "#BEF3F1",}, + AREA_NAME_FILL = { name = "Area name fill", colour = ColourNameToRGB "#105653", }, + AREA_NAME_BORDER = { name = "Area name box", colour = ColourNameToRGB "black", }, + + FONT = { name = get_preferred_font {"Dina", "Lucida Console", "Fixedsys", "Courier", "Sylfaen",} , + size = 8 + } , + + -- size of map window + WINDOW = { width = 400, height = 400 }, + + -- how far from where we are standing to draw (rooms) + SCAN = { depth = 30 }, + + -- speedwalk delay + DELAY = { time = 0.3 }, + + -- how many seconds to show "recent visit" lines (default 3 minutes) + LAST_VISIT_TIME = { time = 60 * 3 }, + + } + +local expand_direction = { + n = "north", + s = "south", + e = "east", + w = "west", + u = "up", + d = "down", + ne = "northeast", + sw = "southwest", + nw = "northwest", + se = "southeast", + ['in'] = "in", + out = "out", + } -- end of expand_direction + +local function get_room (uid) + local room = supplied_get_room (uid) + room = room or { unknown = true } + + -- defaults in case they didn't supply them ... + room.name = room.name or string.format ("Room %s", uid or "") + room.name = mw.strip_colours (room.name) -- no colour codes for now + room.exits = room.exits or {} + room.area = room.area or "" + room.hovermessage = room.hovermessage or "" + room.bordercolour = room.bordercolour or config.ROOM_COLOUR.colour + room.borderpen = room.borderpen or 0 -- solid + room.borderpenwidth = room.borderpenwidth or 1 + room.fillcolour = room.fillcolour or 0x000000 + room.fillbrush = room.fillbrush or 1 -- no fill + + return room +end -- get_room + +local function check_connected () + if not IsConnected() then + mapprint ("You are not connected to", WorldName()) + return false + end -- if not connected + return true +end -- check_connected + +local function make_number_checker (title, min, max, decimals) + return function (s) + local n = tonumber (s) + if not n then + utils.msgbox (title .. " must be a number", "Incorrect input", "ok", "!", 1) + return false -- bad input + end -- if + + if n < min or n > max then + utils.msgbox (title .. " must be in range " .. min .. " to " .. max, "Incorrect input", "ok", "!", 1) + return false -- bad input + end -- if + + if not decimals then + if string.match (s, "%.") then + utils.msgbox (title .. " cannot have decimal places", "Incorrect input", "ok", "!", 1) + return false -- bad input + end -- if + end -- no decimals + + return true -- good input + end -- generated function + +end -- make_number_checker + + +local function get_number_from_user (msg, title, current, min, max, decimals) + local max_length = math.ceil (math.log10 (max) + 1) + + -- if decimals allowed, allow room for them + if decimals then + max_length = max_length + 2 -- allow for 0.x + end -- if + + -- if can be negative, allow for minus sign + if min < 0 then + max_length = max_length + 1 + end -- if can be negative + + return tonumber (utils.inputbox (msg, title, current, nil, nil, + { validate = make_number_checker (title, min, max, decimals), + prompt_height = 14, + box_height = 130, + box_width = 300, + reply_width = 150, + max_length = max_length, + } -- end extra stuff + )) +end -- get_number_from_user + +local function draw_configuration () + local width = max_text_width (win, FONT_ID, {"Configuration", "Font", "Width", "Height", "Depth"}, true) + local lines = 6 -- "Configuration", font, width, height, depth, delay + local GAP = 5 + local suppress_colours = false + + for k, v in pairs (config) do + if v.colour then + width = math.max (width, WindowTextWidth (win, FONT_ID, v.name, true)) + lines = lines + 1 + end -- a colour item + end -- for each config item + + if (config.WINDOW.height - 13 - font_height * lines) < 10 then + suppress_colours = true + lines = 6 -- forget all the colours + end -- if + + local x = 3 + local y = config.WINDOW.height - 13 - font_height * lines + local box_size = font_height - 2 + local rh_size = math.max (box_size, max_text_width (win, FONT_ID, + {config.FONT.name .. " " .. config.FONT.size, + tostring (config.WINDOW.width), + tostring (config.WINDOW.height), + tostring (config.SCAN.depth)}, + true)) + local frame_width = GAP + width + GAP + rh_size + GAP -- gap / text / gap / box / gap + + -- fill entire box with grey + WindowRectOp (win, miniwin.rect_fill, x, y, x + frame_width, y + font_height * lines + 10, 0xDCDCDC) + -- frame it + draw_3d_box (win, x, y, frame_width, font_height * lines + 10) + + y = y + GAP + x = x + GAP + + -- title + WindowText (win, FONT_ID, "Configuration", x, y, 0, 0, 0x808080, true) + + -- close box + WindowRectOp (win, + miniwin.rect_frame, + x + frame_width - box_size - GAP * 2, + y + 1, + x + frame_width - GAP * 2, + y + 1 + box_size, + 0x808080) + WindowLine (win, + x + frame_width - box_size - GAP * 2 + 3, + y + 4, + x + frame_width - GAP * 2 - 3, + y - 2 + box_size, + 0x808080, + miniwin.pen_solid, 1) + WindowLine (win, + x - 4 + frame_width - GAP * 2, + y + 4, + x - 1 + frame_width - box_size - GAP * 2 + 3, + y - 2 + box_size, + 0x808080, + miniwin.pen_solid, 1) + + -- close configuration hotspot + WindowAddHotspot(win, "$", + x + frame_width - box_size - GAP * 2, + y + 1, + x + frame_width - GAP * 2, + y + 1 + box_size, -- rectangle + "", "", "", "", "mapper.mouseup_close_configure", -- mouseup + "Click to close", + miniwin.cursor_hand, 0) -- hand cursor + + y = y + font_height + + if not suppress_colours then + + for k, v in pairsByKeys (config) do + if v.colour then + WindowText (win, FONT_ID, v.name, x, y, 0, 0, 0x000000, true) + WindowRectOp (win, + miniwin.rect_fill, + x + width + rh_size / 2, + y + 1, + x + width + rh_size / 2 + box_size, + y + 1 + box_size, + v.colour) + WindowRectOp (win, + miniwin.rect_frame, + x + width + rh_size / 2, + y + 1, + x + width + rh_size / 2 + box_size, + y + 1 + box_size, + 0x000000) + + -- colour change hotspot + WindowAddHotspot(win, + "$colour:" .. k, + x + GAP, + y + 1, + x + width + rh_size / 2 + box_size, + y + 1 + box_size, -- rectangle + "", "", "", "", "mapper.mouseup_change_colour", -- mouseup + "Click to change colour", + miniwin.cursor_hand, 0) -- hand cursor + + y = y + font_height + end -- a colour item + end -- for each config item + end -- if + + -- depth + WindowText (win, FONT_ID, "Depth", x, y, 0, 0, 0x000000, true) + WindowText (win, FONT_ID_UL, tostring (config.SCAN.depth), x + width + GAP, y, 0, 0, 0x808080, true) + + -- depth hotspot + WindowAddHotspot(win, + "$", + x + GAP, + y, + x + frame_width, + y + font_height, -- rectangle + "", "", "", "", "mapper.mouseup_change_depth", -- mouseup + "Click to change scan depth", + miniwin.cursor_hand, 0) -- hand cursor + y = y + font_height + + -- font + WindowText (win, FONT_ID, "Font", x, y, 0, 0, 0x000000, true) + WindowText (win, FONT_ID_UL, config.FONT.name .. " " .. config.FONT.size, x + width + GAP, y, 0, 0, 0x808080, true) + + -- colour font hotspot + WindowAddHotspot(win, + "$", + x + GAP, + y, + x + frame_width, + y + font_height, -- rectangle + "", "", "", "", "mapper.mouseup_change_font", -- mouseup + "Click to change font", + miniwin.cursor_hand, 0) -- hand cursor + y = y + font_height + + + -- width + WindowText (win, FONT_ID, "Width", x, y, 0, 0, 0x000000, true) + WindowText (win, FONT_ID_UL, tostring (config.WINDOW.width), x + width + GAP, y, 0, 0, 0x808080, true) + + -- width hotspot + WindowAddHotspot(win, + "$", + x + GAP, + y, + x + frame_width, + y + font_height, -- rectangle + "", "", "", "", "mapper.mouseup_change_width", -- mouseup + "Click to change window width", + miniwin.cursor_hand, 0) -- hand cursor + y = y + font_height + + -- height + WindowText (win, FONT_ID, "Height", x, y, 0, 0, 0x000000, true) + WindowText (win, FONT_ID_UL, tostring (config.WINDOW.height), x + width + GAP, y, 0, 0, 0x808080, true) + + -- height hotspot + WindowAddHotspot(win, + "$", + x + GAP, + y, + x + frame_width, + y + font_height, -- rectangle + "", "", "", "", "mapper.mouseup_change_height", -- mouseup + "Click to change window height", + miniwin.cursor_hand, 0) -- hand cursor + y = y + font_height + + -- delay + WindowText (win, FONT_ID, "Walk delay", x, y, 0, 0, 0x000000, true) + WindowText (win, FONT_ID_UL, tostring (config.DELAY.time), x + width + GAP, y, 0, 0, 0x808080, true) + + -- height hotspot + WindowAddHotspot(win, + "$", + x + GAP, + y, + x + frame_width, + y + font_height, -- rectangle + "", "", "", "", "mapper.mouseup_change_delay", -- mouseup + "Click to change speedwalk delay", + miniwin.cursor_hand, 0) -- hand cursor + y = y + font_height + +end -- draw_configuration + +-- for calculating one-way paths +local inverse_direction = { + n = "s", + s = "n", + e = "w", + w = "e", + u = "d", + d = "u", + ne = "sw", + sw = "ne", + nw = "se", + se = "nw", + ['in'] = "out", + out = "in", + } -- end of inverse_direction + +local function add_another_room (uid, path, x, y) + local path = path or {} + return {uid=uid, path=path, x = x, y = y} +end -- add_another_room + +local function draw_room (uid, path, x, y) + + local coords = string.format ("%i,%i", math.floor (x), math.floor (y)) + + -- need this for the *current* room !!! + drawn_coords [coords] = uid + + -- print ("drawing", uid, "at", coords) + + if drawn [uid] then + return + end -- done this one + + -- don't draw the same room more than once + drawn [uid] = { coords = coords, path = path } + + local room = rooms [uid] + + -- not cached - get from caller + if not room then + room = get_room (uid) + rooms [uid] = room + end -- not in cache + + + local left, top, right, bottom = x - HALF_ROOM, y - HALF_ROOM, x + HALF_ROOM, y + HALF_ROOM + + -- forget it if off screen + if x < HALF_ROOM or y < HALF_ROOM or + x > config.WINDOW.width - HALF_ROOM or y > config.WINDOW.height - HALF_ROOM then + return + end -- if + + -- exits + + local texits = {} + + for dir, exit_uid in pairs (room.exits) do + table.insert (texits, dir) + local exit_info = connectors [dir] + local stub_exit_info = half_connectors [dir] + local exit_line_colour = config.EXIT_COLOUR.colour + local arrow = arrows [dir] + + -- draw up in the ne/nw position if not already an exit there at this level + if dir == "u" then + if not room.exits.nw then + exit_info = connectors.nw + stub_exit_info = half_connectors.nw + arrow = arrows.nw + exit_line_colour = config.EXIT_COLOUR_UP_DOWN.colour + end -- if available + elseif dir == "in" then + if not room.exits.ne then + exit_info = connectors.ne + stub_exit_info = half_connectors.ne + arrow = arrows.ne + exit_line_colour = config.EXIT_COLOUR_IN_OUT.colour + end -- if + elseif dir == "d" then + if not room.exits.se then + exit_info = connectors.se + stub_exit_info = half_connectors.se + arrow = arrows.se + exit_line_colour = config.EXIT_COLOUR_UP_DOWN.colour + end -- if available + elseif dir == "out" then + if not room.exits.sw then + exit_info = connectors.sw + stub_exit_info = half_connectors.sw + arrow = arrows.sw + exit_line_colour = config.EXIT_COLOUR_IN_OUT.colour + end -- if + end -- if down + + if exit_info then + local linetype = miniwin.pen_solid -- unbroken + local linewidth = 1 -- not recent + + -- try to cache room + if not rooms [exit_uid] then + rooms [exit_uid] = get_room (exit_uid) + end -- if + + if rooms [exit_uid].unknown then + linetype = miniwin.pen_dot -- dots + end -- if + + local next_x = x + exit_info.at [1] * (ROOM_SIZE + DISTANCE_TO_NEXT_ROOM) + local next_y = y + exit_info.at [2] * (ROOM_SIZE + DISTANCE_TO_NEXT_ROOM) + + local next_coords = string.format ("%i,%i", math.floor (next_x), math.floor (next_y)) + + -- remember if a zone exit (first one only) + if show_area_exits and room.area ~= rooms [exit_uid].area then + area_exits [ rooms [exit_uid].area ] = area_exits [ rooms [exit_uid].area ] or {x = x, y = y} + end -- if + + -- if another room (not where this one leads to) is already there, only draw "stub" lines + if drawn_coords [next_coords] and drawn_coords [next_coords] ~= exit_uid then + exit_info = stub_exit_info + elseif exit_uid == uid then + + -- here if room leads back to itself + exit_info = stub_exit_info + linetype = miniwin.pen_dash -- dash + + else + if (not show_other_areas and rooms [exit_uid].area ~= current_area) or + (not show_up_down and (dir == "u" or dir == "d")) then + exit_info = stub_exit_info -- don't show other areas + else + -- if we are scheduled to draw the room already, only draw a stub this time + if plan_to_draw [exit_uid] and plan_to_draw [exit_uid] ~= next_coords then + -- here if room already going to be drawn + exit_info = stub_exit_info + linetype = miniwin.pen_dash -- dash + else + -- remember to draw room next iteration + local new_path = copytable.deep (path) + table.insert (new_path, { dir = dir, uid = exit_uid }) + table.insert (rooms_to_be_drawn, add_another_room (exit_uid, new_path, next_x, next_y)) + drawn_coords [next_coords] = exit_uid + plan_to_draw [exit_uid] = next_coords + + -- if exit room known + if not rooms [exit_uid].unknown then + local exit_time = last_visited [exit_uid] or 0 + local this_time = last_visited [uid] or 0 + local now = os.time () + if exit_time > (now - config.LAST_VISIT_TIME.time) and + this_time > (now - config.LAST_VISIT_TIME.time) then + linewidth = 2 + end -- if + end -- if + end -- if + end -- if + end -- if drawn on this spot + + WindowLine (win, x + exit_info.x1, y + exit_info.y1, x + exit_info.x2, y + exit_info.y2, exit_line_colour, linetype, linewidth) + + -- one-way exit? + + if not rooms [exit_uid].unknown then + local dest = rooms [exit_uid] + -- if inverse direction doesn't point back to us, this is one-way + if dest.exits [inverse_direction [dir]] ~= uid then + + -- turn points into string, relative to where the room is + local points = string.format ("%i,%i,%i,%i,%i,%i", + x + arrow [1], + y + arrow [2], + x + arrow [3], + y + arrow [4], + x + arrow [5], + y + arrow [6]) + + -- draw arrow + WindowPolygon(win, points, + exit_line_colour, miniwin.pen_solid, 1, + exit_line_colour, miniwin.brush_solid, + true, true) + + end -- one way + + end -- if we know of the room where it does + + end -- if we know what to do with this direction + end -- for each exit + + + if room.unknown then + WindowCircleOp (win, miniwin.circle_rectangle, left, top, right, bottom, + config.UNKNOWN_ROOM_COLOUR.colour, miniwin.pen_dot, 1, -- dotted single pixel pen + -1, miniwin.brush_null) -- opaque, no brush + else + WindowCircleOp (win, miniwin.circle_rectangle, left, top, right, bottom, + 0, miniwin.pen_null, 0, -- no pen + room.fillcolour, room.fillbrush) -- brush + + WindowCircleOp (win, miniwin.circle_rectangle, left, top, right, bottom, + room.bordercolour, room.borderpen, room.borderpenwidth, -- pen + -1, miniwin.brush_null) -- opaque, no brush + end -- if + + + -- show up and down in case we can't get a line in + + if room.exits.u then -- line at top + WindowLine (win, left, top, left + ROOM_SIZE, top, config.EXIT_COLOUR_UP_DOWN.colour, miniwin.pen_solid, 1) + end -- if + if room.exits.d then -- line at bottom + WindowLine (win, left, bottom, left + ROOM_SIZE, bottom, config.EXIT_COLOUR_UP_DOWN.colour, miniwin.pen_solid, 1) + end -- if + if room.exits ['in'] then -- line at right + WindowLine (win, left + ROOM_SIZE, top, left + ROOM_SIZE, bottom, config.EXIT_COLOUR_IN_OUT.colour, miniwin.pen_solid, 1) + end -- if + if room.exits.out then -- line at left + WindowLine (win, left, top, left, bottom, config.EXIT_COLOUR_IN_OUT.colour, miniwin.pen_solid , 1) + end -- if + + speedwalks [uid] = path -- so we know how to get here + + WindowAddHotspot(win, uid, + left, top, right, bottom, -- rectangle + "mapper.mouseover_room", -- mouseover + "mapper.cancelmouseover_room", -- cancelmouseover + "", -- mousedown + "", -- cancelmousedown + "mapper.mouseup_room", -- mouseup + room.hovermessage, + miniwin.cursor_hand, 0) -- hand cursor + + WindowScrollwheelHandler (win, uid, "mapper.zoom_map") + +end -- draw_room + +local function changed_room (uid) + + hyperlink_paths = nil -- those hyperlinks are meaningless now + speedwalks = {} -- old speedwalks are irrelevant + + if current_speedwalk then + + if uid ~= expected_room then + local exp = rooms [expected_room] + if not exp then + exp = get_room (expected_room) or { name = expected_room } + end -- if + local here = rooms [uid] + if not here then + here = get_room (uid) or { name = uid } + end -- if + exp = expected_room + here = uid + maperror (string.format ("Speedwalk failed! Expected to be in '%s' but ended up in '%s'.", exp or "", here)) + cancel_speedwalk () + else + if #current_speedwalk > 0 then + local dir = table.remove (current_speedwalk, 1) + SetStatus ("Walking " .. (expand_direction [dir.dir] or dir.dir) .. + " to " .. walk_to_room_name .. + ". Speedwalks to go: " .. #current_speedwalk + 1) + expected_room = dir.uid + if config.DELAY.time > 0 then + if GetOption ("enable_timers") ~= 1 then + maperror ("WARNING! Timers not enabled. Speedwalking will not work properly.") + end -- if timers disabled + DoAfter (config.DELAY.time, dir.dir) + else + Send (dir.dir) + end -- if + else + last_hyperlink_uid = nil + last_speedwalk_uid = nil + if show_completed then + mapprint ("Speedwalk completed.") + end -- if wanted + cancel_speedwalk () + end -- if any left + end -- if expected room or not + end -- if have a current speedwalk + +end -- changed_room + +local function draw_zone_exit (exit) + + local x, y = exit.x, exit.y + local offset = ROOM_SIZE + + -- draw circle around us + WindowCircleOp (win, miniwin.circle_ellipse, + x - offset, y - offset, + x + offset, y + offset, + ColourNameToRGB "cornflowerblue", -- pen colour + miniwin.pen_solid, -- solid pen + 3, -- pen width + 0, -- brush colour + miniwin.brush_null) -- null brush + + WindowCircleOp (win, miniwin.circle_ellipse, + x - offset, y - offset, + x + offset, y + offset, + ColourNameToRGB "cyan", -- pen colour + miniwin.pen_solid, -- solid pen + 1, -- pen width + 0, -- brush colour + miniwin.brush_null) -- null brush + +end -- draw_zone_exit + + +---------------------------------------------------------------------------------- +-- EXPOSED FUNCTIONS +---------------------------------------------------------------------------------- + +-- can we find another room right now? + +function check_we_can_find () + + if not check_connected () then + return + end -- if + + if not current_room then + mapprint ("I don't know where you are right now - try: LOOK") + return false + end -- if + + if current_speedwalk then + mapprint ("No point doing this while you are speedwalking.") + return false + end -- if + + return true +end -- check_we_can_find + +-- see: http://www.gammon.com.au/forum/?id=7306&page=2 +-- Thanks to Ked. + +-- uid is starting room +-- f returns true (or a "reason" string) if we want to store this one, and true,true if +-- we have done searching (ie. all wanted rooms found) + +function find_paths (uid, f) + + local function make_particle (curr_loc, prev_path) + local prev_path = prev_path or {} + return {current_room=curr_loc, path=prev_path} + end + + local depth = 0 + local count = 0 + local done = false + local found, reason + local explored_rooms, particles = {}, {} + + -- this is where we collect found paths + -- the table is keyed by destination, with paths as values + local paths = {} + + -- create particle for the initial room + table.insert (particles, make_particle (uid)) + + while (not done) and #particles > 0 and depth < config.SCAN.depth do + + -- create a new generation of particles + new_generation = {} + depth = depth + 1 + + SetStatus (string.format ("Scanning: %i/%i depth (%i rooms)", depth, config.SCAN.depth, count)) + + -- process each active particle + for i, part in ipairs (particles) do + + count = count + 1 + + if not rooms [part.current_room] then + rooms [part.current_room] = get_room (part.current_room) + end -- if not in memory yet + + -- if room doesn't exist, forget it + if rooms [part.current_room] then + + -- get a list of exits from the current room + exits = rooms [part.current_room].exits + + -- create one new particle for each exit + for dir, dest in pairs(exits) do + + -- if we've been in this room before, drop it + if not explored_rooms[dest] then + explored_rooms[dest] = true + rooms [dest] = supplied_get_room (dest) -- make sure this room in table + if rooms [dest] then + new_path = copytable.deep (part.path) + table.insert(new_path, { dir = dir, uid = dest } ) + + -- if this room is in the list of destinations then save its path + found, done = f (dest) + if found then + paths[dest] = { path = new_path, reason = found } + end -- found one! + + -- make a new particle in the new room + table.insert(new_generation, make_particle(dest, new_path)) + end -- if room exists + end -- not explored this room + if done then + break + end + + end -- for each exit + + end -- if room exists + + if done then + break + end + end -- for each particle + + particles = new_generation + end -- while more particles + + SetStatus "Ready" + return paths, count, depth +end -- function find_paths + +-- draw our map starting at room: uid + +function draw (uid) + + if not uid then + maperror "Cannot draw map right now, I don't know where you are - try: LOOK" + return + end -- if + + if current_room and current_room ~= uid then + changed_room (uid) + end -- if + + current_room = uid -- remember where we are + + -- timing + local start_time = utils.timer () + + -- start with initial room + rooms = { [uid] = get_room (uid) } + + -- lookup current room + local room = rooms [uid] + + room = room or { name = "", area = "" } + last_visited [uid] = os.time () + + current_area = room.area + + -- we are recreating the window so any mouse-over is not valid any more + if WindowInfo (win, 19) and WindowInfo (win, 19) ~= "" then + if type (room_cancelmouseover) == "function" then + room_cancelmouseover (WindowInfo (win, 19), 0) -- cancelled mouse over + end -- if + end -- have a hotspot + + WindowDeleteAllHotspots (win) + + WindowCreate (win, + windowinfo.window_left, + windowinfo.window_top, + config.WINDOW.width, + config.WINDOW.height, + windowinfo.window_mode, -- top right + windowinfo.window_flags, + config.BACKGROUND_COLOUR.colour) + + -- let them move it around + movewindow.add_drag_handler (win, 0, 0, 0, font_height + 4) + + -- for zooming + WindowAddHotspot(win, + "zzz_zoom", + 0, 0, 0, 0, + "", "", "", "", "", + "", -- hint + miniwin.cursor_arrow, 0) + + WindowScrollwheelHandler (win, "zzz_zoom", "mapper.zoom_map") + + -- set up for initial room, in middle + drawn, drawn_coords, rooms_to_be_drawn, speedwalks, plan_to_draw, area_exits = {}, {}, {}, {}, {}, {} + depth = 0 + + -- insert initial room + table.insert (rooms_to_be_drawn, add_another_room (uid, {}, config.WINDOW.width / 2, config.WINDOW.height / 2)) + + while #rooms_to_be_drawn > 0 and depth < config.SCAN.depth do + local old_generation = rooms_to_be_drawn + rooms_to_be_drawn = {} -- new generation + for i, part in ipairs (old_generation) do + draw_room (part.uid, part.path, part.x, part.y) + end -- for each existing room + depth = depth + 1 + end -- while all rooms_to_be_drawn + + for area, zone_exit in pairs (area_exits) do + draw_zone_exit (zone_exit) + end -- for + + local room_name = room.name + local name_width = WindowTextWidth (win, FONT_ID, room_name, true) + local add_dots = false + + -- truncate name if too long + while name_width > (config.WINDOW.width - 10) do + -- get rid of last word + local s = string.match (" " .. room_name .. "...", "(%s%S*)$") + if not s or #s == 0 then break end + room_name = room_name:sub (1, - (#s - 2)) -- except the last 3 dots but add the space + name_width = WindowTextWidth (win, FONT_ID, room_name .. " ...", true) + add_dots = true + end -- while + + if add_dots then + room_name = room_name .. " ..." + end -- if + + -- room name + + draw_text_box (win, FONT_ID, + (config.WINDOW.width - WindowTextWidth (win, FONT_ID, room_name, true)) / 2, -- left + 3, -- top + room_name, true, -- what to draw, utf8 + config.ROOM_NAME_TEXT.colour, -- text colour + config.ROOM_NAME_FILL.colour, -- fill colour + config.ROOM_NAME_BORDER.colour) -- border colour + + -- area name + + local areaname = room.area + + if areaname then + draw_text_box (win, FONT_ID, + (config.WINDOW.width - WindowTextWidth (win, FONT_ID, areaname, true)) / 2, -- left + config.WINDOW.height - 6 - font_height, -- top + areaname, true, -- what to draw, utf8 + config.AREA_NAME_TEXT.colour, -- text colour + config.AREA_NAME_FILL.colour, -- fill colour + config.AREA_NAME_BORDER.colour) -- border colour + end -- if area known + + -- configure? + + if draw_configure_box then + draw_configuration () + else + + local x = 5 + local y = config.WINDOW.height - 6 - font_height + local width = draw_text_box (win, FONT_ID, + x, -- left + y, -- top (ie. at bottom) + "*", true, -- what to draw, utf8 + config.AREA_NAME_TEXT.colour, -- text colour + config.AREA_NAME_FILL.colour, -- fill colour + config.AREA_NAME_BORDER.colour) -- border colour + + WindowAddHotspot(win, "", + x, y, x + width, y + font_height, -- rectangle + "", -- mouseover + "", -- cancelmouseover + "", -- mousedown + "", -- cancelmousedown + "mapper.mouseup_configure", -- mouseup + "Click to configure map", + miniwin.cursor_hand, 0) -- hand cursor + end -- if + + if type (show_help) == "function" then + local x = config.WINDOW.width - WindowTextWidth (win, FONT_ID, "?", true) - 5 + local y = config.WINDOW.height - 6 - font_height + local width = draw_text_box (win, FONT_ID, + x, -- left + y, -- top (ie. at bottom) + "?", true, -- what to draw, utf8 + config.AREA_NAME_TEXT.colour, -- text colour + config.AREA_NAME_FILL.colour, -- fill colour + config.AREA_NAME_BORDER.colour) -- border colour + + WindowAddHotspot(win, "", + x, y, x + width, y + font_height, -- rectangle + "", -- mouseover + "", -- cancelmouseover + "", -- mousedown + "", -- cancelmousedown + "mapper.show_help", -- mouseup + "Click for help", + miniwin.cursor_hand, 0) -- hand cursor + end -- if + + -- 3D box around whole thing + + draw_3d_box (win, 0, 0, config.WINDOW.width, config.WINDOW.height) + + -- make sure window visible + WindowShow (win, not hidden) + + last_drawn = uid -- last room number we drew (for zooming) + + local end_time = utils.timer () + + -- timing stuff + if timing then + local count= 0 + for k in pairs (drawn) do + count = count + 1 + end + print (string.format ("Time to draw %i rooms = %0.3f seconds, search depth = %i", count, end_time - start_time, depth)) + + total_times_drawn = total_times_drawn + 1 + total_time_taken = total_time_taken + end_time - start_time + + print (string.format ("Total times map drawn = %i, average time to draw = %0.3f seconds", + total_times_drawn, + total_time_taken / total_times_drawn)) + end -- if + +end -- draw + +local credits = { + "MUSHclient mapper", + string.format ("Version %0.1f", VERSION), + "Written by Nick Gammon", + WorldName (), + GetInfo (3), + } + +-- call once to initialize the mapper +function init (t) + + -- make copy of colours, sizes etc. + config = t.config + assert (type (config) == "table", "No 'config' table supplied to mapper.") + + supplied_get_room = t.get_room + assert (type (supplied_get_room) == "function", "No 'get_room' function supplied to mapper.") + + show_help = t.show_help -- "help" function + room_click = t.room_click -- RH mouse-click function + room_mouseover = t.room_mouseover -- mouse-over function + room_cancelmouseover = t.room_cancelmouseover -- cancel mouse-over function + timing = t.timing -- true for timing info + show_completed = t.show_completed -- true to show "Speedwalk completed." message + show_other_areas = t.show_other_areas -- true to show other areas + show_up_down = t.show_up_down -- true to show up or down + show_area_exits = t.show_area_exits -- true to show area exits + speedwalk_prefix = t.speedwalk_prefix -- how to speedwalk (prefix) + + -- force some config defaults if not supplied + for k, v in pairs (default_config) do + config [k] = config [k] or v + end -- for + + win = GetPluginID () .. "_mapper" + + WindowCreate (win, 0, 0, 0, 0, 0, 0, 0) + + -- add the fonts + WindowFont (win, FONT_ID, config.FONT.name, config.FONT.size) + WindowFont (win, FONT_ID_UL, config.FONT.name, config.FONT.size, false, false, true) + + -- see how high it is + font_height = WindowFontInfo (win, FONT_ID, 1) -- height + + -- find where window was last time + windowinfo = movewindow.install (win, miniwin.pos_center_right) + + -- calculate box sizes, arrows, connecting lines etc. + build_room_info () + + WindowCreate (win, + windowinfo.window_left, + windowinfo.window_top, + config.WINDOW.width, + config.WINDOW.height, + windowinfo.window_mode, -- top right + windowinfo.window_flags, + config.BACKGROUND_COLOUR.colour) + + -- let them move it around + movewindow.add_drag_handler (win, 0, 0, 0, font_height + 4) + + local top = (config.WINDOW.height - #credits * font_height) /2 + + for _, v in ipairs (credits) do + local width = WindowTextWidth (win, FONT_ID, v, true) + local left = (config.WINDOW.width - width) / 2 + WindowText (win, FONT_ID, v, left, top, 0, 0, config.ROOM_COLOUR.colour, true) + top = top + font_height + end -- for + + draw_3d_box (win, 0, 0, config.WINDOW.width, config.WINDOW.height) + + WindowShow (win, true) + +end -- init + +function zoom_in () + if last_drawn and ROOM_SIZE < 40 then + ROOM_SIZE = ROOM_SIZE + 2 + DISTANCE_TO_NEXT_ROOM = DISTANCE_TO_NEXT_ROOM + 2 + build_room_info () + draw (last_drawn) + end -- if +end -- zoom_in + + +function zoom_out () + if last_drawn and ROOM_SIZE > 4 then + ROOM_SIZE = ROOM_SIZE - 2 + DISTANCE_TO_NEXT_ROOM = DISTANCE_TO_NEXT_ROOM - 2 + build_room_info () + draw (last_drawn) + end -- if +end -- zoom_out + +function mapprint (...) + local old_note_colour = GetNoteColourFore () + SetNoteColourFore(config.MAPPER_NOTE_COLOUR.colour) + print (...) + SetNoteColourFore (old_note_colour) +end -- mapprint + +function maperror (...) + local old_note_colour = GetNoteColourFore () + SetNoteColourFore(ColourNameToRGB "red") + print (...) + SetNoteColourFore (old_note_colour) +end -- maperror + +function show () + WindowShow (win, true) + hidden = false +end -- show + +function hide () + WindowShow (win, false) + hidden = true +end -- hide + +function save_state () + movewindow.save_state (win) +end -- save_state + + +-- generic room finder + +-- f (uid) is a function which returns: found, done +-- found is not nil if uid is a wanted room - if it is a string it is the reason it matched (eg. shop) +-- done is true if we know there is nothing else to search for (eg. all rooms found) + +-- show_uid is true if you want the room uid to be displayed + +-- expected_count is the number we expect to find (eg. the number found on a database) + +-- if 'walk' is true, we walk to the first match rather than displaying hyperlinks + +-- if fcb is a function, it is called back after displaying each line + +function find (f, show_uid, expected_count, walk, fcb) + + if not check_we_can_find () then + return + end -- if + + if fcb then + assert (type (fcb) == "function") + end -- if + + local start_time = utils.timer () + local paths, count, depth = find_paths (current_room, f) + local end_time = utils.timer () + + local t = {} + local found_count = 0 + for k in pairs (paths) do + table.insert (t, k) + found_count = found_count + 1 + end -- for + + -- timing stuff + if timing then + print (string.format ("Time to search %i rooms = %0.3f seconds, search depth = %i", + count, end_time - start_time, depth)) + end -- if + + if found_count == 0 then + mapprint ("No matches.") + return + end -- if + + if found_count == 1 and walk then + uid, item = next (paths, nil) + mapprint ("Walking to:", rooms [uid].name) + start_speedwalk (item.path) + return + end -- if walking wanted + + -- sort so closest ones are first + table.sort (t, function (a, b) return #paths [a].path < #paths [b].path end ) + + hyperlink_paths = {} + + for _, uid in ipairs (t) do + local room = rooms [uid] -- ought to exist or wouldn't be in table + + assert (room, "Room " .. uid .. " is not in rooms table.") + + if current_room == uid then + mapprint (room.name, "is the room you are in") + else + local distance = #paths [uid].path .. " room" + if #paths [uid].path > 1 then + distance = distance .. "s" + end -- if + distance = distance .. " away" + + local room_name = room.name + if show_uid then + room_name = room_name .. " (" .. uid .. ")" + end -- if + + -- in case the same UID shows up later, it is only valid from the same room + local hash = utils.tohex (utils.md5 (tostring (current_room) .. "<-->" .. tostring (uid))) + + Hyperlink ("!!" .. GetPluginID () .. ":mapper.do_hyperlink(" .. hash .. ")", + room_name, "Click to speedwalk there (" .. distance .. ")", "", "", false) + local info = "" + if type (paths [uid].reason) == "string" and paths [uid].reason ~= "" then + info = " [" .. paths [uid].reason .. "]" + end -- if + mapprint (" - " .. distance .. info) -- new line + + -- callback to display extra stuff (like find context, room description) + if fcb then + fcb (uid) + end -- if callback + hyperlink_paths [hash] = paths [uid].path + end -- if + end -- for each room + + if expected_count and found_count < expected_count then + local diff = expected_count - found_count + local were, matches = "were", "matches" + if diff == 1 then + were, matches = "was", "match" + end -- if + mapprint ("There", were, diff, matches, + "which I could not find a path to within", + config.SCAN.depth, "rooms.") + end -- if + +end -- map_find_things + +-- executed when the mapper draws a hyperlink to a room + +function do_hyperlink (hash) + + if not check_connected () then + return + end -- if + + if not hyperlink_paths or not hyperlink_paths [hash] then + mapprint ("Hyperlink is no longer valid, as you have moved.") + return + end -- if + + local path = hyperlink_paths [hash] + if #path > 0 then + last_hyperlink_uid = path [#path].uid + end -- if + start_speedwalk (path) + +end -- do_hyperlink + +-- build a speedwalk from a path into a string + +function build_speedwalk (path) + + -- build speedwalk string (collect identical directions) + local tspeed = {} + for _, dir in ipairs (path) do + local n = #tspeed + if n == 0 then + table.insert (tspeed, { dir = dir.dir, count = 1 }) + else + if tspeed [n].dir == dir.dir then + tspeed [n].count = tspeed [n].count + 1 + else + table.insert (tspeed, { dir = dir.dir, count = 1 }) + end -- if different direction + end -- if + end -- for + + if #tspeed == 0 then + return + end -- nowhere to go (current room?) + + -- now build string like: 2n3e4(sw) + local s = "" + + for _, dir in ipairs (tspeed) do + if dir.count > 1 then + s = s .. dir.count + end -- if + if #dir.dir == 1 then + s = s .. dir.dir + else + s = s .. "(" .. dir.dir .. ")" + end -- if + s = s .. " " + end -- if + + return s + +end -- build_speedwalk + +-- start a speedwalk to a path + +function start_speedwalk (path) + + if not check_connected () then + return + end -- if + + if current_speedwalk and #current_speedwalk > 0 then + mapprint ("You are already speedwalking! (Ctrl + LH-click on any room to cancel)") + return + end -- if + + current_speedwalk = path + + if current_speedwalk then + if #current_speedwalk > 0 then + last_speedwalk_uid = current_speedwalk [#current_speedwalk].uid + + -- fast speedwalk: just send # 4s 3e etc. + if type (speedwalk_prefix) == "string" and speedwalk_prefix ~= "" then + local s = speedwalk_prefix .. " " .. build_speedwalk (path) + Execute (s) + current_speedwalk = nil + return + end -- if + + local dir = table.remove (current_speedwalk, 1) + local room = get_room (dir.uid) + walk_to_room_name = room.name + SetStatus ("Walking " .. (expand_direction [dir.dir] or dir.dir) .. + " to " .. walk_to_room_name .. + ". Speedwalks to go: " .. #current_speedwalk + 1) + Send (dir.dir) + expected_room = dir.uid + else + cancel_speedwalk () + end -- if any left + end -- if + +end -- start_speedwalk + +-- cancel the current speedwalk + +function cancel_speedwalk () + if current_speedwalk and #current_speedwalk > 0 then + mapprint "Speedwalk cancelled." + end -- if + current_speedwalk = nil + expected_room = nil + hyperlink_paths = nil + SetStatus ("Ready") +end -- cancel_speedwalk + + +-- ------------------------------------------------------------------ +-- mouse-up handlers (need to be exposed) +-- these are for clicking on the map, or the configuration box +-- ------------------------------------------------------------------ + +function mouseup_room (flags, hotspot_id) + local uid = hotspot_id + + if bit.band (flags, miniwin.hotspot_got_rh_mouse) ~= 0 then + + -- RH click + + if type (room_click) == "function" then + room_click (uid, flags) + end -- if + + return + end -- if RH click + + -- here for LH click + + -- Control key down? + if bit.band (flags, miniwin.hotspot_got_control) ~= 0 then + cancel_speedwalk () + return + end -- if ctrl-LH click + + start_speedwalk (speedwalks [uid]) + +end -- mouseup_room + +-- ------------------------------------------------------------------ +-- mouse-over handlers (need to be exposed) +-- these are for mousing over a room +-- ------------------------------------------------------------------ + +function mouseover_room (flags, hotspot_id) + if type (room_mouseover) == "function" then + room_mouseover (hotspot_id, flags) -- moused over + end -- if +end -- mouseover_room + +function cancelmouseover_room (flags, hotspot_id) + if type (room_cancelmouseover) == "function" then + room_cancelmouseover (hotspot_id, flags) -- cancled mouse over + end -- if +end -- cancelmouseover_room + +function mouseup_configure (flags, hotspot_id) + draw_configure_box = true + draw (current_room) +end -- mouseup_configure + +function mouseup_close_configure (flags, hotspot_id) + draw_configure_box = false + draw (current_room) +end -- mouseup_player + +function mouseup_change_colour (flags, hotspot_id) + + local which = string.match (hotspot_id, "^$colour:([%a%d_]+)$") + if not which then + return -- strange ... + end -- not found + + local newcolour = PickColour (config [which].colour) + + if newcolour == -1 then + return + end -- if dismissed + + config [which].colour = newcolour + + draw (current_room) +end -- mouseup_change_colour + +function mouseup_change_font (flags, hotspot_id) + + local newfont = utils.fontpicker (config.FONT.name, config.FONT.size, config.ROOM_NAME_TEXT.colour) + + if not newfont then + return + end -- if dismissed + + config.FONT.name = newfont.name + + if newfont.size > 12 then + utils.msgbox ("Maximum allowed font size is 12 points.", "Font too large", "ok", "!", 1) + else + config.FONT.size = newfont.size + end -- if + + config.ROOM_NAME_TEXT.colour = newfont.colour + + -- reload new font + WindowFont (win, FONT_ID, config.FONT.name, config.FONT.size) + WindowFont (win, FONT_ID_UL, config.FONT.name, config.FONT.size, false, false, true) + + -- see how high it is + font_height = WindowFontInfo (win, FONT_ID, 1) -- height + + draw (current_room) +end -- mouseup_change_font + + +function mouseup_change_width (flags, hotspot_id) + + local width = get_number_from_user ("Choose window width (200 to 1000 pixels)", "Width", config.WINDOW.width, 200, 1000) + + if not width then + return + end -- if dismissed + + config.WINDOW.width = width + draw (current_room) +end -- mouseup_change_width + +function mouseup_change_height (flags, hotspot_id) + + local height = get_number_from_user ("Choose window height (200 to 1000 pixels)", "Width", config.WINDOW.height, 200, 1000) + + if not height then + return + end -- if dismissed + + config.WINDOW.height = height + draw (current_room) +end -- mouseup_change_height + +function mouseup_change_depth (flags, hotspot_id) + + local depth = get_number_from_user ("Choose scan depth (3 to 100 rooms)", "Depth", config.SCAN.depth, 3, 100) + + if not depth then + return + end -- if dismissed + + config.SCAN.depth = depth + draw (current_room) +end -- mouseup_change_depth + +function mouseup_change_delay (flags, hotspot_id) + + local delay = get_number_from_user ("Choose speedwalk delay time (0 to 10 seconds)", "Delay in seconds", config.DELAY.time, 0, 10, true) + + if not delay then + return + end -- if dismissed + + config.DELAY.time = delay + draw (current_room) +end -- mouseup_change_delay + +function zoom_map (flags, hotspot_id) + + if bit.band (flags, 0x100) ~= 0 then + zoom_out () + else + zoom_in () + end -- if +end -- zoom_map + + diff --git a/cosmic rage/lua/mime.lua b/cosmic rage/lua/mime.lua new file mode 100644 index 0000000..169eda2 --- /dev/null +++ b/cosmic rage/lua/mime.lua @@ -0,0 +1,87 @@ +----------------------------------------------------------------------------- +-- MIME support for the Lua language. +-- Author: Diego Nehab +-- Conforming to RFCs 2045-2049 +-- RCS ID: $Id: mime.lua,v 1.29 2007/06/11 23:44:54 diego Exp $ +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Declare module and import dependencies +----------------------------------------------------------------------------- +local base = _G +local ltn12 = require("ltn12") +local mime = require("mime.core") +local io = require("io") +local string = require("string") +module("mime") + +-- encode, decode and wrap algorithm tables +encodet = {} +decodet = {} +wrapt = {} + +-- creates a function that chooses a filter by name from a given table +local function choose(table) + return function(name, opt1, opt2) + if base.type(name) ~= "string" then + name, opt1, opt2 = "default", name, opt1 + end + local f = table[name or "nil"] + if not f then + base.error("unknown key (" .. base.tostring(name) .. ")", 3) + else return f(opt1, opt2) end + end +end + +-- define the encoding filters +encodet['base64'] = function() + return ltn12.filter.cycle(b64, "") +end + +encodet['quoted-printable'] = function(mode) + return ltn12.filter.cycle(qp, "", + (mode == "binary") and "=0D=0A" or "\r\n") +end + +-- define the decoding filters +decodet['base64'] = function() + return ltn12.filter.cycle(unb64, "") +end + +decodet['quoted-printable'] = function() + return ltn12.filter.cycle(unqp, "") +end + +local function format(chunk) + if chunk then + if chunk == "" then return "''" + else return string.len(chunk) end + else return "nil" end +end + +-- define the line-wrap filters +wrapt['text'] = function(length) + length = length or 76 + return ltn12.filter.cycle(wrp, length, length) +end +wrapt['base64'] = wrapt['text'] +wrapt['default'] = wrapt['text'] + +wrapt['quoted-printable'] = function() + return ltn12.filter.cycle(qpwrp, 76, 76) +end + +-- function that choose the encoding, decoding or wrap algorithm +encode = choose(encodet) +decode = choose(decodet) +wrap = choose(wrapt) + +-- define the end-of-line normalization filter +function normalize(marker) + return ltn12.filter.cycle(eol, 0, marker) +end + +-- high level stuffing filter +function stuff() + return ltn12.filter.cycle(dot, 2) +end diff --git a/cosmic rage/lua/movewindow.lua b/cosmic rage/lua/movewindow.lua new file mode 100644 index 0000000..8e10b13 --- /dev/null +++ b/cosmic rage/lua/movewindow.lua @@ -0,0 +1,410 @@ +-- movewindow.lua + +--[[ + +Miniwindow drag-to-move functions. + +Author: Nick Gammon +Date: 15th July 2009 +Modified: 16th November 2010 to add preprocessing +Modified: 29th November 2010 by Fiendish to improve dragging offscreen +Modified: 8th February 2018 by Nick to remember the flags setting (eg. absolute position) + +This module is intended to make it easier to add drag handlers for miniwindows. + +It implements the following: + + -- find previous location + nocheck: if true, don't check if offscreen (boolean) + friends: other windows to move with this one (table) + preprocess: preprocessing for mousedown, mouseup etc. (table) + + Handler names for preprocess table: + + mousedown + mouseup + mouseover + cancelmouseover + cancelmousedown + dragmove + dragrelease + + If any preprocess handler returns true (that is, neither nil nor false) then the default handler + in this module is not used. (The miniwindow name is the third argument) + + function mousedown (flags, id, win) + if bit.band (flags, miniwin.hotspot_got_rh_mouse) then + -- do something different here + return true + end -- if + + return false -- take normal movewindow behaviour + end -- mousedown + + windowinfo = movewindow.install (win, default_position, default_flags, nocheck, friends, preprocess) + + movewindow.add_drag_handler (win, left, top, right, bottom, cursor) -- add a drag handler for the nominated rectangle + + movewindow.save_state (win) -- saves the miniwindow location to the appropriate variables + +It also installs a position-checker that moves the miniwindow into view after 5 seconds, in case +you resize the main world window, and the window is no longer visible. The 5 seconds are to give +the main world window's position and size time to stabilize. (Unless nocheck is true) + + +Example of use: + + require "movewindow" -- pull in this module + + + -- CREATE WINDOW in OnPluginInstall + + win = GetPluginID () -- miniwindow ID + + windowinfo = movewindow.install (win, miniwin.pos_center_right, 0) -- default position / flags + + -- make miniwindow (use locations returned from last time we saved the state) + -- note that the width and height are not part of the window position info, and can thus change as required + + WindowCreate (win, + windowinfo.window_left, + windowinfo.window_top, + WINDOW_WIDTH, + WINDOW_HEIGHT, + windowinfo.window_mode, + windowinfo.window_flags, + ColourNameToRGB "slategray") + + + + -- INSTALL DRAG HANDLER when required (eg. when drawing stuff to window) + -- in this case we use 0,0,0,0 as the rectangle (ie. the whole window) + -- typically the height would be the size of the title bar + + movewindow.add_drag_handler (win, 0, 0, 0, 0, miniwin.cursor_both_arrow) + + -- SAVE STATE in OnPluginSaveState + + movewindow.save_state (win) + + + The module makes one global variable (table) when installed. This is named: + + mw__movewindow_info + + + This contains handler functions (the table is an upvalue to the functions) + + "check_map_position"=function: 023D9368 -- the position checker + "dragmove"=function: 01AD1158 -- the dragmove handler + "dragrelease"=function: 023E4238 -- the dragrelease handler + "margin"=20 -- margin for dragging offscreen + "mousedown"=function: 01AD1108 -- the mousedown handler + "origx"=648 -- used during dragging + "origy"=39 + "startx"=88 + "starty"=8 + "win"="23c3c91af0a26790c625f5d1" -- the supplied window ID + "window_flags"=2 -- flags (eg. 2, absolute position) + "window_left"=652 -- current left location + "window_mode"=0 -- window mode + "window_top"=31 -- current top location + + + This table is returned from movewindow.install so you can find where to put the + window the first time it is created. + +--]] + +movewindow = {} -- table to hold functions like movewindow.install + +-- make a mouse-down handler with the movement information as an upvalue + +local function make_mousedown_handler (mwi) + + return function (flags, hotspot_id) + + local win = mwi.win + + -- see if other action wanted + if mwi.preprocess.mousedown then + if mwi.preprocess.mousedown (flags, hotspot_id, win) then + return + end -- if handled already + end -- if handler + + -- find where mouse is so we can adjust window relative to mouse + mwi.startx = WindowInfo (win, 14) + mwi.starty = WindowInfo (win, 15) + + -- find where window is in case we drag it offscreen + mwi.origx = WindowInfo (win, 10) + mwi.origy = WindowInfo (win, 11) + + -- find where the friends are relative to the window + for i, v in ipairs (mwi.window_friends) do + if v then + mwi.window_friend_deltas [i] = + { + WindowInfo (v, 10) - mwi.origx, + WindowInfo (v, 11) - mwi.origy + } + end -- if + end -- for + + end -- mousedown + +end -- make_mousedown_handler + +-- make a mouse drag-move handler with the movement information as an upvalue + +local function make_dragmove_handler (mwi) + + return function (flags, hotspot_id) + + local win = mwi.win + + -- see if other action wanted + if mwi.preprocess.dragmove then + if mwi.preprocess.dragmove (flags, hotspot_id, win) then + return + end -- if handled already + end -- if handler + + -- find where it is now + local posx, posy = WindowInfo (win, 17) - mwi.startx, + WindowInfo (win, 18) - mwi.starty + + -- change the mouse cursor shape appropriately + if posx < 0 or + posx > GetInfo (281) - mwi.margin or + posy < 0 or -- don't drag title out of view + posy > GetInfo (280) - mwi.margin then + SetCursor (miniwin.cursor_x) -- X cursor + else + SetCursor (miniwin.cursor_hand) -- hand cursor + end -- if + + if posx < 0 then + posx = 0 + elseif posx > GetInfo (281) - mwi.margin then + posx = GetInfo(281) - mwi.margin + end + if posy < 0 then + posy = 0 + elseif posy > GetInfo(280) - mwi.margin then + posy = GetInfo(280) - mwi.margin + end + + -- move the window to the new location - offset by how far mouse was into window + WindowPosition(win, posx, posy, 0, miniwin.create_absolute_location); + + -- move the friends if they still exist + for i, v in ipairs(mwi.window_friends) do + if v then + WindowPosition (v, posx + mwi.window_friend_deltas [i] [1], + posy + mwi.window_friend_deltas [i] [2], + 0, + WindowInfo (v, 8)) + end -- if + end -- for + + mwi.window_left = posx -- remember for saving state + mwi.window_top = posy + mwi.window_mode = 0 + mwi.window_flags = miniwin.create_absolute_location -- absolute position + + end -- dragmove + +end -- make_dragmove_handler + +-- make a mouse drag-release handler with the movement information as an upvalue + +local function make_dragrelease_handler (mwi) + + return function (flags, hotspot_id) + + local win = mwi.win + + -- see if other action wanted + if mwi.preprocess.dragrelease then + if mwi.preprocess.dragrelease (flags, hotspot_id, win) then + return + end -- if handled already + end -- if handler + + Repaint () -- update window location + + end -- dragrelease + +end -- make_dragrelease_handler + +-- make other handler with the movement information as an upvalue + +local function make_other_handler (mwi, name) + + return function (flags, hotspot_id) + + -- send to supplied handler + if mwi.preprocess [name] then + mwi.preprocess [name] (flags, hotspot_id, mwi.win) + end -- if handler + + end -- other + +end -- make_other_handler + +-- make a mouse position-checking function with the movement information as an upvalue + +local function make_check_map_position_handler (mwi) + + return function () + + local win = mwi.win + + if not WindowInfo (win, 1) then + ColourNote ("white", "red", "Error in make_check_map_position_handler: no window named: " .. win) + return + end -- no such window + + -- check miniwindow visible + if mwi.window_left < 0 or + mwi.window_left > GetInfo (281) - mwi.margin or + mwi.window_top < 0 or -- don't drag title out of view + mwi.window_top > GetInfo (280) - mwi.margin then + mwi.window_mode = miniwin.pos_center_right + mwi.window_flags = 0 + end -- if not visible + + WindowPosition (win, + mwi.window_left, + mwi.window_top, + mwi.window_mode, + mwi.window_flags) + + end -- check_map_position + +end -- make_check_map_position_handler + +-- call movewindow.install in OnPluginInstall to find the position of the window, before creating it +-- - it also creates the handler functions ready for use later + +function movewindow.install (win, default_position, default_flags, nocheck, friends, preprocess, start_position) + + win = win or GetPluginID () -- default to current plugin ID + + assert (not string.match (win, "[^A-Za-z0-9_]"), "Invalid window name in movewindow.install: " .. win) + + default_position = default_position or miniwin.pos_center_right -- on right, center top/bottom + default_flags = default_flags or 0 + + -- set up handlers and where window should be shown (from saved state, if any) + local movewindow_info = { + win = win, -- save window ID + + -- save current position in table (obtained from state file) + window_left = tonumber (GetVariable ("mw_" .. win .. "_windowx")) or (start_position and start_position.x) or 0, + window_top = tonumber (GetVariable ("mw_" .. win .. "_windowy")) or (start_position and start_position.y) or 0, + window_mode = default_position, + window_flags = tonumber (GetVariable ("mw_" .. win .. "_windowflags")) or default_flags, + window_friends = friends or {}, + window_friend_deltas = {}, + margin = 20, -- how close we can put to the edge of the window + preprocess = preprocess or {}, + } + + -- check valid + for k, v in pairs (movewindow_info.preprocess) do + assert (type (v) == "function", "Handler '" .. k .. "' is not a function") + end -- for + + -- handler to reposition window + movewindow_info.check_map_position = make_check_map_position_handler (movewindow_info) -- for startup + + -- mouse handlers + movewindow_info.mousedown = make_mousedown_handler (movewindow_info) + movewindow_info.mouseup = make_other_handler (movewindow_info, "mouseup") + movewindow_info.mouseover = make_other_handler (movewindow_info, "mouseover") + movewindow_info.cancelmouseover = make_other_handler (movewindow_info, "cancelmouseover") + movewindow_info.cancelmousedown = make_other_handler (movewindow_info, "cancelmousedown") + movewindow_info.dragmove = make_dragmove_handler (movewindow_info) + movewindow_info.dragrelease = make_dragrelease_handler (movewindow_info) + + -- save table in global namespace + _G ["mw_" .. win .. "_movewindow_info"] = movewindow_info + + + -- give main world window time to stabilize its size and position + -- eg. this might be: mw_23c3c91af0a26790c625f5d1_movewindow_info.check_map_position () + + if not nocheck then -- if wanted + DoAfterSpecial (5, "mw_" .. win .. "_movewindow_info.check_map_position ()" , sendto.script) + end -- if + + return movewindow_info -- the caller might appreciate access to this table +end -- movewindow.install + +-- call movewindow.add_drag_handler after creating the window, and after deleting hotspots where applicable +-- to add a drag hotspot + +function movewindow.add_drag_handler (win, left, top, right, bottom, cursor) + + win = win or GetPluginID () -- default to current plugin ID + + -- the zz puts it under other hotspots on the drag area + local hotspot_id = "zz_mw_" .. win .. "_movewindow_hotspot" + + if not WindowInfo (win, 1) then + ColourNote ("white", "red", "Error in movewindow.add_drag_handler: no window named: " .. win) + return + end -- no such window + + -- make a hotspot + WindowAddHotspot(win, hotspot_id, + left or 0, top or 0, right or 0, bottom or 0, -- rectangle + "mw_" .. win .. "_movewindow_info.mouseover", -- MouseOver + "mw_" .. win .. "_movewindow_info.cancelmouseover", -- CancelMouseOver + "mw_" .. win .. "_movewindow_info.mousedown", -- MouseDown + "mw_" .. win .. "_movewindow_info.cancelmousedown", -- CancelMouseDown + "mw_" .. win .. "_movewindow_info.mouseup", -- MouseUp + "Drag to move window", -- tooltip text + cursor or miniwin.cursor_hand, -- cursor + 0) -- flags + + WindowDragHandler (win, hotspot_id, + "mw_" .. win .. "_movewindow_info.dragmove", + "mw_" .. win .. "_movewindow_info.dragrelease", + 0) -- flags + +end -- movewindow.add_drag_handler + +-- call movewindow.save_state in OnPluginSaveState + +function movewindow.save_state (win) + + win = win or GetPluginID () -- default to current plugin ID + + -- get movewindow variable from global namespace + local mwi = _G ["mw_" .. win .. "_movewindow_info"] + + if not mwi then + ColourNote ("white", "red", "Error in movewindow.save_state: no window movement info for: " .. win) + return + end -- no such window + + -- remember where the window was + + -- use actual last specified position, not where we happen to think it is, in case another plugin moves it + -- suggested by Fiendish, 27 August 2012. + if WindowInfo (win, 1) then + mwi.window_left = WindowInfo(win, 1) + end + if WindowInfo (win, 2) then + mwi.window_top = WindowInfo(win, 2) + end + + SetVariable ("mw_" .. win .. "_windowx", mwi.window_left) + SetVariable ("mw_" .. win .. "_windowy", mwi.window_top) + SetVariable ("mw_" .. win .. "_windowflags", mwi.window_flags) + +end -- movewindow.save_state diff --git a/cosmic rage/lua/mw.lua b/cosmic rage/lua/mw.lua new file mode 100644 index 0000000..1b4c510 --- /dev/null +++ b/cosmic rage/lua/mw.lua @@ -0,0 +1,480 @@ +-- mw.lua + +-- Helper functions for miniwindows +-- + +-- Author: Nick Gammon - 8th September 2008 + +--[[ + +Exposed functions are: + + mw.colourtext - show a string with imbedded colour codes + mw.colour_conversion - table with colour codes in it - add more if you want + mw.strip_colours - remove colour codes from a string + mw.popup - make a popup window + mw.tooltip - make a tooltip window + + EXAMPLE OF MAKING A POPUP WINDOW: + + require "mw" + + + -- SET UP FOR POPUP WINDOWS - define colours, add fonts, make window id + -- (DO THIS ONCE ONLY, eg. in OnPluginInstall) + + -- our window frame/background colours + border_colour = 0xCCD148 + background_colour = 0x222222 + + -- a unique ID + infowin = GetPluginID () .. ":info" + + -- font IDs + font_id = "popup_font" + heading_font_id = "popup_heading_font" + + font_size = 8 + + -- use 8 pt Dina or 10 pt Courier + local fonts = utils.getfontfamilies () + + -- choose a font that exists + + if fonts.Dina then + font_name = "Dina" + elseif fonts ["Lucida Sans Unicode"] then + font_name = "Lucida Sans Unicode" + else + font_size = 10 + font_name = "Courier" + end -- if + + -- load fonts + WindowCreate (infowin, 0, 0, 0, 0, 0, 0, 0) -- make initial window + + -- install the fonts + WindowFont (infowin, font_id, font_name, font_size, false, false, false, false, + miniwin.font_charset_ansi, + miniwin.font_family_modern + miniwin.font_pitch_fixed) + WindowFont (infowin, heading_font_id, font_name, font_size + 2, false, false, false, false, + miniwin.font_charset_ansi, + miniwin.font_family_modern + miniwin.font_pitch_fixed) + + -- NOW DISPLAY A WINDOW + + -- what to say - one line per table entry, with imbedded colour codes + + info = { "@Ctesting 1 2 3", + "@GThis is a heading", + "Line @Mwith @Bmultiple @Rcolours", + } + + heading = "@MHello, @Yworld" + left, top = 40, 50 + align_right = false + align_bottom = false + capitalize = true + + -- show it + mw.popup (infowin, -- window name to use + heading_font_id, -- font to use for the heading + font_id, -- font to use for each line + heading, -- heading text + info, -- table of lines to show (with colour codes) + left, top, -- where to put it + border_colour, -- colour for round rectangle line + background_colour, -- colour for background + capitalize, -- if true, force the first letter to upper case + align_right, -- if true, align right side on "Left" parameter + align_bottom) -- if true, align bottom side on "Top" parameter + + + EXAMPLE OF MAKING A TOOLTIP WINDOW: + + -- SET UP FOR TOOLTIP WINDOWS - define colours, add fonts, make window id + -- (DO THIS ONCE ONLY, eg. in OnPluginInstall) + + -- Example setup code: + require "mw" + -- get ready for tooltips + win_tooltip = GetPluginID () .. "_tooltip" + font_tooltip = "tf" + bold_font_tooltip = "tfb" + -- make the window + WindowCreate (win_tooltip, 0, 0, 0, 0, 0, 0, 0) + -- load some fonts into it + WindowFont (win_tooltip, font_tooltip, "Tahoma", 8) + WindowFont (win_tooltip, bold_font_tooltip, "Tahoma", 8, true) + + -- NOW DISPLAY A tooltip (Put bold lines inside asterisks) + + mw.tooltip (win_tooltip, -- window name to use + font_tooltip, -- font to use for each line + bold_font_tooltip, -- bold font + "*Info*\nHello, world!\nHave fun.", -- tooltip text + 45, 75, -- where to put it (x, y) + 0, -- colour for text (black) + 0, -- colour for border (black) + ColourNameToRGB ("#FFFFE1")) -- colour for background + +--]] + +module (..., package.seeall) + +DEFAULT_COLOUR = "@w" +TRANSPARENCY_COLOUR = 0x080808 +BORDER_WIDTH = 2 + +local BLACK = 1 +local RED = 2 +local GREEN = 3 +local YELLOW = 4 +local BLUE = 5 +local MAGENTA = 6 +local CYAN = 7 +local WHITE = 8 + +-- colour styles (eg. @r is normal red, @R is bold red) + +-- @- is shown as ~ +-- @@ is shown as @ + +-- This table uses the colours as defined in the MUSHclient ANSI tab, however the +-- defaults are shown on the right if you prefer to use those. + +colour_conversion = { + k = GetNormalColour (BLACK) , -- 0x000000 + r = GetNormalColour (RED) , -- 0x000080 + g = GetNormalColour (GREEN) , -- 0x008000 + y = GetNormalColour (YELLOW) , -- 0x008080 + b = GetNormalColour (BLUE) , -- 0x800000 + m = GetNormalColour (MAGENTA) , -- 0x800080 + c = GetNormalColour (CYAN) , -- 0x808000 + w = GetNormalColour (WHITE) , -- 0xC0C0C0 + K = GetBoldColour (BLACK) , -- 0x808080 + R = GetBoldColour (RED) , -- 0x0000FF + G = GetBoldColour (GREEN) , -- 0x00FF00 + Y = GetBoldColour (YELLOW) , -- 0x00FFFF + B = GetBoldColour (BLUE) , -- 0xFF0000 + M = GetBoldColour (MAGENTA) , -- 0xFF00FF + C = GetBoldColour (CYAN) , -- 0xFFFF00 + W = GetBoldColour (WHITE) , -- 0xFFFFFF + + -- add custom colours here + + + } -- end conversion table + + + +-- displays text with colour codes imbedded +-- +-- win: window to use +-- font_id : font to use +-- Text : what to display +-- Left, Top, Right, Bottom : where to display it +-- Capitalize : if true, turn the first letter into upper-case + +function colourtext (win, font_id, Text, Left, Top, Right, Bottom, Capitalize, utf8) + + if Text:match ("@") then + local x = Left -- current x position + local need_caps = Capitalize + + Text = Text:gsub ("@%-", "~") -- fix tildes + Text = Text:gsub ("@@", "\0") -- change @@ to 0x00 + + -- make sure we start with @ or gsub doesn't work properly + if Text:sub (1, 1) ~= "@" then + Text = DEFAULT_COLOUR .. Text + end -- if + + for colour, text in Text:gmatch ("@(%a)([^@]+)") do + text = text:gsub ("%z", "@") -- put any @ characters back + + if need_caps then + local count + text, count = text:gsub ("%a", string.upper, 1) + need_caps = count == 0 -- if not done, still need to capitalize yet + end -- if + + if #text > 0 then + x = x + WindowText (win, font_id, text, x, Top, Right, Bottom, + colour_conversion [colour] or GetNormalColour (WHITE), utf8) + end -- some text to display + + end -- for each colour run + + return x + end -- if + + + if Capitalize then + Text = Text:gsub ("%a", string.upper, 1) + end -- if leading caps wanted + + return WindowText (win, font_id, Text, Left, Top, Right, Bottom, + colour_conversion [DEFAULT_COLOUR] or GetNormalColour (WHITE)) + +end -- colourtext + +-- converts text with colour styles in it into style runs + +function ColoursToStyles (Text) + + if Text:match ("@") then + + astyles = {} + + Text = Text:gsub ("@%-", "~") -- fix tildes + Text = Text:gsub ("@@", "\0") -- change @@ to 0x00 + + -- make sure we start with @ or gsub doesn't work properly + if Text:sub (1, 1) ~= "@" then + Text = DEFAULT_COLOUR .. Text + end -- if + + for colour, text in Text:gmatch ("@(%a)([^@]+)") do + + text = text:gsub ("%z", "@") -- put any @ characters back + + if #text > 0 then + table.insert (astyles, { text = text, + length = #text, + textcolour = colour_conversion [colour] or GetNormalColour (WHITE), + backcolour = GetNormalColour (BLACK) }) + end -- if some text + end -- for each colour run. + + return astyles + + end -- if any colour codes at all + + -- No colour codes, create a single style. + return { { text = Text, + length = #Text, + textcolour = GetNormalColour (WHITE), + backcolour = GetNormalColour (BLACK) } } + +end -- function ColoursToStyles + +-- take a string, and remove colour codes from it (eg. "@Ghello" becomes "hello" +function strip_colours (s) + s = s:gsub ("@%-", "~") -- fix tildes + s = s:gsub ("@@", "\0") -- change @@ to 0x00 + s = s:gsub ("@%a([^@]*)", "%1") + return (s:gsub ("%z", "@")) -- put @ back +end -- strip_colours + + +function popup (win, -- window name to use + heading_font_id, -- font to use for the heading + font_id, -- font to use for each line + heading, -- heading text + info, -- table of lines to show (with colour codes) + Left, Top, -- where to put it + border_colour, -- colour for round rectangle line + background_colour, -- colour for background + capitalize, -- if true, force the first letter to be upper case + align_right, -- if true, align right side on "Left" parameter + align_bottom) -- if true, align bottom side on "Top" parameter + + assert (WindowInfo (win, 1), "Window " .. win .. " must already exist") + assert (WindowFontInfo (win, heading_font_id, 1), "No font " .. heading_font_id .. " in " .. win) + assert (WindowFontInfo (win, font_id, 1), "No font " .. font_id .. " in " .. win) + + local font_height = WindowFontInfo (win, font_id, 1) + local font_leading = WindowFontInfo (win, font_id, 4) + WindowFontInfo (win, font_id, 5) + local heading_font_height = WindowFontInfo (win, heading_font_id, 1) + + -- find text width - minus colour codes + local infowidth = 0 + local infoheight = 0 + + -- calculate heading width and height + if heading and #heading > 0 then + infowidth = WindowTextWidth (win, heading_font_id, strip_colours (heading)) + infoheight = heading_font_height + end -- have a heading + + -- calculate remaining width and height + for _, v in ipairs (info) do + infowidth = math.max (infowidth, WindowTextWidth (win, font_id, strip_colours (v))) + infoheight = infoheight + font_height + end -- for + + infowidth = infowidth + (2 * BORDER_WIDTH) + -- leave room for border + WindowFontInfo (win, font_id, 6) -- one character width extra + + infoheight = infoheight + (2 * BORDER_WIDTH) + -- leave room for border + font_leading + -- plus leading below bottom line, + 10 -- and 5 pixels top and bottom + + if align_right then + Left = Left - infowidth + end -- if align_right + + if align_bottom then + Top = Top - infoheight + end -- if align_bottom + + WindowCreate (win, + Left, Top, -- where + infowidth, -- width (gap of 5 pixels per side) + infoheight, -- height + miniwin.pos_top_left, -- position mode: can't be 0 to 3 + miniwin.create_absolute_location + miniwin.create_transparent, + TRANSPARENCY_COLOUR) -- background (transparent) colour + + WindowCircleOp (win, miniwin.circle_round_rectangle, + BORDER_WIDTH, BORDER_WIDTH, -BORDER_WIDTH, -BORDER_WIDTH, -- border inset + border_colour, miniwin.pen_solid, BORDER_WIDTH, -- line + background_colour, miniwin.brush_solid, -- fill + 5, 5) -- diameter of ellipse + + local x = BORDER_WIDTH + WindowFontInfo (win, font_id, 6) / 2 -- start 1/2 character in + local y = BORDER_WIDTH + 5 -- skip border, and leave 5 pixel gap + + -- heading if wanted + if heading and #heading > 0 then + colourtext (win, heading_font_id, heading, x, y, 0, 0, capitalize) + y = y + heading_font_height + end -- have a heading + + -- show each line + for _, v in ipairs (info) do + colourtext (win, font_id, v, x, y, 0, 0, capitalize) + y = y + font_height + end -- for + + -- display popup window + WindowShow (win, true) + +end -- popup + +-- -------------------------------------------------------------- +-- Displays a tooltip (small box with "arrow" pointing to something of interest) +-- Bold lines are surrounded by asterisks (eg. *Info*) +-- -------------------------------------------------------------- +function tooltip (win, -- window name to use + font_id, -- font to use for each line + bold_font_id, -- font to use for bold lines + text, -- tooltip text + Left, Top, -- where to put it (x, y) + text_colour, -- colour for text + border_colour, -- colour for border + background_colour) -- colour for background + + assert (WindowInfo (win, 1), "Window " .. win .. " must already exist") + assert (WindowFontInfo (win, font_id, 1), "No font " .. font_id .. " in " .. win) + assert (WindowFontInfo (win, bold_font_id, 1), "No font " .. bold_font_id .. " in " .. win) + local font_height = WindowFontInfo (win, font_id, 1) + local bold_font_height = WindowFontInfo (win, bold_font_id, 1) + local MARGIN = 8 + local TIPSIZE = 12 + + -- break text into lines + local t = utils.split (text, "\n") + + -- tooltip height + local height = MARGIN * 2 -- margin at top and bottom + -- tooltip width + local width = TIPSIZE * 2 -- must be at least large enough for the tip part + for k, v in ipairs (t) do + -- bold lines start and end with an asterisk + local boldText = string.match (v, "^%*(.*)%*$") + if boldText then + width = math.max (width, WindowTextWidth (win, bold_font_id, boldText, true)) + height = height + bold_font_height + else + width = math.max (width, WindowTextWidth (win, font_id, v, true)) + height = height + font_height + end -- if + end -- for + width = width + (MARGIN * 2) -- margin per side + + -- the tooltip pointer starts TIPSIZE pixels to the right and descends TIPSIZE pixels + WindowCreate (win, + Left - TIPSIZE, Top - height - TIPSIZE, + width + 2, height + TIPSIZE + 2, -- 2 pixels margin to allow for border + TIPSIZE downwards for the tip + miniwin.pos_top_left, -- position + miniwin.create_absolute_location + miniwin.create_transparent + miniwin.create_ignore_mouse, + TRANSPARENCY_COLOUR) + + -- mucking around here to get rounded rectangle + local points = { + -- top LH corner + 1, 6, + 2, 6, + 2, 4, + 3, 4, + 3, 3, + 4, 3, + 4, 2, + 6, 2, + 6, 1, + + -- top RH corner + width - 5, 1, + width - 5, 2, + width - 3, 2, + width - 3, 3, + width - 2, 3, + width - 2, 4, + width - 1, 4, + width - 1, 6, + width, 6, + + -- bottom RH corner + width, height - 5, + width - 1, height - 5, + width - 1, height - 3, + width - 2, height - 3, + width - 2, height - 2, + width - 3, height - 2, + width - 3, height - 1, + width - 5, height - 1, + width - 5, height, + + (TIPSIZE * 2) + 1, height, -- RH side of tip + TIPSIZE + 1, height + TIPSIZE, -- bottom of tip + TIPSIZE + 1, height, -- LH side of tip + + -- bottom LH corner + 6, height, + 6, height - 1, + 4, height - 1, + 4, height - 2, + 3, height - 2, + 3, height - 3, + 2, height - 3, + 2, height - 5, + 1, height - 5, + } + + -- make the tooltip polygon + WindowPolygon(win, table.concat (points, ","), + border_colour, -- pen colour + miniwin.pen_solid, 1, -- pen (1 pixel wide) + background_colour, -- brush colour + miniwin.brush_solid, -- brush + true) -- close it + + -- put the text into it + local top = MARGIN + 1 + for _, v in ipairs (t) do + -- bold lines start and end with an asterisk + local boldText = string.match (v, "^%*(.*)%*$") + if boldText then + WindowText (win, bold_font_id, boldText, MARGIN + 1, top, 0, 0, text_colour, true) + top = top + bold_font_height + else + WindowText (win, font_id, v, MARGIN + 1, top, 0, 0, text_colour, true) + top = top + font_height + end -- if + end -- for + + WindowShow (win, true) + +end -- tooltip \ No newline at end of file diff --git a/cosmic rage/lua/pairsbykeys.lua b/cosmic rage/lua/pairsbykeys.lua new file mode 100644 index 0000000..72b9a4c --- /dev/null +++ b/cosmic rage/lua/pairsbykeys.lua @@ -0,0 +1,43 @@ +-- pairsbykeys.lua +-- From Programming in Lua book, 2nd edition +-- Gives you an iterator that moves through an ordinary table (eg. string keys) +-- but sorted into key sequence. +-- It does that by copying the table keys into a temporary table and sorting that. + +-- If you need to sort keys other than strings, see: + +-- See: http://lua-users.org/wiki/SortedIteration + +function pairsByKeys (t, f) + local a = {} + -- build temporary table of the keys + for n in pairs (t) do + table.insert (a, n) + end + table.sort (a, f) -- sort using supplied function, if any + local i = 0 -- iterator variable + return function () -- iterator function + i = i + 1 + return a[i], t[a[i]] + end -- iterator function +end -- pairsByKeys + +return pairsByKeys + +--[[ + + + -- This prints the math functions in random order + for k, v in pairs (math) do + print (k, v) + end -- for + + require "pairsbykeys" + + -- This prints the math functions in key order + for k, v in pairsByKeys (math) do + print (k, v) + end -- for + + --]] + \ No newline at end of file diff --git a/cosmic rage/lua/ppi.lua b/cosmic rage/lua/ppi.lua new file mode 100644 index 0000000..8d122ce --- /dev/null +++ b/cosmic rage/lua/ppi.lua @@ -0,0 +1,170 @@ +--[[ + +PLUGIN-to-PLUGIN-INTERFACE (PPI) + +Author: Twisol +Date: 3rd January 2010 + +Amendments: Nick Gammon +Date: 8th January 2010 + +Example of use: + +SERVICE + +-- require PPI module +require "ppi" + +-- exposed function +function SomeMethodHere (a, b, c, d) + -- do something with a, b, c, d + return 1, 2, 3, 4 +end + +-- notify PPI of this function +ppi.Expose "SomeMethodHere" + +-- Or, for anonymous functions: +ppi.Expose ("DoSomethingElse", function () print "hello" end) + +CLIENT + +-- require PPI module +require "ppi" + +-- resolve dependencies +function OnPluginListChanged () + + -- get PPI entries for all exposed function in this plugin + my_service = ppi.Load ("15783160bde378741f9652d1") -- plugin ID of service plugin + + if not my_service then + Note ("Dependency plugin not installed!") + end + +end -- OnPluginListChanged + +-- later on in plugin ... + +-- call SomeMethodHere in other plugin, passing various data types, getting results + +if my_service then + w, x, y, z = my_service.SomeMethodHere (42, "Nick", true, { a = 63, b = 22 } ) +end -- if service installed + +NOTES +----- + +ppi.Load returns a table with various values in it about the target plugin (see below +for what they are). For example, _name is the plugin name of the target plugin, and +_version is the version number of that plugin. + +If ppi.Load returns no value (effectively, nil) then the target plugin was not installed. + +Provided a non-nil result was returned, you can then call any exposed function in the +target plugin. There is currently no mechanism for finding what functions are exposed, for +simplicity's sake. However it would be possible to make a service function that returned all +exposed functions. If service plugins evolve in functionality, checking the target plugin's +version (the _version variable) should suffice for making sure plugins are synchronized. + +To avoid clashes in variable names, you cannot expose a function starting with an underscore. + +Communication with the target plugin is by global variables set up by the Expose function, along +the lines of: + +PPI_function_name_PPI_ (one for each exposed function) + +Also: + +PPI__returns__PPI_ is used for storing the returned values. + +--]] + +-- hide all except non-local variables +module (..., package.seeall) + +-- for transferring variables +require "serialize" + +-- PPI version +local V_MAJOR, V_MINOR, V_PATCH = 1, 1, 0 +local VERSION = string.format ("%d.%d.%d", V_MAJOR, V_MINOR, V_PATCH) + +-- called plugin uses this variable to store returned values +local RETURNED_VALUE_VARIABLE = "PPI__returns__PPI_" + +-- For any function in our PPI table, try to call that in the target plugin +local PPI_meta = { + __index = function (tbl, idx) + if (idx:sub (1, 1) ~= "_") then + return function(...) + -- Call the method in the target plugin + local status = CallPlugin (tbl._id, "PPI_" .. idx .. "_PPI_", serialize.save_simple {...}) + + -- explain a bit if we failed + if status ~= error_code.eOK then + ColourNote ("white", "red", "Error calling " .. idx .. + " in plugin " .. tbl._name .. + " using PPI from " .. GetPluginName () .. + " (" .. error_desc [status] .. ")") + check (status) + end -- if + + -- call succeeded, get any returned values + local returns = {} -- table of returned values + local s = GetPluginVariable(tbl._id, RETURNED_VALUE_VARIABLE) or "{}" + local f = assert (loadstring ("t = " .. s)) -- convert serialized data back + setfenv (f, returns) () -- load the returned values into 'returns' + + -- unpack returned values to caller + return unpack (returns.t) + end -- generated function + end -- not starting with underscore + end -- __index function +} -- end PPI_meta table + +-- PPI request resolver +local function PPI_resolver (func) + return function (s) -- calling plugin serialized parameters into a single string argument + local params = {} -- table of parameters + local f = assert (loadstring ("t = " .. s)) -- convert serialized data back + setfenv (f, params) () -- load the parameters into 'params' + + -- call target function, get return values, serialize back into variable + SetVariable(RETURNED_VALUE_VARIABLE, serialize.save_simple {func(unpack (params.t))}) + end -- generated function + +end -- PPI_resolver + +-- EXPOSED FUNCTIONS + +-- We "load" a plugin by checking it exists, and creating a table saving the +-- target plugin ID etc., and have a metatable which will handle function calls +function Load (plugin_id) + if IsPluginInstalled (plugin_id) then + return setmetatable ( + { _id = plugin_id, -- so we know which plugin to call + _name = GetPluginInfo (plugin_id, 1), + _author = GetPluginInfo (plugin_id, 2), + _filename = GetPluginInfo (plugin_id, 6), + _enabled = GetPluginInfo (plugin_id, 17), + _version = GetPluginInfo (plugin_id, 18), + _required_version = GetPluginInfo (plugin_id, 19), + _directory = GetPluginInfo (plugin_id, 20), + _PPI_V_MAJOR = V_MAJOR, -- version info + _PPI_V_MINOR = V_MINOR, + _PPI_V_PATCH = V_PATCH, + _PPI_VERSION = VERSION, + }, + PPI_meta) -- everything except the above will generate functions + else + return nil, "Plugin ID " .. plugin_id .. " not installed" -- in case you assert + end -- if +end -- function Load + +-- Used by a plugin to expose methods to other plugins +-- Each exposed function will be added to global namespace as PPI__PPI_ +function Expose (name, func) + assert (type (func or _G [name]) == "function", "Function " .. name .. " does not exist.") + _G ["PPI_" .. name .. "_PPI_"] = PPI_resolver (func or _G [name]) +end -- function Expose diff --git a/cosmic rage/lua/re.lua b/cosmic rage/lua/re.lua new file mode 100644 index 0000000..3b9974f --- /dev/null +++ b/cosmic rage/lua/re.lua @@ -0,0 +1,259 @@ +-- $Id: re.lua,v 1.44 2013/03/26 20:11:40 roberto Exp $ + +-- imported functions and modules +local tonumber, type, print, error = tonumber, type, print, error +local setmetatable = setmetatable +local m = require"lpeg" + +-- 'm' will be used to parse expressions, and 'mm' will be used to +-- create expressions; that is, 're' runs on 'm', creating patterns +-- on 'mm' +local mm = m + +-- pattern's metatable +local mt = getmetatable(mm.P(0)) + + + +-- No more global accesses after this point +local version = _VERSION +if version == "Lua 5.2" then _ENV = nil end + + +local any = m.P(1) + + +-- Pre-defined names +local Predef = { nl = m.P"\n" } + + +local mem +local fmem +local gmem + + +local function updatelocale () + mm.locale(Predef) + Predef.a = Predef.alpha + Predef.c = Predef.cntrl + Predef.d = Predef.digit + Predef.g = Predef.graph + Predef.l = Predef.lower + Predef.p = Predef.punct + Predef.s = Predef.space + Predef.u = Predef.upper + Predef.w = Predef.alnum + Predef.x = Predef.xdigit + Predef.A = any - Predef.a + Predef.C = any - Predef.c + Predef.D = any - Predef.d + Predef.G = any - Predef.g + Predef.L = any - Predef.l + Predef.P = any - Predef.p + Predef.S = any - Predef.s + Predef.U = any - Predef.u + Predef.W = any - Predef.w + Predef.X = any - Predef.x + mem = {} -- restart memoization + fmem = {} + gmem = {} + local mt = {__mode = "v"} + setmetatable(mem, mt) + setmetatable(fmem, mt) + setmetatable(gmem, mt) +end + + +updatelocale() + + + +local I = m.P(function (s,i) print(i, s:sub(1, i-1)); return i end) + + +local function getdef (id, defs) + local c = defs and defs[id] + if not c then error("undefined name: " .. id) end + return c +end + + +local function patt_error (s, i) + local msg = (#s < i + 20) and s:sub(i) + or s:sub(i,i+20) .. "..." + msg = ("pattern error near '%s'"):format(msg) + error(msg, 2) +end + +local function mult (p, n) + local np = mm.P(true) + while n >= 1 do + if n%2 >= 1 then np = np * p end + p = p * p + n = n/2 + end + return np +end + +local function equalcap (s, i, c) + if type(c) ~= "string" then return nil end + local e = #c + i + if s:sub(i, e - 1) == c then return e else return nil end +end + + +local S = (Predef.space + "--" * (any - Predef.nl)^0)^0 + +local name = m.R("AZ", "az", "__") * m.R("AZ", "az", "__", "09")^0 + +local arrow = S * "<-" + +local seq_follow = m.P"/" + ")" + "}" + ":}" + "~}" + "|}" + (name * arrow) + -1 + +name = m.C(name) + + +-- a defined name only have meaning in a given environment +local Def = name * m.Carg(1) + +local num = m.C(m.R"09"^1) * S / tonumber + +local String = "'" * m.C((any - "'")^0) * "'" + + '"' * m.C((any - '"')^0) * '"' + + +local defined = "%" * Def / function (c,Defs) + local cat = Defs and Defs[c] or Predef[c] + if not cat then error ("name '" .. c .. "' undefined") end + return cat +end + +local Range = m.Cs(any * (m.P"-"/"") * (any - "]")) / mm.R + +local item = defined + Range + m.C(any) + +local Class = + "[" + * (m.C(m.P"^"^-1)) -- optional complement symbol + * m.Cf(item * (item - "]")^0, mt.__add) / + function (c, p) return c == "^" and any - p or p end + * "]" + +local function adddef (t, k, exp) + if t[k] then + error("'"..k.."' already defined as a rule") + else + t[k] = exp + end + return t +end + +local function firstdef (n, r) return adddef({n}, n, r) end + + +local function NT (n, b) + if not b then + error("rule '"..n.."' used outside a grammar") + else return mm.V(n) + end +end + + +local exp = m.P{ "Exp", + Exp = S * ( m.V"Grammar" + + m.Cf(m.V"Seq" * ("/" * S * m.V"Seq")^0, mt.__add) ); + Seq = m.Cf(m.Cc(m.P"") * m.V"Prefix"^0 , mt.__mul) + * (#seq_follow + patt_error); + Prefix = "&" * S * m.V"Prefix" / mt.__len + + "!" * S * m.V"Prefix" / mt.__unm + + m.V"Suffix"; + Suffix = m.Cf(m.V"Primary" * S * + ( ( m.P"+" * m.Cc(1, mt.__pow) + + m.P"*" * m.Cc(0, mt.__pow) + + m.P"?" * m.Cc(-1, mt.__pow) + + "^" * ( m.Cg(num * m.Cc(mult)) + + m.Cg(m.C(m.S"+-" * m.R"09"^1) * m.Cc(mt.__pow)) + ) + + "->" * S * ( m.Cg((String + num) * m.Cc(mt.__div)) + + m.P"{}" * m.Cc(nil, m.Ct) + + m.Cg(Def / getdef * m.Cc(mt.__div)) + ) + + "=>" * S * m.Cg(Def / getdef * m.Cc(m.Cmt)) + ) * S + )^0, function (a,b,f) return f(a,b) end ); + Primary = "(" * m.V"Exp" * ")" + + String / mm.P + + Class + + defined + + "{:" * (name * ":" + m.Cc(nil)) * m.V"Exp" * ":}" / + function (n, p) return mm.Cg(p, n) end + + "=" * name / function (n) return mm.Cmt(mm.Cb(n), equalcap) end + + m.P"{}" / mm.Cp + + "{~" * m.V"Exp" * "~}" / mm.Cs + + "{|" * m.V"Exp" * "|}" / mm.Ct + + "{" * m.V"Exp" * "}" / mm.C + + m.P"." * m.Cc(any) + + (name * -arrow + "<" * name * ">") * m.Cb("G") / NT; + Definition = name * arrow * m.V"Exp"; + Grammar = m.Cg(m.Cc(true), "G") * + m.Cf(m.V"Definition" / firstdef * m.Cg(m.V"Definition")^0, + adddef) / mm.P +} + +local pattern = S * m.Cg(m.Cc(false), "G") * exp / mm.P * (-any + patt_error) + + +local function compile (p, defs) + if mm.type(p) == "pattern" then return p end -- already compiled + local cp = pattern:match(p, 1, defs) + if not cp then error("incorrect pattern", 3) end + return cp +end + +local function match (s, p, i) + local cp = mem[p] + if not cp then + cp = compile(p) + mem[p] = cp + end + return cp:match(s, i or 1) +end + +local function find (s, p, i) + local cp = fmem[p] + if not cp then + cp = compile(p) / 0 + cp = mm.P{ mm.Cp() * cp * mm.Cp() + 1 * mm.V(1) } + fmem[p] = cp + end + local i, e = cp:match(s, i or 1) + if i then return i, e - 1 + else return i + end +end + +local function gsub (s, p, rep) + local g = gmem[p] or {} -- ensure gmem[p] is not collected while here + gmem[p] = g + local cp = g[rep] + if not cp then + cp = compile(p) + cp = mm.Cs((cp / rep + 1)^0) + g[rep] = cp + end + return cp:match(s) +end + + +-- exported names +local re = { + compile = compile, + match = match, + find = find, + gsub = gsub, + updatelocale = updatelocale, +} + +if version == "Lua 5.1" then _G.re = re end + +return re diff --git a/cosmic rage/lua/sandbox.lua b/cosmic rage/lua/sandbox.lua new file mode 100644 index 0000000..2b08d3c --- /dev/null +++ b/cosmic rage/lua/sandbox.lua @@ -0,0 +1,163 @@ +-- sandbox.lua + +--[[ + +MUSHclient sandbox (taken from versions 4.11 to 4.57) + +To enable the sandbox for all Lua scripting add to: + + File menu -> Global Preferences -> Lua -> Preliminary Code + + ... this line: + +require "sandbox" + +See: http://mushclient.com/security + +Note that this sandbox only affects Lua, not other scripting languages. + +--]] + + +trust_all_worlds = false -- change to true to trust all the worlds +trust_all_plugins = false -- change to true to trust all the plugins +warn_if_not_trusted = false -- change to true to show warnings + +--[[ + +-- Lua initialization (sandbox) --> please read comments carefully. + +Use this to create a "sandbox" for safe execution of non-trusted scripts. + +If you only run your own scripts or plugins then you may not need this. + +The code in this area is executed after each Lua script space is created +but before any of your scripts are done. This can be used to initialise things +(eg. load DLLs, load files, set up variables) or to disable things as shown below. + +By setting a function name to nil you effectively make it unavailable. + +You can remove some functions from a library rather than all of them, eg. + + os.execute = nil -- no operating system calls + os.remove = nil -- no deleting files + os.rename = nil -- no renaming files + +This script will automatically be replaced if you completely delete it from +the Global Preferences, and restart MUSHclient. To avoid this, leave a comment +in (if you don't want any further action taken). + +--]] + +-- Example sandbox -- + +function MakeSandbox () + + local function ReportDisabled (pkg, func) + return function () + error (string.format ( + "Function '%s.%s' disabled in Lua sandbox - see MUSHclient global preferences", + pkg, func), 2) + end -- function + end -- ReportDisabled + + package.loadlib = ReportDisabled ("package", "loadlib") -- disable loadlib function + package.loaders [3] = nil -- disable DLL loader + package.loaders [4] = nil -- disable all-in-one loader + + for k, v in pairs (io) do + if type (v) == "function" then + io [k] = ReportDisabled ("io", k) + end -- type is function + end -- for + + local orig_os = os -- so we know names of disabled ones + + -- replace 'os' table with one containing only safe functions + os = { + date = os.date, + time = os.time, + setlocale = os.setlocale, + clock = os.clock, + difftime = os.difftime, + } + + for k, v in pairs (orig_os) do + if not os [k] and type (v) == "function" then + os [k] = ReportDisabled ("os", k) + end -- not still active + end -- for + + if warn_if_not_trusted then + ColourNote ("yellow", "black", + "Lua sandbox created, some functions disabled.") + end -- if warn_if_not_trusted + +end -- end of function MakeSandbox + + +-- default is to sandbox everything -- + +-- To trust individual worlds or plugins, add them to the lists below. + +-- To find your current world ID, do this: /print (GetWorldID ()) +-- Plugin IDs are mentioned near the start of every plugin. + +-- You can limit the behaviour to specific worlds, or specific plugins +-- by doing something like this: + +do + + -- World IDs of worlds we trust - replace with your world IDs + -- (and remove comment from start of line) + + local trusted_worlds = { + -- ["a4a1cc1801787ba88cd84f3a"] = true, -- example world A + -- ["cdc8552d1b251e449b874b9a"] = true, -- example world B + -- ["1ec5aac3265e472b97f0c103"] = true, -- example world C + } -- end of trusted_worlds + + -- Plugin IDs of plugins we trust - add your plugins to the table + + local trusted_plugins = { + [""] = "", -- trust main script (ie. if no plugin running) + ["03ca99c4e98d2a3e6d655c7d"] = "Chat", + ["982581e59ab42844527eec80"] = "Random_Socials", + ["4a267cd69ba59b5ecefe42d8"] = "Installer_sumcheck", + ["83beba4e37b3d0e7f63cedbc"] = "Reconnecter", + } -- end of trusted_plugins + + + -- check worlds + if not trust_all_worlds then + if not trusted_worlds [GetWorldID ()] then + if warn_if_not_trusted then + ColourNote ("yellow", "black", "Untrusted world " .. WorldName () .. + ", ID: " .. GetWorldID ()) + end -- if warn_if_not_trusted + MakeSandbox () + end -- not trusted world or plugin + end -- not trusting all worlds + + -- check plugins - check name *and* plugin ID + if not trust_all_plugins then + if trusted_plugins [GetPluginID ()] ~= GetPluginName () then + if warn_if_not_trusted then + ColourNote ("yellow", "black", "Untrusted plugin " .. GetPluginName () .. + ", ID: " .. GetPluginID ()) + end -- if warn_if_not_trusted + MakeSandbox () + end -- not trusted world or plugin + end -- if not trusting all plugins + +end -- local block + +-- warn if we can't load DLLs (checkbox might be unchecked) +if not package.loadlib and warn_if_not_trusted then + local by_this_plugin = "" + if GetPluginID () ~= "" then + by_this_plugin = " by this plugin" + end -- this is a plugin + ColourNote ("yellow", "black", + "Loading of DLLs" .. by_this_plugin .. " is disabled.") +end -- if diff --git a/cosmic rage/lua/serialize.lua b/cosmic rage/lua/serialize.lua new file mode 100644 index 0000000..cf19107 --- /dev/null +++ b/cosmic rage/lua/serialize.lua @@ -0,0 +1,237 @@ + +-- serialize.lua + +module (..., package.seeall) + +-- ---------------------------------------------------------- +-- serializer +-- See "Programming In Lua" chapter 12.1.2. +-- Also see forum thread: +-- http://www.gammon.com.au/forum/?id=4960 +-- ---------------------------------------------------------- + +--[[ + + Example of use: + + require "serialize" + SetVariable ("mobs", serialize.save ("mobs")) --> serialize mobs table + loadstring (GetVariable ("mobs")) () --> restore mobs table + + If you need to serialize two tables where subsequent ones refer to earlier ones + you can supply your own "saved tables" variable, like this: + + require "serialize" + result, t = serialize.save ("mobs") + result = result .. "\n" .. serialize.save ("quests", nil, t) + + In this example the serializing of "quests" also knows about the "mobs" table + and will use references to it where necessary. + + You can also supply the actual variable if the variable to be serialized does + not exist in the global namespace (for instance, if the variable is a local + variable to a function). eg. + + require "serialize" + do + local myvar = { 1, 2, 8, 9 } + print (serialize.save ("myvar", myvar)) + end + + In this example, without supplying the location of "myvar" the serialize would fail + because it would not be found in the _G namespace. + + ----- Added on 19 July 2007: + + You can now do a "simple save" which is intended for tables without cycles. That is, + tables, that do not refer to other tables. This is appropriate for "simple" data, like + a straight table of keys/values, including subtables. + + For a simple save, all you need to do is supply the value, like this: + + print (serialize.save_simple ({ foo = 22, bar = "hi", t = { s = 9, k = 22 } })) + + This produces: + + { + t = { + s = 9, + k = 22, + }, + bar = "hi", + foo = 22, + } + +--]] + +local save_item -- forward declaration, function appears near the end +local save_item_simple + +function save (what, v, saved) + + saved = saved or {} -- initial table of tables we have already done + v = v or _G [what] -- default to "what" in global namespace + + assert (type (what) == "string", + "1st argument to serialize.save should be the *name* of a variable") + + assert (v, "Variable '" .. what .. "' does not exist") + + assert (type (saved) == "table" or saved == nil, + "3rd argument to serialize.save should be a table or nil") + + local out = {} -- output to this table + save_item (what, v, out, 0, saved) -- do serialization + return table.concat (out, "\n"), saved -- turn into a string (also return our table) +end -- serialize.save + +function save_simple (v) + local out = {} -- output to this table + save_item_simple (v, out, 2) -- do serialization + return table.concat (out) -- turn into a string +end -- serialize.save_simple + +--- below are local functions for this module ------------- + +local function basicSerialize (o) + if type(o) == "number" or type(o) == "boolean" then + return tostring(o) + else -- assume it is a string + return string.format("%q", o) + end +end -- basicSerialize + +-- +-- Lua keywords might look OK to not be quoted as keys but must be. +-- So, we make a list of them. +-- + +local lua_reserved_words = {} + +for _, v in ipairs ({ + "and", "break", "do", "else", "elseif", "end", + "for", "function", "if", "in", "local", "nil", "not", "or", + "repeat", "return", "then", "until", "while" + }) do lua_reserved_words [v] = true end + +-- ---------------------------------------------------------- +-- save one variable (calls itself recursively) +-- +-- Modified on 23 October 2005 to better handle keys (like table keys) +-- ---------------------------------------------------------- +function save_item (name, value, out, indent, saved) -- important! no "local" keyword + local iname = string.rep (" ", indent) .. name -- indented name + + -- numbers, strings, and booleans can be simply serialized + + if type (value) == "number" or + type (value) == "string" or + type (value) == "boolean" then + table.insert (out, iname .. " = " .. basicSerialize(value)) + + -- tables need to be constructed, unless we have already done it + + elseif type (value) == "table" then + if saved[value] then -- value already saved? + table.insert (out, iname .. " = " .. saved[value]) -- use its previous name + else + + -- remember we have created this table so we don't do it twice + + saved [value] = name -- save name for next time + + -- make the table constructor, and recurse to save its contents + + table.insert (out, iname .. " = {}") -- create a new table + + for k, v in pairs (value) do -- save its fields + local fieldname + + -- if key is a Lua variable name which is not a reserved word + -- we can express it as tablename.keyname + + if type (k) == "string" + and string.find (k, "^[_%a][_%a%d]*$") + and not lua_reserved_words [k] then + fieldname = string.format("%s.%s", name, k) + + -- if key is a table itself, and we know its name then we can use that + -- eg. tablename [ tablekeyname ] + + elseif type (k) == "table" and saved[k] then + fieldname = string.format("%s[%s]", name, saved [k]) + + -- if key is an unknown table, we have to raise an error as we cannot + -- deduce its name + + elseif type (k) == "table" then + error ("Key table entry " .. tostring (k) .. + " in table " .. name .. " is not known") + + -- if key is a number or a boolean it can simply go in brackets, + -- like this: tablename [5] or tablename [true] + + elseif type (k) == "number" or type (k) == "boolean" then + fieldname = string.format("%s[%s]", name, tostring (k)) + + -- now key should be a string, otherwise an error + + elseif type (k) ~= "string" then + error ("Cannot serialize table keys of type '" .. type (k) .. + "' in table " .. name) + + -- if key is a non-variable name (eg. "++") then we have to put it + -- in brackets and quote it, like this: tablename ["keyname"] + + else + fieldname = string.format("%s[%s]", name, + basicSerialize(k)) + end + + -- now we have finally worked out a suitable name for the key, + -- recurse to save the value associated with it + + save_item(fieldname, v, out, indent + 2, saved) + end + end + + -- cannot serialize things like functions, threads + + else + error ("Cannot serialize '" .. name .. "' (" .. type (value) .. ")") + end -- if type of variable +end -- save_item + +-- saves tables *without* cycles (produces smaller output) +function save_item_simple (value, out, indent) + -- numbers, strings, and booleans can be simply serialized + + if type (value) == "number" or + type (value) == "string" or + type (value) == "boolean" then + table.insert (out, basicSerialize(value)) + elseif type (value) == "table" then + table.insert (out, "{\n") + + for k, v in pairs (value) do -- save its fields + table.insert (out, string.rep (" ", indent)) + if not string.find (k, '^[_%a][_%a%d]*$') + or lua_reserved_words [k] then + table.insert (out, "[" .. basicSerialize (k) .. "] = ") + else + table.insert (out, k .. " = ") + end -- if + save_item_simple (v, out, indent + 2) + table.insert (out, ",\n") + end -- for each table item + + table.insert (out, string.rep (" ", indent) .. "}") + + -- cannot serialize things like functions, threads + + else + error ("Cannot serialize " .. type (value)) + end -- if type of variable + +end -- save_item_simple + diff --git a/cosmic rage/lua/show_loaded.lua b/cosmic rage/lua/show_loaded.lua new file mode 100644 index 0000000..2133be5 --- /dev/null +++ b/cosmic rage/lua/show_loaded.lua @@ -0,0 +1,25 @@ +-- show_loaded.lua + +--[[ + +Shows each plugin as it is loaded. + +To enable this, add to: + + File menu -> Global Preferences -> Lua -> Preliminary Code + + ... this line: + +require "show_loaded" + + +--]] + +if GetPluginID () == "" then + ColourNote ("gray", "", "Initializing main world script ...") +else + ColourNote ("gray", "", string.format ("Loading plugin '%s' (%s) version %0.2f ...", + GetPluginInfo ( GetPluginID (), 7), + GetPluginInfo ( GetPluginID (), 1), + GetPluginInfo ( GetPluginID (), 19))) +end -- if diff --git a/cosmic rage/lua/socket.lua b/cosmic rage/lua/socket.lua new file mode 100644 index 0000000..211adcd --- /dev/null +++ b/cosmic rage/lua/socket.lua @@ -0,0 +1,133 @@ +----------------------------------------------------------------------------- +-- LuaSocket helper module +-- Author: Diego Nehab +-- RCS ID: $Id: socket.lua,v 1.22 2005/11/22 08:33:29 diego Exp $ +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Declare module and import dependencies +----------------------------------------------------------------------------- +local base = _G +local string = require("string") +local math = require("math") +local socket = require("socket.core") +module("socket") + +----------------------------------------------------------------------------- +-- Exported auxiliar functions +----------------------------------------------------------------------------- +function connect(address, port, laddress, lport) + local sock, err = socket.tcp() + if not sock then return nil, err end + if laddress then + local res, err = sock:bind(laddress, lport, -1) + if not res then return nil, err end + end + local res, err = sock:connect(address, port) + if not res then return nil, err end + return sock +end + +function bind(host, port, backlog) + local sock, err = socket.tcp() + if not sock then return nil, err end + sock:setoption("reuseaddr", true) + local res, err = sock:bind(host, port) + if not res then return nil, err end + res, err = sock:listen(backlog) + if not res then return nil, err end + return sock +end + +try = newtry() + +function choose(table) + return function(name, opt1, opt2) + if base.type(name) ~= "string" then + name, opt1, opt2 = "default", name, opt1 + end + local f = table[name or "nil"] + if not f then base.error("unknown key (".. base.tostring(name) ..")", 3) + else return f(opt1, opt2) end + end +end + +----------------------------------------------------------------------------- +-- Socket sources and sinks, conforming to LTN12 +----------------------------------------------------------------------------- +-- create namespaces inside LuaSocket namespace +sourcet = {} +sinkt = {} + +BLOCKSIZE = 2048 + +sinkt["close-when-done"] = function(sock) + return base.setmetatable({ + getfd = function() return sock:getfd() end, + dirty = function() return sock:dirty() end + }, { + __call = function(self, chunk, err) + if not chunk then + sock:close() + return 1 + else return sock:send(chunk) end + end + }) +end + +sinkt["keep-open"] = function(sock) + return base.setmetatable({ + getfd = function() return sock:getfd() end, + dirty = function() return sock:dirty() end + }, { + __call = function(self, chunk, err) + if chunk then return sock:send(chunk) + else return 1 end + end + }) +end + +sinkt["default"] = sinkt["keep-open"] + +sink = choose(sinkt) + +sourcet["by-length"] = function(sock, length) + return base.setmetatable({ + getfd = function() return sock:getfd() end, + dirty = function() return sock:dirty() end + }, { + __call = function() + if length <= 0 then return nil end + local size = math.min(socket.BLOCKSIZE, length) + local chunk, err = sock:receive(size) + if err then return nil, err end + length = length - string.len(chunk) + return chunk + end + }) +end + +sourcet["until-closed"] = function(sock) + local done + return base.setmetatable({ + getfd = function() return sock:getfd() end, + dirty = function() return sock:dirty() end + }, { + __call = function() + if done then return nil end + local chunk, err, partial = sock:receive(socket.BLOCKSIZE) + if not err then return chunk + elseif err == "closed" then + sock:close() + done = 1 + return partial + else return nil, err end + end + }) +end + + +sourcet["default"] = sourcet["until-closed"] + +source = choose(sourcet) + diff --git a/cosmic rage/lua/strict.lua b/cosmic rage/lua/strict.lua new file mode 100644 index 0000000..ec0f37c --- /dev/null +++ b/cosmic rage/lua/strict.lua @@ -0,0 +1,35 @@ +-- strict.lua + +-- by Roberto Ierusalimschy +-- checks uses of undeclared global variables +-- All global variables must be 'declared' through a regular assignment +-- (even assigning nil will do) in a main chunk before being used +-- anywhere or assigned to inside a function. +-- + +local mt = getmetatable(_G) +if mt == nil then + mt = {} + setmetatable(_G, mt) +end + +mt.__declared = {} + +mt.__newindex = function (t, n, v) + if not mt.__declared[n] then + local w = debug.getinfo(2, "S").what + if w ~= "main" and w ~= "C" then + error("assign to undeclared variable '"..n.."'", 2) + end + mt.__declared[n] = true + end + rawset(t, n, v) +end + +mt.__index = function (t, n) + if not mt.__declared[n] then + error("variable '"..n.."' is not declared", 2) + end + return rawget(t, n) +end + diff --git a/cosmic rage/lua/string_indexing.lua b/cosmic rage/lua/string_indexing.lua new file mode 100644 index 0000000..d81f987 --- /dev/null +++ b/cosmic rage/lua/string_indexing.lua @@ -0,0 +1,24 @@ +--[[ + + string_indexing.lua + + If you install this, then you can index into strings, like this: + + + require "string_indexing" + + a = "nick" + print (a [3]) --> c + + + +--]] + +getmetatable ("").__index = function (str, i) + + if (type (i) == "number") then + return string.sub (str, i, i) -- index into str + end -- if + + return string [i] -- fallback (eg. string.match) +end -- function diff --git a/cosmic rage/lua/tabbed_window.lua b/cosmic rage/lua/tabbed_window.lua new file mode 100644 index 0000000..45c0422 --- /dev/null +++ b/cosmic rage/lua/tabbed_window.lua @@ -0,0 +1,313 @@ +-- tabbed_window.lua + +--[[ + +Author: Nick Gammon +Date: 7th February 2018 + +Generic tabbed miniwindow drawer. + +Exposed functions: + + init (context) -- call once (from OnPluginInstall), supply: + + context.win -- window ID for this tabbed window + context.tabfont -- table of font info for non-active tabs (name, size, unicode, bold, italic) + context.activefont -- table of font info for the selected tab (name, size, unicode, bold, italic) + context.titlefont -- table of font info for the title bar (name, size, unicode, bold, italic) + context.colours -- table of assorted colours (see below for examples) + context.window -- table (width and height) of the desired window size + context.tab_filler -- gap between tabs + context.can_move -- can window be dragged around? + context.active_tab -- the currently active tab + context.tabs -- table of tables - one per tab (name, handler) + + draw_window (context, which_tab) -- draws the window with which_tab as the active tab + hide_window (context) -- hides this window + save_state (context) -- for saving the window position (call from OnPluginSaveState) + +Exposed variables: + + VERSION -- version of this module + +--]] + +module (..., package.seeall) + +VERSION = 1.1 -- -- for querying by plugins + +require "movewindow" -- load the movewindow.lua module + +local default_context = { + + -- window ID + win = "tabbed_window_" .. GetUniqueID (), + + -- font for inactive tab text + tabfont = { + id = "fn", + name = "Lucida Console", + size = 10, -- points + unicode = false, -- Unicode? + bold = false, -- make bold? + italic = false, -- make italic? + }, -- end of tabfont + + -- font for active tab text + activefont = { + id = "fa", + name = "Lucida Console", + size = 10, -- points + unicode = false, -- Unicode? + bold = false, -- make bold? + italic = false, -- make italic? + }, -- end of activefont + + -- font for title text + titlefont = { + id = "ft", + name = "Lucida Console", + size = 12, -- points + unicode = false, -- Unicode? + bold = true, -- make bold? + italic = false, -- make italic? + }, -- end of titlefont + + colours = { + background = ColourNameToRGB ("lightskyblue"), -- entire window background + frame = ColourNameToRGB ("mediumorchid"), -- frame around window + title_bar = ColourNameToRGB ("palegoldenrod"), -- behind the title + title = ColourNameToRGB ("mediumblue"), -- title text + tab = ColourNameToRGB ("green"), -- tab background + tab_text = ColourNameToRGB ("white"), -- inactive tab text + active_tab_text = ColourNameToRGB ("lightgreen"), -- active tab text + upper_line = ColourNameToRGB ("lightgray"), -- line above tab text + lower_line = ColourNameToRGB ("lightgray"), -- line below tab text + vertical_line = ColourNameToRGB ("lightgray"), -- line between tabs + }, -- end of colours + + -- miniwindow size + window = { + width = 300, + height = 200, + }, -- end of window info + + -- gap between text in tabs + tab_filler = 10, + + -- can it be moved? + can_move = true, + + -- which tab is active + active_tab = 1, + + -- tabs + -- table of tabs. For each one supply a table containing a name and a handler, + -- eg. { name = "Circle", handler = DrawCircle }, + + tabs = { }, + + +} -- end of default_context + +-- ------------------------------------------------------------------------------- +-- init - initialize this module ready for use (do once) +-- ------------------------------------------------------------------------------- +function init (context) + + -- make copy of colours, sizes etc. + assert (type (context) == "table", "No 'context' table supplied to tabbed_window.") + + -- force some context defaults if not supplied + for k, v in pairs (default_context) do + + -- some context items are tables so copy the table entries + if type (v) == 'table' then + if type (context [k]) ~= 'table' then + assert (context [k] == nil, "tabbed window context item '" .. k .. "' should be a table or nil") + context [k] = { } -- make table if required + end -- not having a table there + for k1, v1 in pairs (v) do + context [k] [k1] = context [k] [k1] or v1 + end -- for each sub-table item + else + context [k] = context [k] or v + end -- if table or not + end -- for + + if next (context.tabs) == nil then + ColourNote ("orange", "", "Warning: no tabs define for tabbed window") + end -- if + + -- install the window movement handler, get back the window position + context.windowinfo = movewindow.install (context.win, miniwin.pos_top_left, 0) -- default to top left + + -- save a bit of typing + local windowinfo = context.windowinfo + local win = context.win + local tabfont = context.tabfont + local activefont = context.activefont + local titlefont = context.titlefont + local window = context.window + local colours = context.colours + + -- make window so I can grab the font info + WindowCreate (win, + windowinfo.window_left, + windowinfo.window_top, + window.width, + window.height, + windowinfo.window_mode, + windowinfo.window_flags, + colours.background) + + WindowFont (win, tabfont.id, tabfont.name, tabfont.size, tabfont.bold, tabfont.italic, false, false, 0, 0) + tabfont.height = WindowFontInfo (win, tabfont.id, 1) -- height + WindowFont (win, activefont.id, activefont.name, activefont.size, activefont.bold, activefont.italic, false, false, 0, 0) + activefont.height = WindowFontInfo (win, activefont.id, 1) -- height + WindowFont (win, titlefont.id, titlefont.name, titlefont.size, titlefont.bold, titlefont.italic, false, false, 0, 0) + titlefont.height = WindowFontInfo (win, titlefont.id, 1) -- height + + context.client_bottom = context.window.height - context.tabfont.height - 8 + +end -- init + +function save_state (context) + -- save window current location for next time + movewindow.save_state (context.win) +end -- save_state + +-- ------------------------------------------------------------------------------- +-- draw_window - draw the tabbed window +-- ------------------------------------------------------------------------------- +function draw_window (context, whichTab) + + context.active_tab = whichTab + + -- save a bit of typing + local windowinfo = context.windowinfo + local win = context.win + local tabfont = context.tabfont + local activefont = context.activefont + local titlefont = context.titlefont + local window = context.window + local colours = context.colours + local tabs = context.tabs + local client_bottom = context.client_bottom + local tab_filler = context.tab_filler + + -- clear window + WindowRectOp (win, miniwin.rect_fill, 0, 0, 0, 0, colours.background) + WindowDeleteAllHotspots (win) + + -- draw drag bar rectangle + WindowRectOp (win, miniwin.rect_fill, 1, 1, 0, titlefont.height + 2, colours.title_bar) + + -- add the drag handler so they can move the window around + if context.can_move then + movewindow.add_drag_handler (win, 0, 0, 0, titlefont.height) + end -- if can move the window + + local thisTab = tabs [whichTab] + + if not thisTab then + ColourNote ("orange", "", "Tab " .. whichTab .. " does not exist") + return + end -- no such tab + + -- find title width so we can center it + local title_width = WindowTextWidth (win, titlefont.id, thisTab.name, titlefont.unicode) + + -- draw title + WindowText(win, titlefont.id, thisTab.name, (window.width - title_width )/ 2 + 1, 1, 0, 0, colours.title, titlefont.unicode) + + -- frame window + WindowRectOp (win, miniwin.rect_frame, 0, 0, 0, 0, colours.frame) + + -- draw tabs + + local left = 1 + + -- we have to make a function to handle each tabbed window, so its + -- name must include the window ID + local mouse_down_function_name = "tabbed_window_mouse_down_handler_" .. win + + -- the function will have the context as a closure + getfenv () [mouse_down_function_name] = function (flags, hotspot_id) + local whichTab = string.match (hotspot_id, "^hs(%d)$") + if not whichTab then -- tab unknown for some reason + ColourNote ("orange", "", "Mousedown tab unknown " .. hotspot_id) + return + end -- if + + draw_window (context, tonumber (whichTab)) + + end -- mouse_down_function_name + + for k, v in ipairs (tabs) do + local tab_width + + if k == whichTab then + tab_width = WindowTextWidth (win, activefont.id, v.name, activefont.unicode) + else + tab_width = WindowTextWidth (win, tabfont.id, v.name, tabfont.unicode) + end -- if + + -- tab background + WindowRectOp (win, miniwin.rect_fill, left, client_bottom, left + tab_width + tab_filler, window.height - 1, colours.tab) + + -- tab text + if k == whichTab then + WindowText(win, activefont.id, v.name, left + tab_filler / 2, client_bottom + 4, 0, 0, colours.active_tab_text, activefont.unicode) + else + WindowText(win, tabfont.id, v.name, left + tab_filler / 2, client_bottom + 4, 0, 0, colours.tab_text, tabfont.unicode) + end -- if + + -- draw upper line if not active tab + if k ~= whichTab then + WindowLine(win, left, client_bottom + 2, left + tab_width + tab_filler, client_bottom + 2, + colours.upper_line, miniwin.pen_solid, 2) + end -- if not active + + -- draw lower line + WindowLine(win, left, window.height - 1, left + tab_width + tab_filler, window.height - 1, + colours.lower_line, miniwin.pen_solid, 1) + + -- draw vertical lines + WindowLine(win, left, client_bottom + 2, left, window.height - 1, + colours.vertical_line, miniwin.pen_solid, 1) + WindowLine(win, left + tab_width + tab_filler, client_bottom + 2, left + tab_width + tab_filler, window.height - 1, + colours.vertical_line, miniwin.pen_solid, 1) + + -- now add a hotspot for this tab + WindowAddHotspot(win, "hs" .. k, + left, client_bottom, left + tab_width + tab_filler, window.height - 1, -- rectangle + "", -- mouseover + "", -- cancelmouseover + "tabbed_window." .. mouse_down_function_name, + "", -- cancelmousedown + "", -- mouseup + "Show " .. v.name .. " tab", -- tooltip text + miniwin.cursor_hand, 0) -- hand cursor + + left = left + tab_width + tab_filler + + end -- for each tab + + -- call handler to draw rest of window + local handler = thisTab.handler + if handler then + handler (win, 1, titlefont.height + 2, window.width - 1, client_bottom, context) + else + ColourNote ("orange", "", "No tab handler for " .. thisTab.name) + end -- if + + WindowShow (win, true) +end -- draw_window + +-- ------------------------------------------------------------------------------- +-- hide_window - hide the tabbed window +-- ------------------------------------------------------------------------------- +function hide_window (context) + WindowShow (context.win, false) +end -- hide_window \ No newline at end of file diff --git a/cosmic rage/lua/tprint.lua b/cosmic rage/lua/tprint.lua new file mode 100644 index 0000000..0c6386b --- /dev/null +++ b/cosmic rage/lua/tprint.lua @@ -0,0 +1,47 @@ +-- +-- tprint.lua + +--[[ + +For debugging what tables have in them, prints recursively + +See forum thread: http://www.gammon.com.au/forum/?id=4903 + +eg. + +require "tprint" + + tprint (GetStyleInfo (20)) + +--]] + +function tprint (t, indent, done) + -- in case we run it standalone + local Note = Note or print + local Tell = Tell or io.write + + -- show strings differently to distinguish them from numbers + local function show (val) + if type (val) == "string" then + return '"' .. val .. '"' + else + return tostring (val) + end -- if + end -- show + -- entry point here + done = done or {} + indent = indent or 0 + for key, value in pairs (t) do + Tell (string.rep (" ", indent)) -- indent it + if type (value) == "table" and not done [value] then + done [value] = true + Note (show (key), ":"); + tprint (value, indent + 2, done) + else + Tell (show (key), "=") + print (show (value)) + end + end +end + +return tprint diff --git a/cosmic rage/lua/var.lua b/cosmic rage/lua/var.lua new file mode 100644 index 0000000..48c617d --- /dev/null +++ b/cosmic rage/lua/var.lua @@ -0,0 +1,48 @@ +-- var.lua +-- ---------------------------------------------------------- +-- Accessing MUSHclient variables through the 'var' table. +-- See forum thread: +-- http://www.gammon.com.au/forum/?id=4904 + +--[[ + + * Set a variable by assigning something to it. + * Delete a variable by assigning nil to it. + * Get a variable by retrieving its value, will return nil if the variable does not exist. + + Examples: + + var.target = "kobold" -- set MUSHclient variable 'target' to kobold + print (var.target) -- print contents of MUSHclient variable + +--]] + +-- ---------------------------------------------------------- + +var = {} -- variables table + +setmetatable (var, + { + -- called to access an entry + __index = + function (t, name) + return GetVariable (name) + end, + + -- called to change or delete an entry + __newindex = + function (t, name, val) + local result + if val == nil then -- nil deletes it + result = DeleteVariable (name) + else + result = SetVariable (name, tostring (val)) + end + -- warn if they are using bad variable names + if result == error_code.eInvalidObjectLabel then + error ("Bad variable name '" .. name .. "'", 2) + end + end + }) + +return var \ No newline at end of file diff --git a/cosmic rage/lua/wait.lua b/cosmic rage/lua/wait.lua new file mode 100644 index 0000000..55e20f7 --- /dev/null +++ b/cosmic rage/lua/wait.lua @@ -0,0 +1,180 @@ +-- wait.lua +-- ---------------------------------------------------------- +-- 'wait' stuff - lets you build pauses into scripts. +-- See forum thread: +-- http://www.gammon.com.au/forum/?id=4957 +-- ---------------------------------------------------------- + +--[[ + +Example of an alias 'send to script': + + +require "wait" + +wait.make (function () --- coroutine below here + + repeat + Send "cast heal" + line, wildcards = + wait.regexp ("^(You heal .*|You lose your concentration)$") + + until string.find (line, "heal") + + -- wait a second for luck + wait.time (1) + +end) -- end of coroutine + +--]] + +require "check" + +module (..., package.seeall) + +-- ---------------------------------------------------------- +-- table of outstanding threads that are waiting +-- ---------------------------------------------------------- +local threads = {} + +-- ---------------------------------------------------------- +-- wait.timer_resume: called by a timer to resume a thread +-- ---------------------------------------------------------- +function timer_resume (name) + local thread = threads [name] + if thread then + threads [name] = nil + local ok, err = coroutine.resume (thread) + if not ok then + ColourNote ("deeppink", "black", "Error raised in timer function (in wait module).") + ColourNote ("darkorange", "black", debug.traceback (thread)) + error (err) + end -- if + end -- if +end -- function timer_resume + +-- ---------------------------------------------------------- +-- wait.trigger_resume: called by a trigger to resume a thread +-- ---------------------------------------------------------- +function trigger_resume (name, line, wildcards, styles) + local thread = threads [name] + if thread then + threads [name] = nil + local ok, err = coroutine.resume (thread, line, wildcards, styles) + if not ok then + ColourNote ("deeppink", "black", "Error raised in trigger function (in wait module)") + ColourNote ("darkorange", "black", debug.traceback (thread)) + error (err) + end -- if + end -- if +end -- function trigger_resume + +-- ---------------------------------------------------------- +-- convert x seconds to hours, minutes, seconds (for AddTimer) +-- ---------------------------------------------------------- +local function convert_seconds (seconds) + local hours = math.floor (seconds / 3600) + seconds = seconds - (hours * 3600) + local minutes = math.floor (seconds / 60) + seconds = seconds - (minutes * 60) + return hours, minutes, seconds +end -- function convert_seconds + +-- ---------------------------------------------------------- +-- wait.time: we call this to wait in a script +-- ---------------------------------------------------------- +function time (seconds) + local id = "wait_timer_" .. GetUniqueNumber () + threads [id] = assert (coroutine.running (), "Must be in coroutine") + + local hours, minutes, seconds = convert_seconds (seconds) + + check (AddTimer (id, hours, minutes, seconds, "", + bit.bor (timer_flag.Enabled, + timer_flag.OneShot, + timer_flag.Temporary, + timer_flag.ActiveWhenClosed, + timer_flag.Replace), + "wait.timer_resume")) + + return coroutine.yield () +end -- function time + +-- ---------------------------------------------------------- +-- wait.regexp: we call this to wait for a trigger with a regexp +-- ---------------------------------------------------------- +function regexp (regexp, timeout, flags) + local id = "wait_trigger_" .. GetUniqueNumber () + threads [id] = assert (coroutine.running (), "Must be in coroutine") + + check (AddTriggerEx (id, regexp, + "-- added by wait.regexp", + bit.bor (flags or 0, -- user-supplied extra flags, like omit from output + trigger_flag.Enabled, + trigger_flag.RegularExpression, + trigger_flag.Temporary, + trigger_flag.Replace, + trigger_flag.OneShot), + custom_colour.NoChange, + 0, "", -- wildcard number, sound file name + "wait.trigger_resume", + 12, 100)) -- send to script (in case we have to delete the timer) + + -- if timeout specified, also add a timer + if timeout and timeout > 0 then + local hours, minutes, seconds = convert_seconds (timeout) + + -- if timer fires, it deletes this trigger + check (AddTimer (id, hours, minutes, seconds, + "DeleteTrigger ('" .. id .. "')", + bit.bor (timer_flag.Enabled, + timer_flag.OneShot, + timer_flag.Temporary, + timer_flag.ActiveWhenClosed, + timer_flag.Replace), + "wait.timer_resume")) + + check (SetTimerOption (id, "send_to", "12")) -- send to script + + -- if trigger fires, it should delete the timer we just added + check (SetTriggerOption (id, "send", "DeleteTimer ('" .. id .. "')")) + + end -- if having a timeout + + return coroutine.yield () -- return line, wildcards +end -- function regexp + +-- ---------------------------------------------------------- +-- wait.match: we call this to wait for a trigger (not a regexp) +-- ---------------------------------------------------------- +function match (match, timeout, flags) + return regexp (MakeRegularExpression (match), timeout, flags) +end -- function match + +-- ---------------------------------------------------------- +-- wait.make: makes a coroutine and resumes it +-- ---------------------------------------------------------- +function make (f) + assert (type (f) == "function", "wait.make requires a function") + + -- More friendly failure, suggested by Fiendish + local errors = {} + if GetOption ("enable_timers") ~= 1 then + table.insert (errors, "TIMERS") + end -- if timers disabled + if GetOption ("enable_triggers") ~= 1 then + table.insert (errors, "TRIGGERS") + end -- if triggers disabled + if #errors ~= 0 then + ColourNote("white", "red", + "One of your scripts (in '" .. + (GetPluginInfo(GetPluginID(), 1) or "World") .. + "') just did something that requires " .. + table.concat (errors, " and ") .. + " to be enabled, but they aren't. " .. + "Please check your configuration settings.") + return nil, "Trigger/Timers not enabled" -- bad return + end -- if have errors + coroutine.wrap (f) () -- make coroutine, resume it + return true -- good return +end -- make diff --git a/cosmic rage/lua/words_to_numbers.lua b/cosmic rage/lua/words_to_numbers.lua new file mode 100644 index 0000000..da23b7c --- /dev/null +++ b/cosmic rage/lua/words_to_numbers.lua @@ -0,0 +1,298 @@ +-- Convert a number to words +-- Author: Nick Gammon +-- Date: 18th March 2010 + +-- See: http://www.gammon.com.au/forum/?id=10155 + +-- Examples of use: +-- words = convert_numbers_to_words ("94921277802687490518") +-- number = convert_words_to_numbers ("one hundred eight thousand three hundred nine") + +-- Both functions return nil and an error message so you can check for failure, +-- or assert, eg. words = assert (convert_numbers_to_words ("2687490518")) + +-- Units, must be in inverse order! +-- The trailing space is required as the space between words + +local inverse_units = { + "vigintillion ", -- 10^63 + "novemdecillion ", -- 10^60 + "octodecillion ", -- 10^57 + "septendecillion ", -- 10^54 + "sexdecillion ", -- 10^51 + "quindecillion ", -- 10^48 + "quattuordecillion ",-- 10^45 + "tredecillion ", -- 10^42 + "duodecillion ", -- 10^39 + "undecillion ", -- 10^36 + "decillion ", -- 10^33 + "nonillion ", -- 10^30 + "octillion ", -- 10^27 + "septillion ", -- 10^24 + "sextillion ", -- 10^21 + "quintillion ", -- 10^18 + "quadrillion ", -- 10^15 + "trillion ", -- 10^12 + "billion ", -- 10^9 + "million ", -- 10^6 + "thousand ", -- 10^3 + } -- inverse_units + +local inverse_numbers = { + "one ", + "two ", + "three ", + "four ", + "five ", + "six ", + "seven ", + "eight ", + "nine ", + "ten ", + "eleven ", + "twelve ", + "thirteen ", + "fourteen ", + "fifteen ", + "sixteen ", + "seventeen ", + "eighteen ", + "nineteen ", + "twenty ", + [30] = "thirty ", + [40] = "forty ", + [50] = "fifty ", + [60] = "sixty ", + [70] = "seventy ", + [80] = "eighty ", + [90] = "ninety ", + } -- inverse_numbers + +local function convert_up_to_999 (n) + + if n <= 0 then + return "" + end -- if zero + + local hundreds = math.floor (n / 100) + local tens = math.floor (n % 100) + local result = "" + + -- if over 99 we need to say x hundred + if hundreds > 0 then + + result = inverse_numbers [hundreds] .. "hundred " + if tens == 0 then + return result + end -- if only a digit in the hundreds column + + -- to have "and" between things like "hundred and ten" + -- uncomment the next line + -- result = result .. "and " + + end -- if + + -- up to twenty it is then just five hundred (and) fifteen + if tens <= 20 then + return result .. inverse_numbers [tens] + end -- if + + -- otherwise we need: thirty (something) + result = result .. inverse_numbers [math.floor (tens / 10) * 10] + + -- get final digit (eg. thirty four) + local digits = math.floor (n % 10) + + -- to put a hyphen between things like "forty-two" + -- uncomment the WITH HYPHEN line and + -- comment out the NO HYPHEN line + + if digits > 0 then + result = result .. inverse_numbers [digits] -- NO HYPHEN +-- result = string.sub (result, 1, -2) .. "-" .. inverse_numbers [digits] -- WITH HYPHEN + end -- if + + return result + +end -- convert_up_to_999 + +-- convert a number to words +-- See: http://www.gammon.com.au/forum/?id=10155 + +function convert_numbers_to_words (n) + local s = tostring (n) + + -- preliminary sanity checks + local c = string.match (s, "%D") + if c then + return nil, "Non-numeric digit '" .. c .. "' in number" + end -- if + + if #s == 0 then + return nil, "No number supplied" + elseif #s > 66 then + return nil, "Number too big to convert to words" + end -- if + + -- make multiple of 3 + while #s % 3 > 0 do + s = "0" .. s + end -- while + + local result = "" + local start = #inverse_units - (#s / 3) + 2 + + for i = start, #inverse_units do + local group = tonumber (string.sub (s, 1, 3)) + if group > 0 then + result = result .. convert_up_to_999 (group) .. inverse_units [i] + end -- if not zero + s = string.sub (s, 4) + end -- for + + result = result .. convert_up_to_999 (tonumber (s)) + + if result == "" then + result = "zero" + end -- if + + return (string.gsub (result, " +$", "")) -- trim trailing spaces + +end -- convert_numbers_to_words + +-- Convert words to a number +-- Author: Nick Gammon +-- Date: 18th March 2010 + +-- Does NOT handle decimal places (eg. four point six) + +local numbers = { + zero = bc.number (0), + one = bc.number (1), + two = bc.number (2), + three = bc.number (3), + four = bc.number (4), + five = bc.number (5), + six = bc.number (6), + seven = bc.number (7), + eight = bc.number (8), + nine = bc.number (9), + ten = bc.number (10), + eleven = bc.number (11), + twelve = bc.number (12), + thirteen = bc.number (13), + fourteen = bc.number (14), + fifteen = bc.number (15), + sixteen = bc.number (16), + seventeen = bc.number (17), + eighteen = bc.number (18), + nineteen = bc.number (19), + twenty = bc.number (20), + thirty = bc.number (30), + forty = bc.number (40), + fifty = bc.number (50), + sixty = bc.number (60), + seventy = bc.number (70), + eighty = bc.number (80), + ninety = bc.number (90), +} -- numbers + +local units = { + hundred = bc.number ("100"), + thousand = bc.number ("1" .. string.rep ("0", 3)), + million = bc.number ("1" .. string.rep ("0", 6)), + billion = bc.number ("1" .. string.rep ("0", 9)), + trillion = bc.number ("1" .. string.rep ("0", 12)), + quadrillion = bc.number ("1" .. string.rep ("0", 15)), + quintillion = bc.number ("1" .. string.rep ("0", 18)), + sextillion = bc.number ("1" .. string.rep ("0", 21)), + septillion = bc.number ("1" .. string.rep ("0", 24)), + octillion = bc.number ("1" .. string.rep ("0", 27)), + nonillion = bc.number ("1" .. string.rep ("0", 30)), + decillion = bc.number ("1" .. string.rep ("0", 33)), + undecillion = bc.number ("1" .. string.rep ("0", 36)), + duodecillion = bc.number ("1" .. string.rep ("0", 39)), + tredecillion = bc.number ("1" .. string.rep ("0", 42)), + quattuordecillion = bc.number ("1" .. string.rep ("0", 45)), + quindecillion = bc.number ("1" .. string.rep ("0", 48)), + sexdecillion = bc.number ("1" .. string.rep ("0", 51)), + septendecillion = bc.number ("1" .. string.rep ("0", 54)), + octodecillion = bc.number ("1" .. string.rep ("0", 57)), + novemdecillion = bc.number ("1" .. string.rep ("0", 60)), + vigintillion = bc.number ("1" .. string.rep ("0", 63)), + } -- units + +-- convert a number in words to a numeric form +-- See: http://www.gammon.com.au/forum/?id=10155 +-- Thanks to David Haley + +function convert_words_to_numbers (s) + + local stack = {} + local previous_type + + for word in string.gmatch (s:lower (), "[%a%d]+") do + if word ~= "and" then -- skip "and" (like "hundred and fifty two") + local top = #stack + + -- If the current word is a number (English or numeric), + -- and the previous word was also a number, pop the previous number + -- from the stack and push the addition of the two numbers. + -- Otherwise, push the new number. + + local number = tonumber (word) -- try for numeric (eg. 22 thousand) + + if number then + number = bc.number (number) -- turn into "big number" + else + number = numbers [word] + end -- if a number-word "like: twenty" + + if number then + if previous_type == "number" then -- eg. forty three + local previous_number = table.remove (stack, top) -- get the forty + number = number + previous_number -- add three + end -- if + table.insert (stack, number) + previous_type = "number" + else + + -- If the current word is a unit, multiply the number on the top of the stack by the unit's magnitude. + local unit = units [word] + if not unit then + return nil, "Unexpected word: " .. word + end -- not unit + previous_type = "unit" + + -- It is an error to get a unit before a number. + + if top == 0 then + return nil, "Cannot have unit before a number: " .. word + end -- starts of with something like "thousand" + + -- pop until we get something larger on the stack + local interim_result = bc.number (0) + while top > 0 and stack [top] < unit do + interim_result = interim_result + table.remove (stack, top) + top = #stack + end -- while + table.insert (stack, interim_result * unit) + + end -- if number or not + end -- if 'and' + + end -- for each word + + if #stack == 0 then + return nil, "No number found" + end -- nothing + + -- When the input has been parsed, sum all numbers on the stack. + + local result = bc.number (0) + for _, item in ipairs (stack) do + result = result + item + end -- for + + return result +end -- function convert_words_to_numbers diff --git a/cosmic rage/lua5.1.dll b/cosmic rage/lua5.1.dll new file mode 100644 index 0000000..c1cf15b Binary files /dev/null and b/cosmic rage/lua5.1.dll differ diff --git a/cosmic rage/lua51.dll b/cosmic rage/lua51.dll new file mode 100644 index 0000000..3ac558f Binary files /dev/null and b/cosmic rage/lua51.dll differ diff --git a/cosmic rage/luacom.dll b/cosmic rage/luacom.dll new file mode 100644 index 0000000..74cf50f Binary files /dev/null and b/cosmic rage/luacom.dll differ diff --git a/cosmic rage/mime/core.dll b/cosmic rage/mime/core.dll new file mode 100644 index 0000000..8de5805 Binary files /dev/null and b/cosmic rage/mime/core.dll differ diff --git a/cosmic rage/mushReader.dll b/cosmic rage/mushReader.dll new file mode 100644 index 0000000..0d17462 Binary files /dev/null and b/cosmic rage/mushReader.dll differ diff --git a/cosmic rage/mushclient.cnt b/cosmic rage/mushclient.cnt new file mode 100644 index 0000000..4241522 --- /dev/null +++ b/cosmic rage/mushclient.cnt @@ -0,0 +1,1194 @@ +; +; Amended on 30th November 2005 +; +:Base MUSHclient.hlp +:Title MUSHclient help +; +; -- Top-level topics -- +; +1 Program features=DOC_features +1 Connecting to a MUD=DOC_starting +1 Main Contents Page=DOC_contents +; +; -- Introduction -- +; +1 Introduction +2 Getting Started=DOC_starting +2 Using the MUSHclient world window=DLG_IDR_MUSHCLTYPE +2 General Information=DOC_contents +; +; -- General topics -- +; +1 General +2 Activity window=DOC_activity +2 Aliases=DOC_aliases +2 Arrays=DOC_Arrays +2 Auto-mapper=DOC_mapper +2 Chat system=DOC_chat +2 Colour management=DOC_colours +2 Commented softcode=DOC_send_paste +2 Default triggers/aliases/timers/macros/colours=DOC_defaults +2 Getting started=DOC_starting +2 Groups=DOC_group +2 Info bar - programmable information bar=DOC_infobar +2 Information=DOC_info +2 Keypad navigation=DOC_keypad +2 Logging=DOC_logging +2 Lua base functions=DOC_lua_base +2 Lua coroutine functions=DOC_lua_coroutines +2 Lua debug functions=DOC_lua_debug +2 Lua io functions=DOC_lua_io +2 Lua math functions=DOC_lua_math +2 Lua os functions=DOC_lua_os +2 Lua package functions=DOC_lua_package +2 Lua script extensions=DOC_lua +2 Lua string functions=DOC_lua_string +2 Lua table functions=DOC_lua_tables +2 Macro keys=DOC_macros +2 MUSHclient=DOC_contents +2 MXP - Mud Extension Protocol=DOC_mxp +2 Notepad=DOC_notepad +2 Notes=DOC_note +2 Option setting and retrieval=DOC_options +2 Plugins=DOC_plugins +2 Program features=DOC_features +2 Registration=DOC_register +2 Regular Expressions=DOC_regexp +2 Scripting=DOC_scripting +2 Scripting callbacks - MXP=DOC_mxp_callbacks +2 Scripting callbacks - plugins=DOC_plugin_callbacks +2 Scripting data types=DOC_data_types +2 Scripting functions list=DOC_function_list +2 Scripting return codes=DOC_errors +2 Sending to the world=DOC_send +2 Speed walking=DOC_speed_walking +2 Spell checker=DOC_spellcheck +2 Timers=DOC_timers +2 Triggers=DOC_triggers +2 Utilities=DOC_utils +2 Variables=DOC_variables +2 World functions=DOC_world + +; +; -- World configuration -- +; +1 World configuration +2 General +; +; -- Configuration -> General -- +; +3 General=DLG_IDD_PREFS_P0 +3 World name and TCP/IP address=DLG_IDD_PREFS_P1 +3 Connecting=DLG_IDD_PREFS_P21 +3 Logging=DLG_IDD_PREFS_P4 +3 Timers=DLG_IDD_PREFS_P16 +3 Chat=DLG_IDD_PREFS_P23 +3 Info=DLG_IDD_PREFS_P15 +3 Notes=DLG_IDD_PREFS_P11 +; +; -- Configuration -> Appearance -- +; +2 Appearance +3 Output=DLG_IDD_PREFS_P14 +3 MXP / Pueblo=DLG_IDD_PREFS_P22 +3 ANSI Colour=DLG_IDD_PREFS_P5 +3 Custom Colour=DLG_IDD_PREFS_P3 +3 Trigger configuration list=DLG_IDD_PREFS_P8 +3 Printing=DLG_IDD_PREFS_P20 +; +; -- Configuration -> Input -- +; +2 Input +3 Commands=DLG_IDD_PREFS_P9 +3 Alias configuration (list)=DLG_IDD_PREFS_P7 +3 Configure numeric keypad=DLG_IDD_PREFS_P12 +3 Macros=DLG_IDD_PREFS_P6 +3 Auto Say=DLG_IDD_PREFS_P19 +3 Paste=DLG_IDD_PREFS_P13 +3 Send=DLG_IDD_PREFS_P10 +; +; -- Configuration -> Scripting -- +; +2 Scripting +3 Scripts=DLG_IDD_PREFS_P17 +3 Variables configuration (list)=DLG_IDD_PREFS_P18 +; +; -- Global configuration -- +; +1 Global configuration +2 World lists and directories=DLG_IDD_GLOBAL_PREFSP1 +2 General options=DLG_IDD_GLOBAL_PREFSP2 +2 Closing options=DLG_IDD_GLOBAL_PREFSP3 +2 Printing=DLG_IDD_GLOBAL_PREFSP4 +2 Logging=DLG_IDD_GLOBAL_PREFSP5 +2 Timers=DLG_IDD_GLOBAL_PREFSP6 +2 Activity window=DLG_IDD_GLOBAL_PREFSP7 +2 Defaults=DLG_IDD_GLOBAL_PREFSP9 +2 Notepad=DLG_IDD_GLOBAL_PREFSP10 +2 Tray=DLG_IDD_GLOBAL_PREFSP11 +2 Plugins=DLG_IDD_GLOBAL_PREFSP12 +2 Lua=DLG_IDD_GLOBAL_PREFSP13 +; +; -- Scripting -- +; +1 Scripting +2 Introduction=DOC_scripting +2 Data types=DOC_data_types +2 Return codes=DOC_errors +2 Scripting callbacks - MXP=DOC_mxp_callbacks +2 Scripting callbacks - plugins=DOC_plugin_callbacks +2 Variables=DOC_variables +2 Lua scripting topics +3 Lua syntax=DOC_lua_syntax +3 Lua script extensions=DOC_lua +3 Lua base functions=DOC_lua_base +3 Lua bc (big number) library=DOC_lua_bc +3 Lua bit manipulation library=DOC_lua_bit +3 Lua coroutine functions=DOC_lua_coroutines +3 Lua debug functions=DOC_lua_debug +3 Lua io functions=DOC_lua_io +3 Lua math functions=DOC_lua_math +3 Lua os functions=DOC_lua_os +3 Lua package functions=DOC_lua_package +3 Lua PCRE regular expression library=DOC_lua_rex +3 Lua string functions=DOC_lua_string +3 Lua table functions=DOC_lua_tables +3 Lua utilities=DOC_lua_utils +; +; -- Script functions list -- +; +2 World function list +3 Accelerator=FNC_Accelerator +3 Accelerator=FNC_AcceleratorTo +3 AcceleratorList=FNC_AcceleratorList +3 Activate=FNC_Activate +3 ActivateClient=FNC_ActivateClient +3 ActivateNotepad=FNC_ActivateNotepad +3 AddAlias=FNC_AddAlias +3 AddFont=FNC_AddFont +3 AddMapperComment=FNC_AddMapperComment +3 AddSpellCheckWord=FNC_AddSpellCheckWord +3 AddTimer=FNC_AddTimer +3 AddToMapper=FNC_AddToMapper +3 AddTrigger=FNC_AddTrigger +3 AddTriggerEx=FNC_AddTriggerEx +3 AdjustColour=FNC_AdjustColour +3 ANSI=FNC_ANSI +3 AnsiNote=FNC_AnsiNote +3 AppendToNotepad=FNC_AppendToNotepad +3 ArrayClear=FNC_ArrayClear +3 ArrayCount=FNC_ArrayCount +3 ArrayCreate=FNC_ArrayCreate +3 ArrayDelete=FNC_ArrayDelete +3 ArrayDeleteKey=FNC_ArrayDeleteKey +3 ArrayExists=FNC_ArrayExists +3 ArrayExport=FNC_ArrayExport +3 ArrayExportKeys=FNC_ArrayExportKeys +3 ArrayGet=FNC_ArrayGet +3 ArrayGetFirstKey=FNC_ArrayGetFirstKey +3 ArrayGetLastKey=FNC_ArrayGetLastKey +3 ArrayImport=FNC_ArrayImport +3 ArrayKeyExists=FNC_ArrayKeyExists +3 ArrayListAll=FNC_ArrayListAll +3 ArrayListKeys=FNC_ArrayListKeys +3 ArrayListValues=FNC_ArrayListValues +3 ArraySet=FNC_ArraySet +3 ArraySize=FNC_ArraySize +3 Base64Decode=FNC_Base64Decode +3 Base64Encode=FNC_Base64Encode +3 BlendPixel=FNC_BlendPixel +3 Bookmark=FNC_Bookmark +3 BoldColour=FNC_BoldColour +3 BroadcastPlugin=FNC_BroadcastPlugin +3 CallPlugin=FNC_CallPlugin +3 ChangeDir=FNC_ChangeDir +3 ChatAcceptCalls=FNC_ChatAcceptCalls +3 ChatCall=FNC_ChatCall +3 ChatCallzChat=FNC_ChatCallzChat +3 ChatDisconnect=FNC_ChatDisconnect +3 ChatDisconnectAll=FNC_ChatDisconnectAll +3 ChatEverybody=FNC_ChatEverybody +3 ChatGetID=FNC_ChatGetID +3 ChatGroup=FNC_ChatGroup +3 ChatID=FNC_ChatID +3 ChatMessage=FNC_ChatMessage +3 ChatNameChange=FNC_ChatNameChange +3 ChatNote=FNC_ChatNote +3 ChatPasteEverybody=FNC_ChatPasteEverybody +3 ChatPasteText=FNC_ChatPasteText +3 ChatPeekConnections=FNC_ChatPeekConnections +3 ChatPersonal=FNC_ChatPersonal +3 ChatPing=FNC_ChatPing +3 ChatRequestConnections=FNC_ChatRequestConnections +3 ChatSendFile=FNC_ChatSendFile +3 ChatStopAcceptingCalls=FNC_ChatStopAcceptingCalls +3 ChatStopFileTransfer=FNC_ChatStopFileTransfer +3 CloseLog=FNC_CloseLog +3 CloseNotepad=FNC_CloseNotepad +3 ColourNameToRGB=FNC_ColourNameToRGB +3 ColourNote=FNC_ColourNote +3 ColourTell=FNC_ColourTell +3 Connect=FNC_Connect +3 CreateGUID=FNC_CreateGUID +3 CustomColourBackground=FNC_CustomColourBackground +3 CustomColourText=FNC_CustomColourText +3 DatabaseChanges=FNC_DatabaseChanges +3 DatabaseClose=FNC_DatabaseClose +3 DatabaseColumnName=FNC_DatabaseColumnName +3 DatabaseColumnNames=FNC_DatabaseColumnNames +3 DatabaseColumns=FNC_DatabaseColumns +3 DatabaseColumnText=FNC_DatabaseColumnText +3 DatabaseColumnType=FNC_DatabaseColumnType +3 DatabaseColumnValue=FNC_DatabaseColumnValue +3 DatabaseColumnValues=FNC_DatabaseColumnValues +3 DatabaseError=FNC_DatabaseError +3 DatabaseExec=FNC_DatabaseExec +3 DatabaseFinalize=FNC_DatabaseFinalize +3 DatabaseGetField=FNC_DatabaseGetField +3 DatabaseInfo=FNC_DatabaseInfo +3 DatabaseLastInsertRowid=FNC_DatabaseLastInsertRowid +3 DatabaseList=FNC_DatabaseList +3 DatabaseOpen=FNC_DatabaseOpen +3 DatabasePrepare=FNC_DatabasePrepare +3 DatabaseReset=FNC_DatabaseReset +3 DatabaseStep=FNC_DatabaseStep +3 DatabaseTotalChanges=FNC_DatabaseTotalChanges +3 Debug=FNC_Debug +3 DeleteAlias=FNC_DeleteAlias +3 DeleteAliasGroup=FNC_DeleteAliasGroup +3 DeleteAllMapItems=FNC_DeleteAllMapItems +3 DeleteCommandHistory=FNC_DeleteCommandHistory +3 DeleteGroup=FNC_DeleteGroup +3 DeleteLastMapItem=FNC_DeleteLastMapItem +3 DeleteLines=FNC_DeleteLines +3 DeleteOutput=FNC_DeleteOutput +3 DeleteTemporaryAliases=FNC_DeleteTemporaryAliases +3 DeleteTemporaryTimers=FNC_DeleteTemporaryTimers +3 DeleteTemporaryTriggers=FNC_DeleteTemporaryTriggers +3 DeleteTimer=FNC_DeleteTimer +3 DeleteTimerGroup=FNC_DeleteTimerGroup +3 DeleteTrigger=FNC_DeleteTrigger +3 DeleteTriggerGroup=FNC_DeleteTriggerGroup +3 DeleteVariable=FNC_DeleteVariable +3 DiscardQueue=FNC_DiscardQueue +3 Disconnect=FNC_Disconnect +3 DoAfter=FNC_DoAfter +3 DoAfterNote=FNC_DoAfterNote +3 DoAfterSpecial=FNC_DoAfterSpecial +3 DoAfterSpeedWalk=FNC_DoAfterSpeedWalk +3 DockToolBarNextTo=FNC_DockToolBarNextTo +3 DoCommand=FNC_DoCommand +3 EchoInput=FNC_EchoInput +3 EditDistance=FNC_EditDistance +3 EnableAlias=FNC_EnableAlias +3 EnableAliasGroup=FNC_EnableAliasGroup +3 EnableGroup=FNC_EnableGroup +3 EnableMapping=FNC_EnableMapping +3 EnablePlugin=FNC_EnablePlugin +3 EnableTimer=FNC_EnableTimer +3 EnableTimerGroup=FNC_EnableTimerGroup +3 EnableTrigger=FNC_EnableTrigger +3 EnableTriggerGroup=FNC_EnableTriggerGroup +3 ErrorDesc=FNC_ErrorDesc +3 EvaluateSpeedwalk=FNC_EvaluateSpeedwalk +3 Execute=FNC_Execute +3 ExportXML=FNC_ExportXML +3 FilterPixel=FNC_FilterPixel +3 FixupEscapeSequences=FNC_FixupEscapeSequences +3 FixupHTML=FNC_FixupHTML +3 FlashIcon=FNC_FlashIcon +3 FlushLog=FNC_FlushLog +3 GenerateName=FNC_GenerateName +3 GetAlias=FNC_GetAlias +3 GetAliasInfo=FNC_GetAliasInfo +3 GetAliasList=FNC_GetAliasList +3 GetAliasOption=FNC_GetAliasOption +3 GetAliasWildcard=FNC_GetAliasWildcard +3 GetAlphaOption=FNC_GetAlphaOption +3 GetAlphaOptionList=FNC_GetAlphaOptionList +3 GetChatInfo=FNC_GetChatInfo +3 GetChatList=FNC_GetChatList +3 GetChatOption=FNC_GetChatOption +3 GetClipboard=FNC_GetClipboard +3 GetCommand=FNC_GetCommand +3 GetCommandList=FNC_GetCommandList +3 GetConnectDuration=FNC_GetConnectDuration +3 GetCurrentValue=FNC_GetCurrentValue +3 GetCustomColourName=FNC_GetCustomColourName +3 GetDefaultValue=FNC_GetDefaultValue +3 GetDeviceCaps=FNC_GetDeviceCaps +3 GetEntity=FNC_GetEntity +3 GetFrame=FNC_GetFrame +3 GetGlobalOption=FNC_GetGlobalOption +3 GetGlobalOptionList=FNC_GetGlobalOptionList +3 GetHostAddress=FNC_GetHostAddress +3 GetHostName=FNC_GetHostName +3 GetInfo=FNC_GetInfo +3 GetInternalCommandsList=FNC_GetInternalCommandsList +3 GetLineCount=FNC_GetLineCount +3 GetLineInfo=FNC_GetLineInfo +3 GetLinesInBufferCount=FNC_GetLinesInBufferCount +3 GetLoadedValue=FNC_GetLoadedValue +3 GetMainWindowPosition=FNC_GetMainWindowPosition +3 GetMapColour=FNC_GetMapColour +3 GetMappingCount=FNC_GetMappingCount +3 GetMappingItem=FNC_GetMappingItem +3 GetMappingString=FNC_GetMappingString +3 Metaphone=FNC_Metaphone +3 GetNotepadLength=FNC_GetNotepadLength +3 GetNotepadList=FNC_GetNotepadList +3 GetNotepadText=FNC_GetNotepadText +3 GetNotepadWindowPosition=FNC_GetNotepadWindowPosition +3 GetNotes=FNC_GetNotes +3 GetNoteStyle=FNC_GetNoteStyle +3 GetOption=FNC_GetOption +3 GetOptionList=FNC_GetOptionList +3 GetPluginAliasInfo=FNC_GetPluginAliasInfo +3 GetPluginAliasList=FNC_GetPluginAliasList +3 GetPluginAliasList=FNC_GetPluginAliasOption +3 GetPluginID=FNC_GetPluginID +3 GetPluginInfo=FNC_GetPluginInfo +3 GetPluginList=FNC_GetPluginList +3 GetPluginName=FNC_GetPluginName +3 GetPluginTimerInfo=FNC_GetPluginTimerInfo +3 GetPluginTimerList=FNC_GetPluginTimerList +3 GetPluginTimerList=FNC_GetPluginTimerOption +3 GetPluginTriggerInfo=FNC_GetPluginTriggerInfo +3 GetPluginTriggerList=FNC_GetPluginTriggerList +3 GetPluginTriggerList=FNC_GetPluginTriggerOption +3 GetPluginVariable=FNC_GetPluginVariable +3 GetPluginVariableList=FNC_GetPluginVariableList +3 GetQueue=FNC_GetQueue +3 GetReceivedBytes=FNC_GetReceivedBytes +3 GetRecentLines=FNC_GetRecentLines +3 GetScriptTime=FNC_GetScriptTime +3 GetSelectionEndColumn=FNC_GetSelectionEndColumn +3 GetSelectionEndLine=FNC_GetSelectionEndLine +3 GetSelectionStartColumn=FNC_GetSelectionStartColumn +3 GetSelectionStartLine=FNC_GetSelectionStartLine +3 GetSentBytes=FNC_GetSentBytes +3 GetSoundStatus=FNC_GetSoundStatus +3 GetStyleInfo=FNC_GetStyleInfo +3 GetSysColor=FNC_GetSysColor +3 GetSystemMetrics=FNC_GetSystemMetrics +3 GetTimer=FNC_GetTimer +3 GetTimerInfo=FNC_GetTimerInfo +3 GetTimerList=FNC_GetTimerList +3 GetTimerOption=FNC_GetTimerOption +3 GetTrigger=FNC_GetTrigger +3 GetTriggerInfo=FNC_GetTriggerInfo +3 GetTriggerList=FNC_GetTriggerList +3 GetTriggerOption=FNC_GetTriggerOption +3 GetTriggerWildcard=FNC_GetTriggerWildcard +3 GetUdpPort=FNC_GetUdpPort +3 GetUniqueID=FNC_GetUniqueID +3 GetUniqueNumber=FNC_GetUniqueNumber +3 GetVariable=FNC_GetVariable +3 GetVariableList=FNC_GetVariableList +3 GetWorld=FNC_GetWorld +3 GetWorldById=FNC_GetWorldById +3 GetWorldID=FNC_GetWorldID +3 GetWorldIdList=FNC_GetWorldIdList +3 GetWorldList=FNC_GetWorldList +3 GetWorldWindowPosition=FNC_GetWorldWindowPosition +3 GetWorldWindowPositionX=FNC_GetWorldWindowPositionX +3 GetXMLEntity=FNC_GetXMLEntity +3 Hash=FNC_Hash +3 Help=FNC_Help +3 Hyperlink=FNC_Hyperlink +3 ImportXML=FNC_ImportXML +3 Info=FNC_Info +3 InfoBackground=FNC_InfoBackground +3 InfoClear=FNC_InfoClear +3 InfoColour=FNC_InfoColour +3 InfoFont=FNC_InfoFont +3 IsAlias=FNC_IsAlias +3 IsConnected=FNC_IsConnected +3 IsLogOpen=FNC_IsLogOpen +3 IsPluginInstalled=FNC_IsPluginInstalled +3 IsTimer=FNC_IsTimer +3 IsTrigger=FNC_IsTrigger +3 LoadPlugin=FNC_LoadPlugin +3 LogInput=FNC_LogInput +3 LogNotes=FNC_LogNotes +3 LogOutput=FNC_LogOutput +3 LogSend=FNC_LogSend +3 MakeRegularExpression=FNC_MakeRegularExpression +3 MapColour=FNC_MapColour +3 MapColourList=FNC_MapColourList +3 Menu=FNC_Menu +3 Mapping=FNC_Mapping +3 MoveMainWindow=FNC_MoveMainWindow +3 MoveNotepadWindow=FNC_MoveNotepadWindow +3 MoveWorldWindow=FNC_MoveWorldWindow +3 MoveWorldWindowX=FNC_MoveWorldWindowX +3 MtRand=FNC_MtRand +3 MtSrand=FNC_MtSrand +3 NormalColour=FNC_NormalColour +3 Note=FNC_Note +3 NoteColour=FNC_NoteColour +3 NoteColourBack=FNC_NoteColourBack +3 NoteColourFore=FNC_NoteColourFore +3 NoteColourName=FNC_NoteColourName +3 NoteColourRGB=FNC_NoteColourRGB +3 NoteHr=FNC_NoteHr +3 NotepadColour=FNC_NotepadColour +3 NotepadFont=FNC_NotepadFont +3 NotepadReadOnly=FNC_NotepadReadOnly +3 NotepadSaveMethod=FNC_NotepadSaveMethod +3 NoteStyle=FNC_NoteStyle +3 Open=FNC_Open +3 OpenBrowser=FNC_OpenBrowser +3 OpenLog=FNC_OpenLog +3 PasteCommand=FNC_PasteCommand +3 Pause=FNC_Pause +3 PickColour=FNC_PickColour +3 PlaySound=FNC_PlaySound +3 PluginSupports=FNC_PluginSupports +3 PushCommand=FNC_PushCommand +3 Queue=FNC_Queue +3 ReadNamesFile=FNC_ReadNamesFile +3 Redraw=FNC_Redraw +3 ReloadPlugin=FNC_ReloadPlugin +3 RemoveBacktracks=FNC_RemoveBacktracks +3 RemoveMapReverses=FNC_RemoveMapReverses +3 Repaint=FNC_Repaint +3 Replace=FNC_Replace +3 ReplaceNotepad=FNC_ReplaceNotepad +3 Reset=FNC_Reset +3 ResetIP=FNC_ResetIP +3 ResetStatusTime=FNC_ResetStatusTime +3 ResetTimer=FNC_ResetTimer +3 ResetTimers=FNC_ResetTimers +3 ReverseSpeedwalk=FNC_ReverseSpeedwalk +3 RGBColourToName=FNC_RGBColourToName +3 Save=FNC_Save +3 SaveNotepad=FNC_SaveNotepad +3 SaveState=FNC_SaveState +3 SelectCommand=FNC_SelectCommand +3 Send=FNC_Send +3 SendImmediate=FNC_SendImmediate +3 SendPkt=FNC_SendPkt +3 SendNoEcho=FNC_SendNoEcho +3 SendPush=FNC_SendPush +3 SendSpecial=FNC_SendSpecial +3 SendToNotepad=FNC_SendToNotepad +3 SetAliasOption=FNC_SetAliasOption +3 SetAlphaOption=FNC_SetAlphaOption +3 SetBackgroundColour=FNC_SetBackgroundColour +3 SetBackgroundImage=FNC_SetBackgroundImage +3 SetChanged=FNC_SetChanged +3 SetChatOption=FNC_SetChatOption +3 SetClipboard=FNC_SetClipboard +3 SetCommand=FNC_SetCommand +3 SetCommandSelection=FNC_SetCommandSelection +3 SetCommandWindowHeight=FNC_SetCommandWindowHeight +3 SetCursor=FNC_SetCursor +3 SetCustomColourName=FNC_SetCustomColourName +3 SetEntity=FNC_SetEntity +3 SetForegroundImage=FNC_SetForegroundImage +3 SetInputFont=FNC_SetInputFont +3 SetMainTitle=FNC_SetMainTitle +3 SetNotes=FNC_SetNotes +3 SetOption=FNC_SetOption +3 SetOutputFont=FNC_SetOutputFont +3 SetStatus=FNC_SetStatus +3 SetScroll=FNC_SetScroll +3 SetTimerOption=FNC_SetTimerOption +3 SetTitle=FNC_SetTitle +3 SetToolBarPosition=FNC_SetToolBarPosition +3 SetTriggerOption=FNC_SetTriggerOption +3 SetUnseenLines=FNC_SetUnseenLines +3 SetVariable=FNC_SetVariable +3 SetWorldWindowStatus=FNC_SetWorldWindowStatus +3 ShowInfoBar=FNC_ShowInfoBar +3 ShiftTabCompleteItem=FNC_ShiftTabCompleteItem +3 Simulate=FNC_Simulate +3 Sound=FNC_Sound +3 SpeedWalkDelay=FNC_SpeedWalkDelay +3 SpellCheck=FNC_SpellCheck +3 SpellCheckCommand=FNC_SpellCheckCommand +3 SpellCheckDlg=FNC_SpellCheckDlg +3 StripANSI=FNC_StripANSI +3 StopSound=FNC_StopSound +3 StopEvaluatingTriggers=FNT_StopEvaluatingTriggers +3 Tell=FNC_Tell +3 TextRectangle=FNC_TextRectangle +3 Trace=FNC_Trace +3 TraceOut=FNC_TraceOut +3 TranslateGerman=FNC_TranslateGerman +3 TranslateDebug=FNC_TranslateDebug +3 Transparency=FNC_Transparency +3 Trim=FNC_Trim +3 UdpListen=FNC_UdpListen +3 UdpPortList=FNC_UdpPortList +3 UdpSend=FNC_UdpSend +3 UnloadPlugin=FNC_UnloadPlugin +3 Version=FNC_Version +3 WindowAddHotspot=FNC_WindowAddHotspot +3 WindowArc=FNC_WindowArc +3 WindowBezier=FNC_WindowBezier +3 WindowBlendImage=FNC_WindowBlendImage +3 WindowCircleOp=FNC_WindowCircleOp +3 WindowCreate=FNC_WindowCreate +3 WindowCreateImage=FNC_WindowCreateImage +3 WindowDelete=FNC_WindowDelete +3 WindowDeleteAllHotspots=FNC_WindowDeleteAllHotspots +3 WindowDeleteHotspot=FNC_WindowDeleteHotspot +3 WindowDragHandler=FNC_WindowDragHandler +3 WindowDrawImage=FNC_WindowDrawImage +3 WindowDrawImageAlpha=FNC_WindowDrawImageAlpha +3 WindowFilter=FNC_WindowFilter +3 WindowFont=FNC_WindowFont +3 WindowFontInfo=FNC_WindowFontInfo +3 WindowFontList=FNC_WindowFontList +3 WindowGetImageAlpha=FNC_WindowGetImageAlpha +3 WindowGetPixel=FNC_WindowGetPixel +3 WindowImageFromWindow=FNC_WindowImageFromWindow +3 WindowImageInfo=FNC_WindowImageInfo +3 WindowImageList=FNC_WindowImageList +3 WindowImageOp=FNC_WindowImageOp +3 WindowHotspotInfo=FNC_WindowHotspotInfo +3 WindowHotspotList=FNC_WindowHotspotList +3 WindowHotspotTooltip=FNC_WindowHotspotTooltip +3 WindowInfo=FNC_WindowInfo +3 WindowLine=FNC_WindowLine +3 WindowList=FNC_WindowList +3 WindowLoadImage=FNC_WindowLoadImage +3 WindowMenu=FNC_WindowMenu +3 WindowMergeImageAlpha=FNC_WindowMergeImageAlpha +3 WindowMoveHotspot=FNC_WindowMoveHotspot +3 WindowPolygon=FNC_WindowPolygon +3 WindowPosition=FNC_WindowPosition +3 WindowRectOp=FNC_WindowRectOp +3 WindowResize=FNC_WindowResize +3 WindowScrollwheelHandler=FNC_WindowScrollwheelHandler +3 WindowSetPixel=FNC_WindowSetPixel +3 WindowSetZOrder=FNC_WindowSetZOrder +3 WindowShow=FNC_WindowShow +3 WindowText=FNC_WindowText +3 WindowTextWidth=FNC_WindowTextWidth +3 WindowTransformImage=FNC_WindowTransformImage +3 WindowWrite=FNC_WindowWrite +3 WorldAddress=FNC_WorldAddress +3 WorldName=FNC_WorldName +3 WorldPort=FNC_WorldPort +3 WriteLog=FNC_WriteLog +; +; Lua function list +; +2 Lua function list +3 assert=LUA_assert +3 assignment=LUA_assignment +3 bc.add=LUA_bc.add +3 bc.compare=LUA_bc.compare +3 bc.digits=LUA_bc.digits +3 bc.div=LUA_bc.div +3 bc.divmod=LUA_bc.divmod +3 bc.isneg=LUA_bc.isneg +3 bc.iszero=LUA_bc.iszero +3 bc.mod=LUA_bc.mod +3 bc.mul=LUA_bc.mul +3 bc.neg=LUA_bc.neg +3 bc.number=LUA_bc.number +3 bc.pow=LUA_bc.pow +3 bc.powmod=LUA_bc.powmod +3 bc.sqrt=LUA_bc.sqrt +3 bc.sub=LUA_bc.sub +3 bc.tonumber=LUA_bc.tonumber +3 bc.tostring=LUA_bc.tostring +3 bc.trunc=LUA_bc.trunc +3 bc.version=LUA_bc.version +3 bit.ashr=LUA_bit.ashr +3 bit.band=LUA_bit.band +3 bit.bor=LUA_bit.bor +3 bit.clear=LUA_bit.clear +3 bit.mod=LUA_bit.mod +3 bit.neg=LUA_bit.neg +3 bit.shl=LUA_bit.shl +3 bit.shr=LUA_bit.shr +3 bit.test=LUA_bit.test +3 bit.tonumber=LUA_bit.tonumber +3 bit.tostring=LUA_bit.tostring +3 bit.xor=LUA_bit.xor +3 break=LUA_break +3 collectgarbage=LUA_collectgarbage +3 comments=LUA_comments +3 context:aggregate_count=LUA_context:aggregate_count +3 context:get_aggregate_data=LUA_context:get_aggregate_data +3 context:result=LUA_context:result +3 context:result_blob=LUA_context:result_blob +3 context:result_error=LUA_context:result_error +3 context:result_int=LUA_context:result_int +3 context:result_null=LUA_context:result_null +3 context:result_number=LUA_context:result_number +3 context:result_text=LUA_context:result_text +3 context:set_aggregate_data=LUA_context:set_aggregate_data +3 context:user_data=LUA_context:user_data +3 coroutine.create=LUA_coroutine.create +3 coroutine.resume=LUA_coroutine.resume +3 coroutine.running=LUA_coroutine.running +3 coroutine.status=LUA_coroutine.status +3 coroutine.wrap=LUA_coroutine.wrap +3 coroutine.yield=LUA_coroutine.yield +3 data types=LUA_data types +3 db:busy_handler=LUA_db:busy_handler +3 db:busy_timeout=LUA_db:busy_timeout +3 db:changes=LUA_db:changes +3 db:close=LUA_db:close +3 db:close_vm=LUA_db:close_vm +3 db:create_aggregate=LUA_db:create_aggregate +3 db:create_collation=LUA_db:create_collation +3 db:create_function=LUA_db:create_function +3 db:errcode=LUA_db:errcode +3 db:errmsg=LUA_db:errmsg +3 db:exec=LUA_db:exec +3 db:interrupt=LUA_db:interrupt +3 db:isopen=LUA_db:isopen +3 db:last_insert_rowid=LUA_db:last_insert_rowid +3 db:nrows=LUA_db:nrows +3 db:prepare=LUA_db:prepare +3 db:progress_handler=LUA_db:progress_handler +3 db:rows=LUA_db:rows +3 db:total_changes=LUA_db:total_changes +3 db:trace=LUA_db:trace +3 db:urows=LUA_db:urows +3 debug.debug=LUA_debug.debug +3 debug.getfenv=LUA_debug.getfenv +3 debug.gethook=LUA_debug.gethook +3 debug.getinfo=LUA_debug.getinfo +3 debug.getlocal=LUA_debug.getlocal +3 debug.getmetatable=LUA_debug.getmetatable +3 debug.getregistry=LUA_debug.getregistry +3 debug.getupvalue=LUA_debug.getupvalue +3 debug.setfenv=LUA_debug.setfenv +3 debug.sethook=LUA_debug.sethook +3 debug.setlocal=LUA_debug.setlocal +3 debug.setmetatable=LUA_debug.setmetatable +3 debug.setupvalue=LUA_debug.setupvalue +3 debug.traceback=LUA_debug.traceback +3 do=LUA_do +3 dofile=LUA_dofile +3 error=LUA_error +3 f:close=LUA_f:close +3 f:flush=LUA_f:flush +3 f:lines=LUA_f:lines +3 f:read=LUA_f:read +3 f:seek=LUA_f:seek +3 f:setvbuf=LUA_f:setvbuf +3 f:write=LUA_f:write +3 for (generic)=LUA_for (generic) +3 for (numeric)=LUA_for (numeric) +3 function=LUA_function +3 gcinfo=LUA_gcinfo +3 getfenv=LUA_getfenv +3 getmetatable=LUA_getmetatable +3 identifiers=LUA_identifiers +3 if / then / else=LUA_if / then / else +3 io.close=LUA_io.close +3 io.flush=LUA_io.flush +3 io.input=LUA_io.input +3 io.lines=LUA_io.lines +3 io.open=LUA_io.open +3 io.output=LUA_io.output +3 io.popen=LUA_io.popen +3 io.read=LUA_io.read +3 io.stderr=LUA_io.stderr +3 io.stdin=LUA_io.stdin +3 io.stdout=LUA_io.stdout +3 io.tmpfile=LUA_io.tmpfile +3 io.type=LUA_io.type +3 io.write=LUA_io.write +3 ipairs=LUA_ipairs +3 keywords=LUA_keywords +3 load=LUA_load +3 loadfile=LUA_loadfile +3 loadlib=LUA_loadlib +3 loadstring=LUA_loadstring +3 local=LUA_local +3 logical operators=LUA_logical operators +3 lpeg.B=LUA_lpeg.B +3 lpeg.C=LUA_lpeg.C +3 lpeg.Carg=LUA_lpeg.Carg +3 lpeg.Cb=LUA_lpeg.Cb +3 lpeg.Cc=LUA_lpeg.Cc +3 lpeg.Cf=LUA_lpeg.Cf +3 lpeg.Cg=LUA_lpeg.Cg +3 lpeg.Cmt=LUA_lpeg.Cmt +3 lpeg.Cp=LUA_lpeg.Cp +3 lpeg.Cs=LUA_lpeg.Cs +3 lpeg.Ct=LUA_lpeg.Ct +3 lpeg.locale=LUA_lpeg.locale +3 lpeg.match=LUA_lpeg.match +3 lpeg.P=LUA_lpeg.P +3 lpeg.print=LUA_lpeg.print +3 lpeg.R=LUA_lpeg.R +3 lpeg.S=LUA_lpeg.S +3 lpeg.setmaxstack=LUA_lpeg.setmaxstack +3 lpeg.type=LUA_lpeg.type +3 lpeg.V=LUA_lpeg.V +3 lpeg.version=LUA_lpeg.version +3 math.abs=LUA_math.abs +3 math.acos=LUA_math.acos +3 math.asin=LUA_math.asin +3 math.atan=LUA_math.atan +3 math.atan2=LUA_math.atan2 +3 math.ceil=LUA_math.ceil +3 math.cos=LUA_math.cos +3 math.cosh=LUA_math.cosh +3 math.deg=LUA_math.deg +3 math.exp=LUA_math.exp +3 math.floor=LUA_math.floor +3 math.fmod=LUA_math.fmod +3 math.frexp=LUA_math.frexp +3 math.huge=LUA_math.huge +3 math.ldexp=LUA_math.ldexp +3 math.log=LUA_math.log +3 math.log10=LUA_math.log10 +3 math.max=LUA_math.max +3 math.min=LUA_math.min +3 math.modf=LUA_math.modf +3 math.pi=LUA_math.pi +3 math.pow=LUA_math.pow +3 math.rad=LUA_math.rad +3 math.random=LUA_math.random +3 math.randomseed=LUA_math.randomseed +3 math.sin=LUA_math.sin +3 math.sinh=LUA_math.sinh +3 math.sqrt=LUA_math.sqrt +3 math.tan=LUA_math.tan +3 math.tanh=LUA_math.tanh +3 module=LUA_module +3 next=LUA_next +3 os.clock=LUA_os.clock +3 os.date=LUA_os.date +3 os.difftime=LUA_os.difftime +3 os.execute=LUA_os.execute +3 os.exit=LUA_os.exit +3 os.getenv=LUA_os.getenv +3 os.remove=LUA_os.remove +3 os.rename=LUA_os.rename +3 os.setlocale=LUA_os.setlocale +3 os.time=LUA_os.time +3 os.tmpname=LUA_os.tmpname +3 package.config=LUA_package.config +3 package.cpath=LUA_package.cpath +3 package.loaded=LUA_package.loaded +3 package.loaders=LUA_package.loaders +3 package.loadlib=LUA_package.loadlib +3 package.path=LUA_package.path +3 package.preload=LUA_package.preload +3 package.seeall=LUA_package.seeall +3 pairs=LUA_pairs +3 pcall=LUA_pcall +3 precedence=LUA_precedence +3 print=LUA_print +3 rawequal=LUA_rawequal +3 rawget=LUA_rawget +3 rawset=LUA_rawset +3 re:exec=LUA_re:exec +3 re:gmatch=LUA_re:gmatch +3 re:match=LUA_re:match +3 relational operators=LUA_relational operators +3 repeat=LUA_repeat +3 require=LUA_require +3 return=LUA_return +3 rex.flags=LUA_rex.flags +3 rex.new=LUA_rex.new +3 select=LUA_select +3 setfenv=LUA_setfenv +3 setmetatable=LUA_setmetatable +3 sqlite3.complete=LUA_sqlite3.complete +3 sqlite3.open=LUA_sqlite3.open +3 sqlite3.open_memory=LUA_sqlite3.open_memory +3 sqlite3.version=LUA_sqlite3.version +3 stmt:bind=LUA_stmt:bind +3 stmt:bind_blob=LUA_stmt:bind_blob +3 stmt:bind_names=LUA_stmt:bind_names +3 stmt:bind_parameter_count=LUA_stmt:bind_parameter_count +3 stmt:bind_parameter_name=LUA_stmt:bind_parameter_name +3 stmt:bind_values=LUA_stmt:bind_values +3 stmt:columns=LUA_stmt:columns +3 stmt:finalize=LUA_stmt:finalize +3 stmt:get_name=LUA_stmt:get_name +3 stmt:get_named_types=LUA_stmt:get_named_types +3 stmt:get_named_values=LUA_stmt:get_named_values +3 stmt:get_names=LUA_stmt:get_names +3 stmt:get_type=LUA_stmt:get_type +3 stmt:get_types=LUA_stmt:get_types +3 stmt:get_unames=LUA_stmt:get_unames +3 stmt:get_utypes=LUA_stmt:get_utypes +3 stmt:get_uvalues=LUA_stmt:get_uvalues +3 stmt:get_value=LUA_stmt:get_value +3 stmt:get_values=LUA_stmt:get_values +3 stmt:isopen=LUA_stmt:isopen +3 stmt:nrows=LUA_stmt:nrows +3 stmt:reset=LUA_stmt:reset +3 stmt:rows=LUA_stmt:rows +3 stmt:step=LUA_stmt:step +3 stmt:urows=LUA_stmt:urows +3 string literals=LUA_string literals +3 string.byte=LUA_string.byte +3 string.char=LUA_string.char +3 string.dump=LUA_string.dump +3 string.find=LUA_string.find +3 string.format=LUA_string.format +3 string.gfind=LUA_string.gfind +3 string.gmatch=LUA_string.gmatch +3 string.gsub=LUA_string.gsub +3 string.len=LUA_string.len +3 string.lower=LUA_string.lower +3 string.match=LUA_string.match +3 string.rep=LUA_string.rep +3 string.reverse=LUA_string.reverse +3 string.sub=LUA_string.sub +3 string.upper=LUA_string.upper +3 tables=LUA_tables +3 table.concat=LUA_table.concat +3 table.foreach=LUA_table.foreach +3 table.foreachi=LUA_table.foreachi +3 table.getn=LUA_table.getn +3 table.insert=LUA_table.insert +3 table.maxn=LUA_table.maxn +3 table.remove=LUA_table.remove +3 table.setn=LUA_table.setn +3 table.sort=LUA_table.sort +3 tonumber=LUA_tonumber +3 tostring=LUA_tostring +3 type=LUA_type +3 unpack=LUA_unpack +3 utils.activatenotepad=LUA_utils.activatenotepad +3 utils.appendtonotepad=LUA_utils.appendtonotepad +3 utils.base64decode=LUA_utils.base64decode +3 utils.base64encode=LUA_utils.base64encode +3 utils.callbackslist=LUA_utils.callbackslist +3 utils.choose=LUA_utils.choose +3 utils.compress=LUA_utils.compress +3 utils.decompress=LUA_utils.decompress +3 utils.directorypicker=LUA_utils.directorypicker +3 utils.editbox=LUA_utils.editbox +3 utils.edit_distance=LUA_utils.edit_distance +3 utils.filepicker=LUA_utils.filepicker +3 utils.filterpicker=LUA_utils.filterpicker +3 utils.fontpicker=LUA_utils.fontpicker +3 utils.fromhex=LUA_utils.fromhex +3 utils.functionlist=LUA_utils.functionlist +3 utils.getfontfamilies=LUA_utils.getfontfamilies +3 utils.hash=LUA_utils.hash +3 utils.info=LUA_utils.info +3 utils.infotypes=LUA_utils.infotypes +3 utils.inputbox=LUA_utils.inputbox +3 utils.listbox=LUA_utils.listbox +3 utils.md5=LUA_utils.md5 +3 utils.metaphone=LUA_utils.metaphone +3 utils.msgbox=LUA_utils.msgbox +3 utils.multilistbox=LUA_utils.multilistbox +3 utils.readdir=LUA_utils.readdir +3 utils.reload_global_prefs=LUA_utils.reload_global_prefs +3 utils.sendtofront=LUA_utils.sendtofront +3 utils.sha256=LUA_utils.sha256 +3 utils.shellexecute=LUA_utils.shellexecute +3 utils.spellcheckdialog=LUA_utils.spellcheckdialog +3 utils.split=LUA_utils.split +3 utils.timer=LUA_utils.timer +3 utils.tohex=LUA_utils.tohex +3 utils.umsgbox=LUA_utils.umsgbox +3 utils.utf8decode=LUA_utils.utf8decode +3 utils.utf8encode=LUA_utils.utf8encode +3 utils.utf8sub=LUA_utils.utf8sub +3 utils.utf8valid=LUA_utils.utf8valid +3 utils.xmlread=LUA_utils.xmlread +3 while=LUA_while +3 xpcall=LUA_xpcall + +; +; -- Reference -- +; +1 Reference +2 Script functions list=DOC_function_list +2 Script data types=DOC_data_types +2 Script return codes=DOC_errors +; +; -- Commands list -- +; +2 Commands list +3 About=CMD_ID_APP_ABOUT +3 ActivateInputArea=CMD_ID_KEYS_ACTIVATECOMMANDVIEW +3 ActivityList=CMD_ID_DISPLAY_ACTIVITYLIST +3 ActivityToolbar=CMD_ID_VIEW_ACTIVITYTOOLBAR +3 ActivityViewCloseWorld=CMD_ID_POPUP_FILE_CLOSE +3 ActivityViewSaveWorld=CMD_ID_POPUP_FILE_SAVE +3 ActivityViewSaveWorldAs=CMD_ID_POPUP_SAVEWORLDDETAILSAS +3 AltA=CMD_ID_ALT_A +3 AltB=CMD_ID_ALT_B +3 AltDownArrow=CMD_ID_ALT_DOWNARROW +3 AltJ=CMD_ID_ALT_J +3 AltK=CMD_ID_ALT_K +3 AltL=CMD_ID_ALT_L +3 AltM=CMD_ID_ALT_M +3 AltN=CMD_ID_ALT_N +3 AltO=CMD_ID_ALT_O +3 AltP=CMD_ID_ALT_P +3 AltQ=CMD_ID_ALT_Q +3 AltR=CMD_ID_ALT_R +3 AltS=CMD_ID_ALT_S +3 AltT=CMD_ID_ALT_T +3 AltU=CMD_ID_ALT_U +3 AltUpArrow=CMD_ID_ALT_UPARROW +3 AltV=CMD_ID_ALT_V +3 AltX=CMD_ID_ALT_X +3 AltY=CMD_ID_ALT_Y +3 AltZ=CMD_ID_ALT_Z +3 AlwaysOnTop=CMD_ID_VIEW_ALWAYSONTOP +3 ArrangeIcons=CMD_ID_WINDOW_ARRANGE +3 ASCIIart=CMD_ID_EDIT_ASCIIART +3 AutoConnect=CMD_ID_CONNECTION_AUTOCONNECT +3 AutoSay=CMD_ID_GAME_AUTOSAY +3 Base64Decode=CMD_ID_CONVERT_BASE64DECODE +3 Base64Encode=CMD_ID_CONVERT_BASE64ENCODE +3 BookmarkSelection=CMD_ID_DISPLAY_BOOKMARKSELECTION +3 BugReports=CMD_ID_HELP_BUGREPORTSUGGESTION +3 CascadeWindows=CMD_ID_WINDOW_CASCADE +3 ChatSessions=CMD_ID_GAME_CHATSESSIONS +3 ClearCommandHistory=CMD_ID_DISPLAY_CLEAR_COMMAND_HISTORY +3 ClearOutput=CMD_ID_DISPLAY_CLEAR_OUTPUT +3 Close=CMD_ID_FILE_CLOSE +3 CloseAllNotepadWindows=CMD_ID_WINDOW_CLOSEALLNOTEPADWINDOWS +3 ColourPicker=CMD_ID_EDIT_COLOURPICKER +3 CommandEnd=CMD_ID_COMMAND_END +3 CommandHistory=CMD_ID_GAME_COMMANDHISTORY +3 CommandHome=CMD_ID_COMMAND_HOME +3 ConfigureAliases=CMD_ID_GAME_CONFIGURE_ALIASES +3 ConfigureAutosay=CMD_ID_GAME_CONFIGURE_AUTOSAY +3 ConfigureChat=CMD_ID_GAME_CONFIGURE_CHAT +3 ConfigureColours=CMD_ID_GAME_CONFIGURE_COLOURS +3 ConfigureCommands=CMD_ID_GAME_CONFIGURE_COMMANDS +3 ConfigureCustomColours=CMD_ID_GAME_CONFIGURE_CUSTOM_COLOURS +3 ConfigureHighlighting=CMD_ID_GAME_CONFIGURE_HIGHLIGHTING +3 ConfigureKeypad=CMD_ID_GAME_CONFIGURE_KEYPAD +3 ConfigureLogging=CMD_ID_GAME_CONFIGURE_LOGGING +3 ConfigureMacros=CMD_ID_GAME_CONFIGURE_MACROS +3 ConfigureMudaddress=CMD_ID_GAME_CONFIGURE_MUDADDRESS +3 ConfigureMxpPueblo=CMD_ID_GAME_CONFIGURE_MXPPUEBLO +3 ConfigureNameAndPassword=CMD_ID_GAME_CONFIGURE_NAME_AND_PASSWORD +3 ConfigureNotes=CMD_ID_GAME_CONFIGURE_NOTES +3 ConfigureOutput=CMD_ID_GAME_CONFIGURE_OUTPUT +3 ConfigurePasteToWorld=CMD_ID_GAME_CONFIGURE_PASTETOWORLD +3 ConfigurePrinting=CMD_ID_GAME_CONFIGURE_PRINTING +3 ConfigureScripting=CMD_ID_GAME_CONFIGURE_SCRIPTING +3 ConfigureSendFile=CMD_ID_GAME_CONFIGURE_SENDFILE +3 ConfigureTimers=CMD_ID_GAME_CONFIGURE_TIMERS +3 ConfigureTriggers=CMD_ID_GAME_CONFIGURE_TRIGGERS +3 ConfigureVariables=CMD_ID_GAME_CONFIGURE_VARIABLES +3 Connect=CMD_ID_CONNECTION_CONNECT +3 ConnectToAllOpenWorlds=CMD_ID_CONNECTION_CONNECTTOALLOPENWORLDS +3 ConnectToWorldsInStartupList=CMD_ID_CONNECTION_CONNECTTOWORLDSINSTARTUPLIST +3 Connect_Or_Reconnect=CMD_ID_CONNECT_DISCONNECT +3 ContextHelp=CMD_ID_CONTEXT_HELP +3 ConvertHTMLspecial=CMD_ID_CONVERT_CONVERTHTMLSPECIAL +3 Copy=CMD_ID_EDIT_COPY +3 CopyAsHTML=CMD_ID_EDIT_COPYASHTML +3 CtrlKeypad0=CMD_ID_CTRL_KEYPAD_0 +3 CtrlKeypad1=CMD_ID_CTRL_KEYPAD_1 +3 CtrlKeypad2=CMD_ID_CTRL_KEYPAD_2 +3 CtrlKeypad3=CMD_ID_CTRL_KEYPAD_3 +3 CtrlKeypad4=CMD_ID_CTRL_KEYPAD_4 +3 CtrlKeypad5=CMD_ID_CTRL_KEYPAD_5 +3 CtrlKeypad6=CMD_ID_CTRL_KEYPAD_6 +3 CtrlKeypad7=CMD_ID_CTRL_KEYPAD_7 +3 CtrlKeypad8=CMD_ID_CTRL_KEYPAD_8 +3 CtrlKeypad9=CMD_ID_CTRL_KEYPAD_9 +3 CtrlKeypadDash=CMD_ID_CTRL_KEYPAD_DASH +3 CtrlKeypadDot=CMD_ID_CTRL_KEYPAD_DOT +3 CtrlKeypadPlus=CMD_ID_CTRL_KEYPAD_PLUS +3 CtrlKeypadSlash=CMD_ID_CTRL_KEYPAD_SLASH +3 CtrlKeypadStar=CMD_ID_CTRL_KEYPAD_STAR +3 CtrlN=CMD_ID_FILE_CTRL_N +3 Cut=CMD_ID_EDIT_CUT +3 DebugIncomingPackets=CMD_ID_EDIT_DEBUGINCOMINGPACKETS +3 DebugWorldInput=CMD_ID_DEBUG_WORLD_INPUT +3 DiscardQueuedCommands=CMD_ID_INPUT_DISCARDQUEUEDCOMMANDS +3 Disconnect=CMD_ID_CONNECTION_DISCONNECT +3 DoMapperComment=CMD_ID_GAME_DOMAPPERCOMMENT +3 DoMapperSpecial=CMD_ID_GAME_DOMAPPERSPECIAL +3 DosToMac=CMD_ID_CONVERT_DOSTOMAC +3 DosToUnix=CMD_ID_CONVERT_DOSTOUNIX +3 East=CMD_ID_GAME_EAST +3 EditScriptFile=CMD_ID_GAME_EDITSCRIPTFILE +3 End=CMD_ID_TEST_END +3 Examine=CMD_ID_GAME_EXAMINE +3 ExitClient=CMD_ID_APP_EXIT +3 Find=CMD_ID_DISPLAY_FIND +3 FindAgain=CMD_ID_DISPLAY_FINDAGAIN +3 FindNextNotepad=CMD_ID_SEARCH_FINDNEXT +3 FindNotepad=CMD_ID_SEARCH_FIND +3 FlipToNotepad=CMD_ID_EDIT_FLIPTONOTEPAD +3 Forum=CMD_ID_HELP_FORUM +3 FreezeOutput=CMD_ID_DISPLAY_FREEZEOUTPUT +3 FullScreenMode=CMD_ID_VIEW_FULLSCREENMODE +3 FunctionList=CMD_ID_GAME_FUNCTIONSLIST +3 FunctionsWebPage=CMD_ID_HELP_FUNCTIONSWEBPAGE +3 GenerateCharacterName=CMD_ID_EDIT_GENERATECHARACTERNAME +3 GenerateUniqueID=CMD_ID_EDIT_GENERATEUNIQUEID +3 GettingStarted=CMD_ID_HELP_GETTINGSTARTED +3 GlobalPreferences=CMD_ID_FILE_PREFERENCES +3 GoToBookmark=CMD_ID_DISPLAY_GOTOBOOKMARK +3 GoToLine=CMD_ID_DISPLAY_GOTOLINE +3 GoToMatchingBrace=CMD_ID_EDIT_GOTOMATCHINGBRACE +3 GoToNotepadLine=CMD_ID_EDIT_GOTO +3 GoToURL=CMD_ID_DISPLAY_GOTOURL +3 Help=CMD_ID_HELP +3 HelpContents=CMD_ID_HELP_CONTENTS +3 HelpIndex=CMD_ID_HELP_INDEX +3 HighlightWord=CMD_ID_DISPLAY_HIGHLIGHTPHRASE +3 Immediate=CMD_ID_GAME_IMMEDIATE +3 Import=CMD_ID_FILE_IMPORT +3 Info=CMD_ID_GAME_CONFIGURE_INFO +3 InfoBar=CMD_ID_VIEW_INFOBAR +3 InputGlobalChange=CMD_ID_INPUT_GLOBALCHANGE +3 InsertDateTime=CMD_ID_EDIT_INSERTDATETIME +3 Introduction=CMD_ID_GETTING_STARTED +3 Keypad0=CMD_ID_KEYPAD_0 +3 Keypad1=CMD_ID_KEYPAD_1 +3 Keypad2=CMD_ID_KEYPAD_2 +3 Keypad3=CMD_ID_KEYPAD_3 +3 Keypad4=CMD_ID_KEYPAD_4 +3 Keypad5=CMD_ID_KEYPAD_5 +3 Keypad6=CMD_ID_KEYPAD_6 +3 Keypad7=CMD_ID_KEYPAD_7 +3 Keypad8=CMD_ID_KEYPAD_8 +3 Keypad9=CMD_ID_KEYPAD_9 +3 KeypadDash=CMD_ID_KEYPAD_DASH +3 KeypadDot=CMD_ID_KEYPAD_DOT +3 KeypadPlus=CMD_ID_KEYPAD_PLUS +3 KeypadSlash=CMD_ID_KEYPAD_SLASH +3 KeypadStar=CMD_ID_KEYPAD_STAR +3 KeysEscape=CMD_ID_KEYS_ESCAPE +3 KeysTab=CMD_ID_KEYS_TAB +3 LineDown=CMD_ID_TEST_LINEDOWN +3 LineUp=CMD_ID_TEST_LINEUP +3 LogSession=CMD_ID_FILE_LOGSESSION +3 Look=CMD_ID_GAME_LOOK +3 LowerCase=CMD_ID_CONVERT_LOWERCASE +3 MacroCtrlF10=CMD_ID_MACRO_CTRL_F10 +3 MacroCtrlF11=CMD_ID_MACRO_CTRL_F11 +3 MacroCtrlF12=CMD_ID_MACRO_CTRL_F12 +3 MacroCtrlF2=CMD_ID_MACRO_CTRL_F2 +3 MacroCtrlF3=CMD_ID_MACRO_CTRL_F3 +3 MacroCtrlF5=CMD_ID_MACRO_CTRL_F5 +3 MacroCtrlF7=CMD_ID_MACRO_CTRL_F7 +3 MacroCtrlF8=CMD_ID_MACRO_CTRL_F8 +3 MacroCtrlF9=CMD_ID_MACRO_CTRL_F9 +3 MacroF10=CMD_ID_MACRO_F10 +3 MacroF11=CMD_ID_MACRO_F11 +3 MacroF12=CMD_ID_MACRO_F12 +3 MacroF2=CMD_ID_MACRO_F2 +3 MacroF3=CMD_ID_MACRO_F3 +3 MacroF4=CMD_ID_MACRO_F4 +3 MacroF5=CMD_ID_MACRO_F5 +3 MacroF7=CMD_ID_MACRO_F7 +3 MacroF8=CMD_ID_MACRO_F8 +3 MacroF9=CMD_ID_MACRO_F9 +3 MacroShiftF10=CMD_ID_MACRO_SHIFT_F10 +3 MacroShiftF11=CMD_ID_MACRO_SHIFT_F11 +3 MacroShiftF12=CMD_ID_MACRO_SHIFT_F12 +3 MacroShiftF2=CMD_ID_MACRO_SHIFT_F2 +3 MacroShiftF3=CMD_ID_MACRO_SHIFT_F3 +3 MacroShiftF4=CMD_ID_MACRO_SHIFT_F4 +3 MacroShiftF5=CMD_ID_MACRO_SHIFT_F5 +3 MacroShiftF6=CMD_ID_MACRO_SHIFT_F6 +3 MacroShiftF7=CMD_ID_MACRO_SHIFT_F7 +3 MacroShiftF8=CMD_ID_MACRO_SHIFT_F8 +3 MacroShiftF9=CMD_ID_MACRO_SHIFT_F9 +3 MacToDos=CMD_ID_CONVERT_MACTODOS +3 MakeMultiLineTrigger=CMD_ID_DISPLAY_MULTILINETRIGGER +3 Mapper=CMD_ID_GAME_MAPPER +3 MinimiseProgram=CMD_ID_GAME_MINIMISEPROGRAM +3 Minimize=CMD_ID_WINDOW_MINIMIZE +3 MudLists=CMD_ID_HELP_MUDLISTS +3 New=CMD_ID_FILE_NEW +3 NewWindow=CMD_ID_WINDOW_NEW +3 NextCommand=CMD_ID_KEYS_NEXTCOMMAND +3 NextPane=CMD_ID_NEXT_PANE +3 NoCommandEcho=CMD_ID_DISPLAY_NOCOMMANDECHO +3 North=CMD_ID_GAME_NORTH +3 NotesWorkArea=CMD_ID_EDIT_NOTESWORKAREA +3 Open=CMD_ID_FILE_OPEN +3 OpenWorldsInStartupList=CMD_ID_FILE_OPENWORLDSINSTARTUPLIST +3 PageDown=CMD_ID_TEST_PAGEDOWN +3 Pageup=CMD_ID_TEST_PAGEUP +3 Paste=CMD_ID_EDIT_PASTE +3 PasteFile=CMD_ID_GAME_PASTEFILE +3 PasteToMush=CMD_ID_EDIT_PASTETOMUSH +3 Plugins=CMD_ID_FILE_PLUGINS +3 PluginWizard=CMD_ID_FILE_PLUGINWIZARD +3 Preferences=CMD_ID_GAME_PREFERENCES +3 PreviousCommand=CMD_ID_KEYS_PREVCOMMAND +3 Print=CMD_ID_FILE_PRINT_WORLD +3 PrintNotepad=CMD_HID_FILE_PRINT +3 PrintPreview=CMD_HID_FILE_PRINT_PREVIEW +3 PrintSetup=CMD_ID_FILE_PRINT_SETUP +3 QuickConnect=CMD_ID_CONNECTION_QUICK_CONNECT +3 Quit=CMD_ID_ACTIONS_QUIT +3 QuoteForumCodes=CMD_ID_CONVERT_QUOTEFORUMCODES +3 QuoteLines=CMD_ID_CONVERT_QUOTELINES +3 RecallText=CMD_ID_DISPLAY_RECALLTEXT +3 ReconnectOnDisconnect=CMD_ID_CONNECTION_RECONNECTONDISCONNECT +3 RefreshRecalledData=CMD_ID_EDIT_REFRESHRECALLEDDATA +3 Register=CMD_ID_HELP_REGISTERMUSHCLIENT +3 ReloadDefaults=CMD_ID_FILE_RELOADDEFAULTS +3 ReloadNamesFile=CMD_ID_EDIT_RELOADNAMESFILE +3 ReloadScriptFile=CMD_ID_GAME_RELOAD_SCRIPT_FILE +3 RemoveBlanks=CMD_ID_CONVERT_REMOVEEXTRABLANKS +3 RepeatLastCommand=CMD_ID_REPEAT_LAST_COMMAND +3 RepeatLastWord=CMD_ID_REPEAT_LAST_WORD +3 ReplaceNotepad=CMD_ID_SEARCH_REPLACE +3 ResetAllTimers=CMD_ID_GAME_RESETALLTIMERS +3 ResetToolbars=CMD_ID_VIEW_RESET_TOOLBARS +3 Save=CMD_ID_FILE_SAVE +3 SaveAs=CMD_ID_FILE_SAVE_AS +3 SaveSelection=CMD_ID_FILE_SAVESELECTION +3 SelectAll=CMD_ID_EDIT_SELECT_ALL +3 SelectMatchingBrace=CMD_ID_EDIT_SELECTTOMATCHINGBRACE +3 SendMailTo=CMD_ID_DISPLAY_SENDMAILTO +3 SendToAllWorlds=CMD_ID_GAME_SENDTOALLWORLDS +3 SendToCommandWindow=CMD_ID_EDIT_SENDTOCOMMANDWINDOW +3 SendToScript=CMD_ID_EDIT_SENDTOIMMEDIATE +3 SendToWorld=CMD_ID_EDIT_SENDTOWORLD +3 South=CMD_ID_GAME_SOUTH +3 SpellCheck=CMD_ID_EDIT_SPELLCHECK +3 Start=CMD_ID_TEST_START +3 StopSoundPlaying=CMD_ID_DISPLAY_STOPSOUNDPLAYING +3 Take=CMD_ID_GAME_TAKE +3 TestTrigger=CMD_ID_GAME_TESTTRIGGER +3 TextAttributes=CMD_ID_DISPLAY_TEXTATTRIBUTES +3 TileWindows=CMD_ID_WINDOW_TILE_HORZ +3 TileWindowsVertically=CMD_ID_WINDOW_TILE_VERT +3 TipOfTheDay=CMD_ID_HELP_TIPOFTHEDAY +3 Trace=CMD_ID_GAME_TRACE +3 UnconvertHTMLspecial=CMD_ID_UNCONVERT_CONVERTHTMLSPECIAL +3 Undo=CMD_ID_EDIT_UNDO +3 UnixToDos=CMD_ID_CONVERT_UNIXTODOS +3 Up=CMD_ID_GAME_UP +3 UpperCase=CMD_ID_CONVERT_UPPERCASE +3 UsingHelp=CMD_ID_HELP_USING +3 ViewStatusbar=CMD_ID_VIEW_STATUS_BAR +3 ViewToolbar=CMD_ID_VIEW_TOOLBAR +3 ViewWorldToolbar=CMD_ID_VIEW_GAME_TOOLBAR +3 WebPage=CMD_ID_WEB_PAGE +3 West=CMD_ID_GAME_WEST +3 Whisper=CMD_ID_GAME_WHISPER +3 WindowsSocketInformation=CMD_ID_FILE_WINSOCK +3 WordCount=CMD_ID_EDIT_WORDCOUNT +3 World1=CMD_ID_BTN_WORLDS_WORLD1 +3 World10=CMD_ID_BTN_WORLDS_WORLD0 +3 World2=CMD_ID_BTN_WORLDS_WORLD2 +3 World3=CMD_ID_BTN_WORLDS_WORLD3 +3 World4=CMD_ID_BTN_WORLDS_WORLD4 +3 World5=CMD_ID_BTN_WORLDS_WORLD5 +3 World6=CMD_ID_BTN_WORLDS_WORLD6 +3 World7=CMD_ID_BTN_WORLDS_WORLD7 +3 World8=CMD_ID_BTN_WORLDS_WORLD8 +3 World9=CMD_ID_BTN_WORLDS_WORLD9 +3 WrapLines=CMD_ID_CONVERT_REMOVEENDOFLINES +3 WrapOutput=CMD_ID_GAME_WRAPLINES diff --git a/cosmic rage/mushclient.ico b/cosmic rage/mushclient.ico new file mode 100644 index 0000000..f79bd32 Binary files /dev/null and b/cosmic rage/mushclient.ico differ diff --git a/cosmic rage/mushclient_prefs.sqlite b/cosmic rage/mushclient_prefs.sqlite new file mode 100644 index 0000000..458dff4 Binary files /dev/null and b/cosmic rage/mushclient_prefs.sqlite differ diff --git a/cosmic rage/names.txt b/cosmic rage/names.txt new file mode 100644 index 0000000..b3a8494 --- /dev/null +++ b/cosmic rage/names.txt @@ -0,0 +1,197 @@ +If you want more files for generating character names, visit the site: + +http://www.figlet.org/ + + +[start] +A +Ab +Ac +Ad +Af +Agr +Ast +As +Al +Adw +Adr +Ar +B +Br +C +C +C +Cr +Ch +Cad +D +Dr +Dw +Ed +Eth +Et +Er +El +Eow +F +Fr +G +Gr +Gw +Gw +Gal +Gl +H +Ha +Ib +Jer +K +Ka +Ked +L +Loth +Lar +Leg +M +Mir +N +Nyd +Ol +Oc +On +P +Pr +R +Rh +S +Sev +T +Tr +Th +Th +V +Y +Yb +Z +W +W +Wic +[middle] +a +ae +ae +au +ao +are +ale +ali +ay +ardo +e +ei +ea +ea +eri +era +ela +eli +enda +erra +i +ia +ie +ire +ira +ila +ili +ira +igo +o +oa +oi +oe +ore +u +y +[end] + + + + + + + +a +and +b +bwyn +baen +bard +c +ctred +cred +ch +can +d +dan +don +der +dric +dfrid +dus +f +g +gord +gan +l +li +lgrin +lin +lith +lath +loth +ld +ldric +ldan +m +mas +mos +mar +mond +n +nydd +nidd +nnon +nwan +nyth +nad +nn +nnor +nd +p +r +ron +rd +s +sh +seth +sean +t +th +th +tha +tlan +trem +tram +v +vudd +w +wan +win +win +wyn +wyn +wyr +wyr +wyth +[stop] diff --git a/cosmic rage/names/ALBION.NAM b/cosmic rage/names/ALBION.NAM new file mode 100644 index 0000000..dfc292e --- /dev/null +++ b/cosmic rage/names/ALBION.NAM @@ -0,0 +1,200 @@ +/*****************************************************/ +/* ALBION.NAM */ +/* Namnfil fr namn med Albion-klang */ +/* Johan Danforth */ +/* rader som brjar med / r kommentar-rader */ +/* varje section brjar med [xxx] enlig filen nedan */ +/*****************************************************/ +[startstav] +A +Ab +Ac +Ad +Af +Agr +Ast +As +Al +Adw +Adr +Ar +B +Br +C +C +C +Cr +Ch +Cad +D +Dr +Dw +Ed +Eth +Et +Er +El +Eow +F +Fr +G +Gr +Gw +Gw +Gal +Gl +H +Ha +Ib +Jer +K +Ka +Ked +L +Loth +Lar +Leg +M +Mir +N +Nyd +Ol +Oc +On +P +Pr +R +Rh +S +Sev +T +Tr +Th +Th +V +Y +Yb +Z +W +W +Wic +[mittstav] +a +ae +ae +au +ao +are +ale +ali +ay +ardo +e +ei +ea +ea +eri +era +ela +eli +enda +erra +i +ia +ie +ire +ira +ila +ili +ira +igo +o +oa +oi +oe +ore +u +y +[slutstav] + + + + + + + +a +and +b +bwyn +baen +bard +c +ctred +cred +ch +can +d +dan +don +der +dric +dfrid +dus +f +g +gord +gan +l +li +lgrin +lin +lith +lath +loth +ld +ldric +ldan +m +mas +mos +mar +mond +n +nydd +nidd +nnon +nwan +nyth +nad +nn +nnor +nd +p +r +ron +rd +s +sh +seth +sean +t +th +th +tha +tlan +trem +tram +v +vudd +w +wan +win +win +wyn +wyn +wyr +wyr +wyth +[stop] +/* hr r filen slut */ diff --git a/cosmic rage/names/ALVER.NAM b/cosmic rage/names/ALVER.NAM new file mode 100644 index 0000000..1bcbf00 --- /dev/null +++ b/cosmic rage/names/ALVER.NAM @@ -0,0 +1,77 @@ +/*****************************************************/ +/* ALVER.NAM */ +/* Namnfil fr alv-namn */ +/* av Johan Danforth */ +/* rader som brjar med / r kommentar-rader */ +/* varje section brjar med [xxx] enlig filen nedan */ +/*****************************************************/ +[startstav] +/* startstavelser skall sluta med en konsonant som b,k,t etc... */ +An +Bel +Cel +El +Elr +Elv +Eow +Er +F +G +Gal +Gl +Is +Leg +Lm +N +S +T +Thr +Tin +[mittstav] +/* mittstavelser skall brja och sluta med en vokal som a,o,u,i,e,y etc... */ +a + +adrie +ara +e + +ebri +i +io +ithra +ilma +il-Ga +o +orfi + +u +y +[slutstav] +/* slutstavelser skall brja med en konsonant som b,k,t etc... */ +l +las +lad +ldor +ldur +lind +lith +mir +n +nd +ndel +ndil +ndir +nduil +ng +mbor +r +rith +ril +riand +rion +thien +viel +wen +wyn +[stop] +/* hr r filen slut */ diff --git a/cosmic rage/names/ALVER1.NAM b/cosmic rage/names/ALVER1.NAM new file mode 100644 index 0000000..9f24826 --- /dev/null +++ b/cosmic rage/names/ALVER1.NAM @@ -0,0 +1,83 @@ +/*****************************************************/ +/* ALVER.NAM */ +/* Namnfil fr alv-namn */ +/* av Johan Danforth */ +/* rader som brjar med / r kommentar-rader */ +/* varje section brjar med [xxx] enlig filen nedan */ +/*****************************************************/ +[startstav] +/* startstavelser skall sluta med en konsonant som b,k,t etc... */ +An +Am +Bel +Cel +C +Cal +Del +El +Elr +Elv +Eow +Er +F +G +Gal +Gl +H +Is +Leg +Lm +M +N +P +R +S +T +Thr +Tin +Ur +Un +V +[mittstav] +/* mittstavelser skall brja och sluta med en vokal som a,o,u,i,e,y etc... */ +a + +adrie +ara +e + +ebri +i +io +ithra +ilma +il-Ga +o +orfi + +u +y +[slutstav] +/* slutstavelser skall brja med en konsonant som b,k,t etc... */ +l +las +lad +ldor +ldur +lith +mir +n +nd +ndel +ndil +ndir +nduil +ng +mbor +r +ril +riand +rion +wyn +[stop] +/* hr r filen slut */ diff --git a/cosmic rage/names/ALVER2.NAM b/cosmic rage/names/ALVER2.NAM new file mode 100644 index 0000000..8fe1f72 --- /dev/null +++ b/cosmic rage/names/ALVER2.NAM @@ -0,0 +1,82 @@ +/*****************************************************/ +/* ALVER.NAM */ +/* Namnfil fr alv-namn */ +/* av Johan Danforth */ +/* rader som brjar med / r kommentar-rader */ +/* varje section brjar med [xxx] enlig filen nedan */ +/*****************************************************/ +[startstav] +/* startstavelser skall sluta med en konsonant som b,k,t etc... */ +An +Am +Bel +Cel +C +Cal +Del +El +Elr +Elv +Eow +Er +F +G +Gal +Gl +H +Is +Leg +Lm +M +N +P +R +S +T +Thr +Tin +Ur +Un +V +[mittstav] +/* mittstavelser skall brja och sluta med en vokal som a,o,u,i,e,y etc... */ +a + +adrie +ara +e + +ebri +i +io +ithra +ilma +il-Ga +o +orfi + +u +y +[slutstav] +/* slutstavelser skall brja med en konsonant som b,k,t etc... */ +clya +lind +d +dien +dith +dia +lith +lia +ndra +ng +nia +niel +rith +thien +thiel +viel +wen +wien +wiel +[stop] +/* hr r filen slut */ diff --git a/cosmic rage/names/DEVERRY1.NAM b/cosmic rage/names/DEVERRY1.NAM new file mode 100644 index 0000000..b0fccab --- /dev/null +++ b/cosmic rage/names/DEVERRY1.NAM @@ -0,0 +1,62 @@ +/*****************************************************/ +/* Deverry1.nam */ +/* Namnfil fr namn frn Deverry (mn) */ +/* av Johan Danforth */ +/* rader som brjar med / r kommentar-rader */ +/* varje section brjar med [xxx] enlig filen nedan */ +/*****************************************************/ +[startstav] +/* startstavelser skall sluta med en konsonant som b,k,t etc... */ +Aeth +Addr +Bl +C +Car +D +G +Gl +Gw +L +M +Ow +R +Rh +S +T +V +Yr +[mittstav] +/* mittstavelser skall brja och sluta med en vokal som a,o,u,i,e,y etc... */ +a +ae +e +eo +i +o +u +y +[slutstav] +/* slutstavelser skall brja med en konsonant som b,k,t etc... */ +bryn +c +cyn +dd +ddry +ddyn +doc +dry +gwyn +llyn +myr +n +nnyn +nry +nvan +nyc +r +rcyn +rraent +ran +ryn +[stop] +/* hr r filen slut */ diff --git a/cosmic rage/names/DEVERRY2.NAM b/cosmic rage/names/DEVERRY2.NAM new file mode 100644 index 0000000..3515668 --- /dev/null +++ b/cosmic rage/names/DEVERRY2.NAM @@ -0,0 +1,56 @@ +/*****************************************************/ +/* Deverry2.nam */ +/* Namnfil fr namn frn Deverry (kvinnor) */ +/* av Johan Danforth */ +/* rader som brjar med / r kommentar-rader */ +/* varje section brjar med [xxx] enlig filen nedan */ +/*****************************************************/ +[startstav] +/* startstavelser skall sluta med en konsonant som b,k,t etc... */ +Al +Br +C +Cl +D +El +Gw +J +L +M +N +Mer +S +R +Ys +[mittstav] +/* mittstavelser skall brja och sluta med en vokal som a,o,u,i,e,y etc... */ +a +ae +e +ea +i +o +u +y +w +[slutstav] +/* slutstavelser skall brja med en konsonant som b,k,t etc... */ +brylla +cla +dda +ll +lla +llyra +lonna +lyan +na +ngwen +niver +noic +ra +rka +ryan +ssa +vyan +[stop] +/* hr r filen slut */ diff --git a/cosmic rage/names/DVARGAR.NAM b/cosmic rage/names/DVARGAR.NAM new file mode 100644 index 0000000..69747ac --- /dev/null +++ b/cosmic rage/names/DVARGAR.NAM @@ -0,0 +1,52 @@ +/*****************************************************/ +/* MALL.NAM */ +/* Namnfil fr namn frn xxxxxxxxxxx */ +/* av Johan Danforth */ +/* rader som brjar med / r kommentar-rader */ +/* varje section brjar med [xxx] enlig filen nedan */ +/*****************************************************/ +/* balin durin bofur bifur bombur belin */ +[startstav] +/* startstavelser skall sluta med en konsonant som b,k,t etc... */ +B +D +F +G +Gl +H +K +L +M +N +R +S +T +V +[mittstav] +/* mittstavelser skall brja och sluta med en vokal som a,o,u,i,e,y etc... */ +a +e +i +o +oi +u +[slutstav] +/* slutstavelser skall brja med en konsonant som b,k,t etc... */ +bur +fur +gan +gnus +gnar +li +lin +lir +mli +nar +nus +rin +ran +sin +sil +sur +[stop] +/* hr r filen slut */ diff --git a/cosmic rage/names/Dragonl1.nam b/cosmic rage/names/Dragonl1.nam new file mode 100644 index 0000000..67e22cb --- /dev/null +++ b/cosmic rage/names/Dragonl1.nam @@ -0,0 +1,20 @@ +/*****************************************************/ +/* Dragonlance names, goldmoon etc... */ +/*****************************************************/ +[startstav] +Gold +Silver +Diamond +Steel +Iron +[mittstav] + + + +Star +Moon +Wind +[slutstav] + + +[stop] diff --git a/cosmic rage/names/Felana.nam b/cosmic rage/names/Felana.nam new file mode 100644 index 0000000..73cc79c --- /dev/null +++ b/cosmic rage/names/Felana.nam @@ -0,0 +1,134 @@ +/********************************************/ +/* Felana.nam */ +/* Namn file for the Felana race and other */ +/* feline beings. */ +/* by Nathalie Hebert */ +/********************************************/ +[startstav] +Am +An +As +Ash +Ast +C +Chen +Chan +Char +Cher +Cer +Es +Esh +Is +Ish +Os +Osh +Us +Ush +Ys +Ysh +H +Ch +S +Shen +Sar +Sol +Shar +Shan +Sher +Shim +Sim +Sin +San +Sar +Ser +Sor +Shor +Sham +Sh +[mittstav] + + + + +a +ar +as +e +es +i +is +o +os +u +us +y +ys +er +or +ur +yr +ir +eri +ari +osh +ash +esh +ish +ush +ysh +en +an +in +on +un +yn +[slutstav] + + + + + + + + +dar +mir +nir +nor +nar +ish +ash +osh +esh +isha +asha +esha +osha +orsha +a +e +i +o +u +y +sar +ser +sor +sir +der +sham +shor +shen +as +es +ys +seth +san +sin +sil +sur +sen +sean +dor +[stop] +/* hr r filen slut */ \ No newline at end of file diff --git a/cosmic rage/names/GALLER.NAM b/cosmic rage/names/GALLER.NAM new file mode 100644 index 0000000..780bb69 --- /dev/null +++ b/cosmic rage/names/GALLER.NAM @@ -0,0 +1,84 @@ +/*****************************************************/ +/* GALLER.NAM */ +/* Namnfil fr namn frn Gallien */ +/* av Johan Danforth */ +/* rader som brjar med / r kommentar-rader */ +/* varje section brjar med [xxx] enlig filen nedan */ +/*****************************************************/ +[startstav] +/* startstavelser skall sluta med en konsonant som b,k,t etc... */ +A +Ab +Ac +Ad +Af +Ast +Al +Adw +Adr +Ar +B +Br +C +Cr +D +Dr +Ed +Et +Er +El +F +Fr +G +Gr +Gal +Gl +H +Hal +Ib +Id +J +K +Ka +Ked +L +Lar +Leg +M +Maj +Mir +N +Ol +Oc +On +P +Pr +R +S +Sl +T +Tr +Ul +V +Y +Yb +Z +W +[mittstav] +/* mittstavelser skall brja och sluta med en vokal som a,o,u,i,e,y etc... */ +aku +e +eli +eri +o +uba +[slutstav] +/* slutstavelser skall brja med en konsonant som b,k,t etc... */ +dix +fax +fix +lix +rix +stix +[stop] +/* hr r filen slut */ diff --git a/cosmic rage/names/HOBER.NAM b/cosmic rage/names/HOBER.NAM new file mode 100644 index 0000000..ac85b00 --- /dev/null +++ b/cosmic rage/names/HOBER.NAM @@ -0,0 +1,38 @@ +/*****************************************************/ +/* HOBER.NAM */ +/* Namnfil fr hob-namn */ +/* av Johan Danforth */ +/* rader som brjar med / r kommentar-rader */ +/* varje section brjar med [xxx] enlig filen nedan */ +/*****************************************************/ +/* Frodo Bilbo Sam Meriadoc Peregrin */ +[startstav] +/* startstavelser skall sluta med en konsonant som b,k,t etc... */ +B +Dr +Fr +Mer +Per +R +S +[mittstav] +/* mittstavelser skall brja och sluta med en vokal som a,o,u,i,e,y etc... */ +a +e +i +ia +o +oi +u +[slutstav] +/* slutstavelser skall brja med en konsonant som b,k,t etc... */ +bo +do +doc +go +grin +m +ppi +rry +[stop] +/* hr r filen slut */ diff --git a/cosmic rage/names/ORC1.NAM b/cosmic rage/names/ORC1.NAM new file mode 100644 index 0000000..d562b96 --- /dev/null +++ b/cosmic rage/names/ORC1.NAM @@ -0,0 +1,50 @@ +/*****************************************************/ +/* ORC1.NAM */ +/* Namnfil fr orch-frnamn */ +/* av Johan Danforth och Tobias Petersson */ +/* rader som brjar med / r kommentar-rader */ +/* varje section brjar med [xxx] enlig filen nedan */ +/*****************************************************/ +[startstav] +/* startstavelser skall sluta med en konsonant som b,k,t etc... */ +B +Er +G +Gr +H +P +Pr +R +V +Vr +[mittstav] +/* mittstavelser skall brja och sluta med en vokal som a,o,u,i,e,y etc... */ +a +i +o +u +[slutstav] +/* slutstavelser skall brja med en konsonant som b,k,t etc... */ +dash +dish +dush +gar +gor +gdush +lo +gdish +k +lg +nak +rag +rbag +rg +rk +ng +nk +rt +ol +urk +shnak +[stop] +/* hr r filen slut */ diff --git a/cosmic rage/names/ORC2.NAM b/cosmic rage/names/ORC2.NAM new file mode 100644 index 0000000..4b38941 --- /dev/null +++ b/cosmic rage/names/ORC2.NAM @@ -0,0 +1,81 @@ +/*****************************************************/ +/* ORC1.NAM */ +/* Namnfil fr orch-frnamn */ +/* av Johan Danforth och Tobias Petersson */ +/* rader som brjar med / r kommentar-rader */ +/* varje section brjar med [xxx] enlig filen nedan */ +/*****************************************************/ +[startstav] +/* startstavelser skall sluta med en konsonant som b,k,t etc... */ +Head +Face +Eye +Arm +Foot +Toe +Ear +Nose +Hair +Blood +Nail +Snotling +Enemy +Public +Beast +Man +Finger +Goblin +Gretchin +Hobbit +Teeth +Elf +Rat +Ball +Ghoul +Knife +Axe +Wraith +Deamon +Dragon +Tooth +Death +Mother +Horse +Moon +Dwarf +Earth +Human +Grass +[mittstav] +/* mittstavelser skall brja och sluta med en vokal som a,o,u,i,e,y etc... */ + +[slutstav] +/* slutstavelser skall brja med en konsonant som b,k,t etc... */ +killer +crucher +lover +thrower +throttler +eater +hammer +kicker +walker +punsher +dragger +stomper +torturer +ripper +mangler +hater +poker +chewer +cutter +slicer +juggler +raper +smasher +shooter +drinker +crawler +[stop] +/* hr r filen slut */ diff --git a/cosmic rage/names/albion1.nam b/cosmic rage/names/albion1.nam new file mode 100644 index 0000000..f9d81e0 --- /dev/null +++ b/cosmic rage/names/albion1.nam @@ -0,0 +1,151 @@ +/*****************************************************/ +/* ALBION1.NAM */ +/* Namnfil fr namn med Albion-klang */ +/* Johan Danforth */ +/* rader som brjar med / r kommentar-rader */ +/* varje section brjar med [xxx] enlig filen nedan */ +/*****************************************************/ +[startstav] +A +Ab +Ac +Ad +Af +Agr +Ast +As +Al +Adw +Adr +Ar +B +Br +C +C +C +Cr +Ch +Cad +D +Dr +Dw +Ed +Eth +Et +Er +El +Eow +F +Fr +G +Gr +Gw +Gw +Gal +Gl +H +Ha +Ib +Jer +K +Ka +Ked +L +Loth +Lar +Leg +M +Mir +N +Nyd +Ol +Oc +On +P +Pr +Q +R +Rh +S +Sev +T +Tr +Th +Th +Ul +Um +Un +V +Y +Yb +Z +W +W +Wic +[mittstav] +a +ae +ae +au +ao +are +ale +ali +ay +ardo +e +ei +ea +ea +eri +era +ela +eli +enda +erra +i +ia +ie +ire +ira +ila +ili +ira +igo +o +oa +oi +oe +ore +u +y +[slutstav] +a +clya +lind +de +dien +dith +dia +lith +lia +lian +lla +llan +lle +n +n +n +ndra +ng +nia +niel +rith +thien +thiel +viel +wen +wien +wiel +[stop] +/* hr r filen slut */ diff --git a/cosmic rage/names/albion2.nam b/cosmic rage/names/albion2.nam new file mode 100644 index 0000000..8a4b918 --- /dev/null +++ b/cosmic rage/names/albion2.nam @@ -0,0 +1,204 @@ +/*****************************************************/ +/* ALBION2.NAM */ +/* Namnfil fr namn med Albion-klang */ +/* Johan Danforth */ +/* rader som brjar med / r kommentar-rader */ +/* varje section brjar med [xxx] enlig filen nedan */ +/*****************************************************/ +[startstav] +A +Ab +Ac +Ad +Af +Agr +Ast +As +Al +Adw +Adr +Ar +B +Br +C +C +C +Cr +Ch +Cad +D +Dr +Dw +Ed +Eth +Et +Er +El +Eow +F +Fr +G +Gr +Gw +Gw +Gal +Gl +H +Ha +Ib +Jer +K +Ka +Ked +L +Loth +Lar +Leg +M +Mir +N +Nyd +Ol +Oc +On +P +Pr +Q +R +Rh +S +Sev +T +Tr +Th +Th +Ul +Um +Un +V +Y +Yb +Z +W +W +Wic +[mittstav] +a +ae +ae +au +ao +are +ale +ali +ay +ardo +e +ei +ea +ea +eri +era +ela +eli +enda +erra +i +ia +ie +ire +ira +ila +ili +ira +igo +o +oa +oi +oe +ore +u +y +[slutstav] + + + + + + + +a +and +b +bwyn +baen +bard +c +ctred +cred +ch +can +d +dan +don +der +dric +dfrid +dus +f +g +gord +gan +l +li +lgrin +lin +lith +lath +loth +ld +ldric +ldan +m +mas +mos +mar +mond +n +nydd +nidd +nnon +nwan +nyth +nad +nn +nnor +nd +p +r +ron +rd +s +sh +seth +sean +t +th +th +tha +tlan +trem +tram +v +vudd +w +wan +win +win +wyn +wyn +wyr +wyr +wyth +[stop] +/* hr r filen slut */ diff --git a/cosmic rage/names/dvargar1.nam b/cosmic rage/names/dvargar1.nam new file mode 100644 index 0000000..69747ac --- /dev/null +++ b/cosmic rage/names/dvargar1.nam @@ -0,0 +1,52 @@ +/*****************************************************/ +/* MALL.NAM */ +/* Namnfil fr namn frn xxxxxxxxxxx */ +/* av Johan Danforth */ +/* rader som brjar med / r kommentar-rader */ +/* varje section brjar med [xxx] enlig filen nedan */ +/*****************************************************/ +/* balin durin bofur bifur bombur belin */ +[startstav] +/* startstavelser skall sluta med en konsonant som b,k,t etc... */ +B +D +F +G +Gl +H +K +L +M +N +R +S +T +V +[mittstav] +/* mittstavelser skall brja och sluta med en vokal som a,o,u,i,e,y etc... */ +a +e +i +o +oi +u +[slutstav] +/* slutstavelser skall brja med en konsonant som b,k,t etc... */ +bur +fur +gan +gnus +gnar +li +lin +lir +mli +nar +nus +rin +ran +sin +sil +sur +[stop] +/* hr r filen slut */ diff --git a/cosmic rage/names/dvargar2.nam b/cosmic rage/names/dvargar2.nam new file mode 100644 index 0000000..3515668 --- /dev/null +++ b/cosmic rage/names/dvargar2.nam @@ -0,0 +1,56 @@ +/*****************************************************/ +/* Deverry2.nam */ +/* Namnfil fr namn frn Deverry (kvinnor) */ +/* av Johan Danforth */ +/* rader som brjar med / r kommentar-rader */ +/* varje section brjar med [xxx] enlig filen nedan */ +/*****************************************************/ +[startstav] +/* startstavelser skall sluta med en konsonant som b,k,t etc... */ +Al +Br +C +Cl +D +El +Gw +J +L +M +N +Mer +S +R +Ys +[mittstav] +/* mittstavelser skall brja och sluta med en vokal som a,o,u,i,e,y etc... */ +a +ae +e +ea +i +o +u +y +w +[slutstav] +/* slutstavelser skall brja med en konsonant som b,k,t etc... */ +brylla +cla +dda +ll +lla +llyra +lonna +lyan +na +ngwen +niver +noic +ra +rka +ryan +ssa +vyan +[stop] +/* hr r filen slut */ diff --git a/cosmic rage/names/f_female.nam b/cosmic rage/names/f_female.nam new file mode 100644 index 0000000..ef27537 --- /dev/null +++ b/cosmic rage/names/f_female.nam @@ -0,0 +1,184 @@ +/*****************************************************/ +/* ALBION1.NAM */ +/* Namnfil fr namn med Albion-klang */ +/* Johan Danforth */ +/* rader som brjar med / r kommentar-rader */ +/* varje section brjar med [xxx] enlig filen nedan */ +/*****************************************************/ +[startstav] +A +Ab +Ac +Ad +Af +Agr +Ast +As +Al +Adw +Adr +Ar +B +Br +C +C +C +Cr +Ch +Cad +D +Dr +Dw +Ed +Eth +Et +Er +El +Eow +F +Fr +G +Gr +Gw +Gw +Gal +Gl +H +Ha +Ib +Jer +K +Ka +Ked +L +Loth +Lar +Leg +M +Mir +N +Nyd +Ol +Oc +On +P +Pr +Q +R +Rh +S +Sev +T +Tr +Th +Th +Ul +Um +Un +V +Y +Yb +Z +W +W +Wic +[mittstav] +a +a +a +ae +ae +au +ao +are +ale +ali +ay +ardo +e +e +e +ei +ea +ea +eri +era +ela +eli +enda +erra +i +i +i +ia +ie +ire +ira +ila +ili +ira +igo +o +oa +oi +oe +ore +u +y +[slutstav] +beth +cia +cien +clya +de +dia +dda +dien +dith +dia +lind +lith +lia +lian +lla +llan +lle +ma +mma +mwen +meth +n +n +n +nna +ndra +ng +ni +nia +niel +rith +rien +ria +ri +rwen +sa +sien +ssa +ssi +swen +thien +thiel +viel +via +ven +veth +wen +wen +wen +wen +wia +weth +wien +wiel +[stop] +/* hr r filen slut */ diff --git a/cosmic rage/names/f_male.nam b/cosmic rage/names/f_male.nam new file mode 100644 index 0000000..f32d592 --- /dev/null +++ b/cosmic rage/names/f_male.nam @@ -0,0 +1,218 @@ +/*****************************************************/ +/* ALBION2.NAM */ +/* Namnfil fr namn med Albion-klang */ +/* Johan Danforth */ +/* rader som brjar med / r kommentar-rader */ +/* varje section brjar med [xxx] enlig filen nedan */ +/*****************************************************/ +[startstav] +A +Ab +Ac +Ad +Af +Agr +Ast +As +Al +Adw +Adr +Ar +B +Br +C +C +C +Cr +Ch +Cad +D +Dr +Dw +Ed +Eth +Et +Er +El +Eow +F +Fr +G +Gr +Gw +Gw +Gal +Gl +H +Ha +Ib +J +Jer +K +Ka +Ked +L +Loth +Lar +Leg +M +Mir +N +Nyd +Ol +Oc +On +P +Pr +Q +R +Rh +S +Sev +T +Tr +Th +Th +Ul +Um +Un +V +Y +Yb +Z +W +W +Wic +[mittstav] +a +ae +ae +au +ao +are +ale +ali +ay +ardo +e +edri +ei +ea +ea +eri +era +ela +eli +enda +erra +i +ia +ie +ire +ira +ila +ili +ira +igo +o +oha +oma +oa +oi +oe +ore +u +y +[slutstav] + + + + + + + +a +and +b +bwyn +baen +bard +c +ch +can +d +dan +don +der +dric +dus +f +g +gord +gan +han +har +jar +jan +k +kin +kith +kath +koth +kor +kon +l +li +lin +lith +lath +loth +ld +ldan +m +mas +mos +mar +mond +n +nydd +nidd +nnon +nwan +nyth +nad +nn +nnor +nd +p +r +red +ric +rid +rin +ron +rd +s +sh +seth +sean +t +th +th +tha +tlan +trem +tram +v +vudd +w +wan +win +win +wyn +wyn +wyr +wyr +wyth +[stop] +/* hr r filen slut */ diff --git a/cosmic rage/names/gnome1.nam b/cosmic rage/names/gnome1.nam new file mode 100644 index 0000000..b0fccab --- /dev/null +++ b/cosmic rage/names/gnome1.nam @@ -0,0 +1,62 @@ +/*****************************************************/ +/* Deverry1.nam */ +/* Namnfil fr namn frn Deverry (mn) */ +/* av Johan Danforth */ +/* rader som brjar med / r kommentar-rader */ +/* varje section brjar med [xxx] enlig filen nedan */ +/*****************************************************/ +[startstav] +/* startstavelser skall sluta med en konsonant som b,k,t etc... */ +Aeth +Addr +Bl +C +Car +D +G +Gl +Gw +L +M +Ow +R +Rh +S +T +V +Yr +[mittstav] +/* mittstavelser skall brja och sluta med en vokal som a,o,u,i,e,y etc... */ +a +ae +e +eo +i +o +u +y +[slutstav] +/* slutstavelser skall brja med en konsonant som b,k,t etc... */ +bryn +c +cyn +dd +ddry +ddyn +doc +dry +gwyn +llyn +myr +n +nnyn +nry +nvan +nyc +r +rcyn +rraent +ran +ryn +[stop] +/* hr r filen slut */ diff --git a/cosmic rage/names/gnome2.nam b/cosmic rage/names/gnome2.nam new file mode 100644 index 0000000..3515668 --- /dev/null +++ b/cosmic rage/names/gnome2.nam @@ -0,0 +1,56 @@ +/*****************************************************/ +/* Deverry2.nam */ +/* Namnfil fr namn frn Deverry (kvinnor) */ +/* av Johan Danforth */ +/* rader som brjar med / r kommentar-rader */ +/* varje section brjar med [xxx] enlig filen nedan */ +/*****************************************************/ +[startstav] +/* startstavelser skall sluta med en konsonant som b,k,t etc... */ +Al +Br +C +Cl +D +El +Gw +J +L +M +N +Mer +S +R +Ys +[mittstav] +/* mittstavelser skall brja och sluta med en vokal som a,o,u,i,e,y etc... */ +a +ae +e +ea +i +o +u +y +w +[slutstav] +/* slutstavelser skall brja med en konsonant som b,k,t etc... */ +brylla +cla +dda +ll +lla +llyra +lonna +lyan +na +ngwen +niver +noic +ra +rka +ryan +ssa +vyan +[stop] +/* hr r filen slut */ diff --git a/cosmic rage/names/hober1.nam b/cosmic rage/names/hober1.nam new file mode 100644 index 0000000..b61ba89 --- /dev/null +++ b/cosmic rage/names/hober1.nam @@ -0,0 +1,35 @@ +/*****************************************************/ +/* HOBER.NAM */ +/* Namnfil fr hob-namn */ +/* av Johan Danforth */ +/* rader som brjar med / r kommentar-rader */ +/* varje section brjar med [xxx] enlig filen nedan */ +/*****************************************************/ +/* Frodo Bilbo Sam Meriadoc Peregrin */ +[startstav] +/* startstavelser skall sluta med en konsonant som b,k,t etc... */ +B +Dr +Fr +Mer +Per +S +[mittstav] +/* mittstavelser skall brja och sluta med en vokal som a,o,u,i,e,y etc... */ +a +e +i +ia +o +oi +u +[slutstav] +/* slutstavelser skall brja med en konsonant som b,k,t etc... */ +bo +do +doc +go +grin +m +[stop] +/* hr r filen slut */ diff --git a/cosmic rage/names/hober2.nam b/cosmic rage/names/hober2.nam new file mode 100644 index 0000000..3515668 --- /dev/null +++ b/cosmic rage/names/hober2.nam @@ -0,0 +1,56 @@ +/*****************************************************/ +/* Deverry2.nam */ +/* Namnfil fr namn frn Deverry (kvinnor) */ +/* av Johan Danforth */ +/* rader som brjar med / r kommentar-rader */ +/* varje section brjar med [xxx] enlig filen nedan */ +/*****************************************************/ +[startstav] +/* startstavelser skall sluta med en konsonant som b,k,t etc... */ +Al +Br +C +Cl +D +El +Gw +J +L +M +N +Mer +S +R +Ys +[mittstav] +/* mittstavelser skall brja och sluta med en vokal som a,o,u,i,e,y etc... */ +a +ae +e +ea +i +o +u +y +w +[slutstav] +/* slutstavelser skall brja med en konsonant som b,k,t etc... */ +brylla +cla +dda +ll +lla +llyra +lonna +lyan +na +ngwen +niver +noic +ra +rka +ryan +ssa +vyan +[stop] +/* hr r filen slut */ diff --git a/cosmic rage/names/kender1.nam b/cosmic rage/names/kender1.nam new file mode 100644 index 0000000..8a4b918 --- /dev/null +++ b/cosmic rage/names/kender1.nam @@ -0,0 +1,204 @@ +/*****************************************************/ +/* ALBION2.NAM */ +/* Namnfil fr namn med Albion-klang */ +/* Johan Danforth */ +/* rader som brjar med / r kommentar-rader */ +/* varje section brjar med [xxx] enlig filen nedan */ +/*****************************************************/ +[startstav] +A +Ab +Ac +Ad +Af +Agr +Ast +As +Al +Adw +Adr +Ar +B +Br +C +C +C +Cr +Ch +Cad +D +Dr +Dw +Ed +Eth +Et +Er +El +Eow +F +Fr +G +Gr +Gw +Gw +Gal +Gl +H +Ha +Ib +Jer +K +Ka +Ked +L +Loth +Lar +Leg +M +Mir +N +Nyd +Ol +Oc +On +P +Pr +Q +R +Rh +S +Sev +T +Tr +Th +Th +Ul +Um +Un +V +Y +Yb +Z +W +W +Wic +[mittstav] +a +ae +ae +au +ao +are +ale +ali +ay +ardo +e +ei +ea +ea +eri +era +ela +eli +enda +erra +i +ia +ie +ire +ira +ila +ili +ira +igo +o +oa +oi +oe +ore +u +y +[slutstav] + + + + + + + +a +and +b +bwyn +baen +bard +c +ctred +cred +ch +can +d +dan +don +der +dric +dfrid +dus +f +g +gord +gan +l +li +lgrin +lin +lith +lath +loth +ld +ldric +ldan +m +mas +mos +mar +mond +n +nydd +nidd +nnon +nwan +nyth +nad +nn +nnor +nd +p +r +ron +rd +s +sh +seth +sean +t +th +th +tha +tlan +trem +tram +v +vudd +w +wan +win +win +wyn +wyn +wyr +wyr +wyth +[stop] +/* hr r filen slut */ diff --git a/cosmic rage/names/kender2.nam b/cosmic rage/names/kender2.nam new file mode 100644 index 0000000..c63b149 --- /dev/null +++ b/cosmic rage/names/kender2.nam @@ -0,0 +1,186 @@ +/*****************************************************/ +/* ALBION1.NAM */ +/* Namnfil fr namn med Albion-klang */ +/* Johan Danforth */ +/* rader som brjar med / r kommentar-rader */ +/* varje section brjar med [xxx] enlig filen nedan */ +/*****************************************************/ +[startstav] +A +Ab +Ac +Ad +Af +Agr +Ast +As +Al +Adw +Adr +Ar +B +Br +C +C +C +Cr +Ch +Cad +D +Dr +Dw +Ed +Eth +Et +Er +El +Eow +F +Fr +G +Gr +Gw +Gw +Gal +Gl +H +Ha +Ib +Jer +K +Ka +Ked +L +Loth +Lar +Leg +M +Mir +N +Nyd +Ol +Oc +On +P +Pr +Q +R +Rh +S +Sev +T +Tr +Th +Th +Ul +Um +Un +V +Y +Yb +Z +W +W +Wic +[mittstav] +a +a +a +ae +ae +au +ao +are +ale +ali +ay +ardo +e +e +e +ei +ea +ea +eri +era +ela +eli +enda +erra +i +i +i +ia +ie +ire +ira +ila +ili +ira +igo +o +oa +oi +oe +ore +u +y +[slutstav] +beth +cia +cien +clya +de +dia +dda +dien +dith +dia +lind +lith +lia +lian +lla +llan +lle +m +m +ma +mma +mwen +meth +n +n +n +nna +ndra +ng +ni +nia +niel +rith +rien +ria +ri +rwen +sa +sien +ssa +ssi +swen +thien +thiel +viel +via +ven +veth +wen +wen +wen +wen +wia +weth +wien +wiel +[stop] +/* hr r filen slut */ diff --git a/cosmic rage/names/kerrel.nam b/cosmic rage/names/kerrel.nam new file mode 100644 index 0000000..10b1ae5 --- /dev/null +++ b/cosmic rage/names/kerrel.nam @@ -0,0 +1,101 @@ +/*****************************************************/ +/* KERREL.NAM */ +/* Namnfil fr namn frn Deverry alver */ +/* av Johan Danforth */ +/* rader som brjar med / r kommentar-rader */ +/* varje section brjar med [xxx] enlig filen nedan */ +/*****************************************************/ +[startstav] +/* startstavelser skall sluta med en konsonant som b,k,t etc... */ +Ad +Adr +Al +Alb +Alod +Ann +B +Ban +Ber +Cal +Car +Carr +Cont +Dall +Dar +Dev +Eb +El +Elb +En +Far +Gann +Gav +Hal +Jav +Jenn +L +Land +Man +Mer +Nan +Ran +Tal +Tal +Val +Wyl +[mittstav] +/* mittstavelser skall brja och sluta med en vokal som a,o,u,i,e,y etc... */ +a +a +abe +abri +ae +ae +ala +alae +ale +ama +amae +ana +e +e +ede +ena +ere +o +oba +obre +[slutstav] +/* slutstavelser skall brja med en konsonant som b,k,t etc... */ +beriel +clya +danten +dar +ddlaen +gyn +ladar +ldar +lden +lia +mario +na +ndar +ndario +nderiel +ndra +nnon +nna +ntar +ntariel +nteriel +ny +raen +rel +ria +riel +ryn +ssi +teriel +ver +[stop] +/* hr r filen slut */ diff --git a/cosmic rage/names/orc.nam b/cosmic rage/names/orc.nam new file mode 100644 index 0000000..49f85f5 --- /dev/null +++ b/cosmic rage/names/orc.nam @@ -0,0 +1,67 @@ +/*****************************************************/ +/* ORC1.NAM */ +/* Namnfil fr orch-frnamn */ +/* av Johan Danforth och Tobias Petersson */ +/* rader som brjar med / r kommentar-rader */ +/* varje section brjar med [xxx] enlig filen nedan */ +/*****************************************************/ +[startstav] +/* startstavelser skall sluta med en konsonant som b,k,t etc... */ +B +C +D +Er +F +G +Gr +H +K +L +M +N +P +Pr +R +S +T +V +Vr +[mittstav] +/* mittstavelser skall brja och sluta med en vokal som a,o,u,i,e,y etc... */ +a +i +o +u +[slutstav] +/* slutstavelser skall brja med en konsonant som b,k,t etc... */ +dak +dash +dish +dush +gak +gar +gor +gdush +hai +l +lo +lok +gdish +k +kar +kor +lg +mak +nak +nai +ng +nk +rag +rbag +rg +rk +rt +ruk +shnak +[stop] +/* hr r filen slut */ diff --git a/cosmic rage/names/sparhawk.nam b/cosmic rage/names/sparhawk.nam new file mode 100644 index 0000000..ff17698 --- /dev/null +++ b/cosmic rage/names/sparhawk.nam @@ -0,0 +1,63 @@ +/*****************************************************/ +/* Sparhawk names */ +/*****************************************************/ +/* Sparhawk, Kalten, Khalad, Ehlana, Berit, Sarabian, Zalasta, Stragen, +/* Caladoor, Kurik, Dolman, Setras, Aphrael, Danae, Flute, Talen, Krager, Emban, Vanion, Sephrenia, +/* Oscagne, Itagne, Melidere +[startstav] +/* startstavelser skall sluta med en konsonant som b,k,t etc... */ +K +Kh +Ber +Sar +Str +Cal +Kur +Kr +D +Osc +Zal +B +It +Mel +Z +S +T +Van +Emb +Aphr +Sephr +[mittstav] +a +a +ae +anae +e +io +o +i +u +/* mittstavelser skall brja och sluta med en vokal som a,o,u,i,e,y etc... */ +[slutstav] +/* slutstavelser skall brja med en konsonant som b,k,t etc... */ + + +n +nia +len +ger +gne +dere +rik +lman +door +bian +l +sta +tras +gen +lten +lad +rit +[stop] +/* hr r filen slut */ diff --git a/cosmic rage/nvdaControllerClient32.dll b/cosmic rage/nvdaControllerClient32.dll new file mode 100644 index 0000000..1d061b1 Binary files /dev/null and b/cosmic rage/nvdaControllerClient32.dll differ diff --git a/cosmic rage/readme.txt b/cosmic rage/readme.txt new file mode 100644 index 0000000..fd63e22 --- /dev/null +++ b/cosmic rage/readme.txt @@ -0,0 +1,147 @@ +MUSHclient version 5.06 +======================= + +Friday, 29 March 2019 + + +Author: Nick Gammon +Web support: http://www.gammon.com.au/forum/ + +----------------------------------------- +If you are reading this file with NotePad, +enable "Word Wrap" under the Edit menu for +proper viewing of it. +----------------------------------------- + +MUSHclient is produced by Gammon Software Solutions: + http://www.gammon.com.au/ + +MUSHclient home page: + http://www.gammon.com.au/mushclient/ + +A MUSHclient bug and suggestion list is at: + http://www.gammon.com.au/mushclient/buglist.htm + +Forum for MUSHclient discussions, submitting bugs and suggestions: + http://www.gammon.com.au/forum/?bbsection_id=1 + +MUSHclient scripting functions (and a copy of the help file) are at: + http://www.gammon.com.au/scripts/doc.php + +MUSHclient plugins are available at: + http://www.mushclient.com/plugins/ + + +Changes in this version +----------------------- + +Release notes for every version are kept here: + + http://www.gammon.com.au/scripts/showrelnote.php + + +License +------- + +Use of this program is subject to the License agreement. See Help menu -> About -> License. + +In particular, the software is provided "as is", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. + + +FreeWare +-------- + +MUSHclient is distributed as FreeWare. There is no fee for using it. + + +Source code +----------- + +The source code for MUSHclient is available from: + + http://github.com/nickgammon/mushclient/ + + +Operating System +---------------- + +MUSHclient version 3.xx will run on: + +Windows 95, Windows 98, Windows ME, Windows NT 4, Windows NT 2000, Windows XP, and Windows Vista. + +It will not run on Windows 3.1 or Windows 3.11, sorry! This is because the enhancements in version 3.x use various 32-bit features of the more recent Windows operating systems. If you wish to continue using Windows 3.1, then MUSHclient 1.04 is still a very fast, reliable MUD client. + +It should work on Linux running Wine. See: http://www.gammon.com.au/forum/?id=8380 + + +Bug reports +----------- + +Please submit bug reports or suggested enhancements to the MUSHclient forum: + + http://www.gammon.com.au/forum/?bbsection_id=1 + +There is a "MUSHclient bug list" page on the Web, you may wish to check that page first to see if the bug you are reporting is already known. The bug list page is at: + + http://www.mushclient.com/buglist.htm + + +FAQ +--- + +The MUSHclient FAQ (Frequently Asked Questions) page is at: + + http://www.gammon.com.au/scripts/showfaq.php + + +Answers to common questions are also found at the MUSHclient forum: + + http://www.gammon.com.au/forum/?bbsection_id=1 + + +MUSHclient home page +-------------------- + +The MUSHclient home page on the Web is: + + http://www.mushclient.com/ + + +Compatibility with old world files +---------------------------------- + +MUSHclient version 4 will read world (and trigger, alias etc.) files produced by versions from 3.21 onwards. +You are advised to backup your world and other files, in case you wish to go back to an earlier version. + + + +Credits +------- + +Various aspects of MUSHclient have been written with the help of other people. + +Please see Help -> About -> Credits for a list of those who have contributed. + +MUSHclient splash screen drawn by Isobel Gammon. + + +Comments welcome +---------------- + +Please let me know if you have any problems. Check out the web pages mentioned above for details about later versions or known bugs. + +Send support requests, bug reports, general queries or comments to the forum: + + http://www.gammon.com.au/forum/?bbsection_id=1 + + + +Thanks! +------- + +Thanks to everyone who has supported MUSHclient, either by registering earlier versions, or by sending in comments. Your support is appreciated. + + +Thanks again. I hope you enjoy using MUSHclient, as much as I have writing it. + +- Nick Gammon diff --git a/cosmic rage/scripts/MUSHclient.tlb b/cosmic rage/scripts/MUSHclient.tlb new file mode 100644 index 0000000..dc72a9c Binary files /dev/null and b/cosmic rage/scripts/MUSHclient.tlb differ diff --git a/cosmic rage/scripts/exampscript.js b/cosmic rage/scripts/exampscript.js new file mode 100644 index 0000000..e7ca764 --- /dev/null +++ b/cosmic rage/scripts/exampscript.js @@ -0,0 +1,557 @@ +// Example of coding script routines for MUSHclient in Jscript + +// ---------------------------------------------------------- +// Error codes returned by various functions +// ---------------------------------------------------------- + +var eOK = 0; // No error +var eWorldOpen = 30001; // The world is already open +var eWorldClosed = 30002; // The world is closed, this action cannot be performed +var eNoNameSpecified = 30003; // No name has been specified where one is required +var eCannotPlaySound = 30004; // The sound file could not be played +var eTriggerNotFound = 30005; // The specified trigger name does not exist +var eTriggerAlreadyExists = 30006; // Attempt to add a trigger that already exists +var eTriggerCannotBeEmpty = 30007; // The trigger "match" string cannot be empty +var eInvalidObjectLabel = 30008; // The name of this object is invalid +var eScriptNameNotLocated = 30009; // Script name is not in the script file +var eAliasNotFound = 30010; // The specified alias name does not exist +var eAliasAlreadyExists = 30011; // Attempt to add a alias that already exists +var eAliasCannotBeEmpty = 30012; // The alias "match" string cannot be empty +var eCouldNotOpenFile = 30013; // Unable to open requested file +var eLogFileNotOpen = 30014; // Log file was not open +var eLogFileAlreadyOpen = 30015; // Log file was already open +var eLogFileBadWrite = 30016; // Bad write to log file +var eTimerNotFound = 30017; // The specified timer name does not exist +var eTimerAlreadyExists = 30018; // Attempt to add a timer that already exists +var eVariableNotFound = 30019; // Attempt to delete a variable that does not exist +var eCommandNotEmpty = 30020; // Attempt to use SetCommand with a non-empty command window +var eBadRegularExpression = 30021; // Bad regular expression syntax +var eTimeInvalid = 30022; // Time given to AddTimer is invalid +var eBadMapItem = 30023; // Direction given to AddToMapper is invalid +var eNoMapItems = 30024; // No items in mapper +var eUnknownOption = 30025; // Option name not found +var eOptionOutOfRange = 30026; // New value for option is out of range +var eTriggerSequenceOutOfRange = 30027; // Trigger sequence value invalid +var eTriggerSendToInvalid = 30028; // Where to send trigger text to is invalid +var eTriggerLabelNotSpecified = 30029; // Trigger label not specified/invalid for 'send to variable' +var ePluginFileNotFound = 30030; // File name specified for plugin not found +var eProblemsLoadingPlugin = 30031; // There was a parsing or other problem loading the plugin +var ePluginCannotSetOption = 30032; // Plugin is not allowed to set this option +var ePluginCannotGetOption = 30033; // Plugin is not allowed to get this option +var eNoSuchPlugin = 30034; // Requested plugin is not installed +var eNotAPlugin = 30035; // Only a plugin can do this +var eNoSuchRoutine = 30036; // Plugin does not support that subroutine (subroutine not in script) +var ePluginDoesNotSaveState = 30037; // Plugin does not support saving state +var ePluginCouldNotSaveState = 30037; // Plugin could not save state (eg. no state directory) +var ePluginDisabled = 30039; // Plugin is currently disabled +var eErrorCallingPluginRoutine = 30040; // Could not call plugin routine +var eCommandsNestedTooDeeply = 30041; // Calls to "Execute" nested too deeply +var eCannotCreateChatSocket = 30042; // Unable to create socket for chat connection +var eCannotLookupDomainName = 30043; // Unable to do DNS (domain name) lookup for chat connection +var eNoChatConnections = 30044; // No chat connections open +var eChatPersonNotFound = 30045; // Requested chat person not connected +var eBadParameter = 30046; // General problem with a parameter to a script call +var eChatAlreadyListening = 30047; // Already listening for incoming chats +var eChatIDNotFound = 30048; // Chat session with that ID not found +var eChatAlreadyConnected = 30049; // Already connected to that server/port +var eClipboardEmpty = 30050; // Cannot get (text from the) clipboard +var eFileNotFound = 30051; // Cannot open the specified file +var eAlreadyTransferringFile = 30052; // Already transferring a file +var eNotTransferringFile = 30053; // Not transferring a file +var eNoSuchCommand = 30054; // There is not a command of that name +var eArrayAlreadyExists = 30055; // That array already exists +var eBadKeyName = 30056; // That name is not permitted for a key +var eArrayDoesNotExist = 30056; // That array does not exist +var eArrayNotEvenNumberOfValues = 30057; // Values to be imported into array are not in pairs +var eImportedWithDuplicates = 30058; // Import succeeded, however some values were overwritten +var eBadDelimiter = 30059; // Import/export delimiter must be a single character, other than backslash +var eSetReplacingExistingValue = 30060; // Array element set, existing value overwritten +var eKeyDoesNotExist = 30061; // Array key does not exist +var eCannotImport = 30062; // Cannot import because cannot find unused temporary character + + +// ---------------------------------------------------------- +// Flags for AddTrigger +// ---------------------------------------------------------- + +var eEnabled = 1; // enable trigger +var eOmitFromLog = 2; // omit from log file +var eOmitFromOutput = 4; // omit trigger from output +var eKeepEvaluating = 8; // keep evaluating +var eIgnoreCase = 16; // ignore case when matching +var eTriggerRegularExpression = 32; // trigger uses regular expression +var eExpandVariables = 512; // expand variables like @direction +var eReplace = 1024; // replace existing trigger of same name +var eTemporary = 16384; // temporary - do not save to world file + + +// ---------------------------------------------------------- +// Colours for AddTrigger +// ---------------------------------------------------------- + +var NOCHANGE = -1; +var custom1 = 0; +var custom2 = 1; +var custom3 = 2; +var custom4 = 3; +var custom5 = 4; +var custom6 = 5; +var custom7 = 6; +var custom8 = 7; +var custom9 = 8; +var custom10 = 9; +var custom11 = 10; +var custom12 = 11; +var custom13 = 12; +var custom14 = 13; +var custom15 = 14; +var custom16 = 15; + +// ---------------------------------------------------------- +// Flags for AddAlias +// ---------------------------------------------------------- + +// var eEnabled = 1; // same as for AddTrigger +var eIgnoreAliasCase = 32; // ignore case when matching +var eOmitFromLogFile = 64; // omit this alias from the log file +var eAliasRegularExpression = 128; // alias is regular expressions +var eExpandVariables = 512; // same as for AddTrigger +// var eReplace = 1024; // same as for AddTrigger +var eAliasSpeedWalk = 2048; // interpret send string as a speed walk string +var eAliasQueue = 4096; // queue this alias for sending at the speedwalking delay interval +var eAliasMenu = 8192; // this alias appears on the alias menu +// var eTemporary = 16384; // same as for AddTrigger + + + +// ---------------------------------------------------------- +// Flags for AddTimer +// ---------------------------------------------------------- + +// var eEnabled = 1; // same as for AddTrigger +var eAtTime = 2; // if not set, time is "every" +var eOneShot = 4; // if set, timer only fires once +var eTimerSpeedWalk = 8; // timer does a speed walk when it fires +var eTimerNote = 16; // timer does a world.note when it fires +var eActiveWhenClosed = 32; // timer fires even when world is disconnected +// var eReplace = 1024; // same as for AddTrigger +// var eTemporary = 16384; // same as for AddTrigger + + +// ---------------------------------------------------------- +// Example showing iterating through all triggers with labels +// ---------------------------------------------------------- + +function showtriggers () +{ +triggerlist = new VBArray(world.GetTriggerList()).toArray(); + +if (triggerlist) // if not empty + for (i = 0; i < triggerlist.length; i++) + world.note(triggerlist [i]); +} // end of showtriggers + + +// ----------------------------------------------- +// Example showing iterating through all variables +// ------------------------------------------------ + +function showvariables () +{ +variablelist = new VBArray(world.GetVariableList()).toArray(); + +if (variablelist) // if not empty + for (i = 0; i < variablelist.length; i++) + world.note(variablelist [i] + " = " + world.GetVariable(variablelist [i])); +} // end of showvariables + + +// ---------------------------------------------------------- +// Example showing iterating through all aliases with labels +// ---------------------------------------------------------- + +function showaliases () +{ +aliaslist = new VBArray(world.GetAliasList()).toArray(); + +if (aliaslist) // if not empty + for (i = 0; i < aliaslist.length; i++) + world.note(aliaslist [i]); +} // end of showaliases + + +// --------------------------------------------------------- +// Example showing running a script on world open +// --------------------------------------------------------- +function OnWorldOpen () +{ +world.note ("---------- World Open ------------"); +} // end of OnWorldOpen + +// --------------------------------------------------------- +// Example showing running a script on world close +// --------------------------------------------------------- +function OnWorldClose () +{ +world.note ("---------- World Close ------------"); +} // end of OnWorldClose + +// --------------------------------------------------------- +// Example showing running a script on world connect +// --------------------------------------------------------- +function OnWorldConnect () +{ +world.note ("---------- World Connect ------------"); +} // end of OnWorldConnect + +// --------------------------------------------------------- +// Example showing running a script on world disconnect +// --------------------------------------------------------- +function OnWorldDisconnect () +{ +world.note ("---------- World Disconnect ------------"); +} // end of OnWorldDisconnect + +// --------------------------------------------------------- +// Example showing running a script on an alias +// +// This script is designed to be called by an alias: ^teleport(.*)$ +// +// This alias SHOULD have "regular expression" checked. +// +// It is for teleporting (going to) a room by number +// +// The room is entered by name and looked up in the variables +// list. +// --------------------------------------------------------- +function OnTeleport (thename, theoutput, wildcardsVB) +{ + +var sDestination; +var sHelp = ""; +var iSubscript; +var iRoom; +var mylistsa; // safe array +var mylistvba; // vb array +var sRoomList; // jscript array + +wildcards = VBArray(wildcardsVB).toArray(); + +sDestination = wildcards [0]; + +// remove leading spaces from destination +while (sDestination.substr (0, 1) == " ") + sDestination = sDestination.substr (1); + +// if nothing entered echo possible destinations +if (sDestination == "") + { + world.note ("-------- TELEPORT destinations ----------"); + + mylistsa = world.GetVariableList (); + + // find list of all variables + if (mylistsa != null) + { + + mylistvba = new VBArray(mylistsa); + sRoomList = mylistvba.toArray (); + + // loop through each variable, and add to help if it starts with "teleport_" + for (iSubscript = mylistvba.lbound (); iSubscript <= mylistvba.ubound (); iSubscript++) + { + if (sRoomList [iSubscript].substr (0, 9) == "teleport_") + { + if (sHelp != "") + sHelp += ", "; + sHelp = sHelp + sRoomList [iSubscript].substr (9); + } // variable starts with "teleport_" + } // loop through sRoomList + + } // having at least one room + + // if no destinations found, tell them + if (sHelp == "") + sHelp = "" + world.note (sHelp); + return; + } // no destination supplied + +// get contents of the destination variable + +iRoom = world.GetVariable ("teleport_" + sDestination.toLowerCase ()); + +// if not found, or invalid name, that isn't in the list +if (iRoom == null) + { + world.note ("******** Destination " + sDestination + " unknown *********"); + return; + } + +world.note ("------> Teleporting to " + sDestination); +world.send ("@teleport #" + iRoom); + +} // end of OnTeleport + + +// --------------------------------------------------------- +// Example showing running a script on an alias +// +// This script is designed to be called by an alias: ^add_teleport(|\s*(\w*)\s*(\d*))$ +// +// This alias SHOULD have "regular expression" checked. +// +// It is for adding a room to the list of rooms to teleport to (by +// the earlier script). +// +// eg. ADD_TELEPORT dungeon 1234 +// +// --------------------------------------------------------- +function OnAddTeleport (thename, theoutput, wildcardsVB) +{ +var sDestination +var iRoom +var iStatus +var sCurrentLocation + +wildcards = VBArray(wildcardsVB).toArray(); + +// wildcard one is the destination +sDestination = wildcards [1] + +// remove leading spaces from destination +while (sDestination.substr (0, 1) == " ") + sDestination = sDestination.substr (1); + +// if nothing entered tell them command syntax +if (sDestination == "") + { + world.note ("Syntax: add_teleport name dbref"); + world.note (" eg. add_teleport LandingBay 4421"); + return; + } + + +// wildcard 2 is the room to go to +iRoom= wildcards [2] + +// remove leading spaces from destination +while (iRoom.substr (0, 1) == " ") + iRoom = iRoom.substr (1); + +// add room and destination location to variable list +iStatus = world.SetVariable ("teleport_" + sDestination, iRoom); + +if (iStatus != 0) + { + world.note ("Room name must be alphabetic, you entered: " + sDestination); + return; + } + +world.note ("Teleport location " + sDestination + "(#" + + iRoom + ") added to teleport list"); + +} // end of OnAddTeleport + +// ------------------------------------------ +// Example showing a script called by a timer +// ------------------------------------------- +function OnTimer (strTimerName) +{ +world.note ("Timer has fired!"); +} // end of OnTimer + + +// -------------------------------------------- +// Example showing a script called by a trigger +// Should be connected to a trigger matching on: <*hp *m *mv>* +// (the above example will work for SMAUG default prompts (eg. <100hp 10m 40mv>) +// it may need to be changed depending on the MUD prompt format). +// -------------------------------------------- +function OnStats (strTriggerName, trig_line, wildcardsVB) +{ + +wildcards = VBArray(wildcardsVB).toArray(); + +iHP = wildcards [0] +iMana = wildcards [1] +iMV = wildcards [2] + +world.Note ("Your HP are " + iHP); +world.Note ("Your Mana is " + iMana); +world.Note ("Your movement points are " + iMV); + +} // end of OnStats + + + +// -------------------------------------------- +// Subroutine to be called to repeat a command. +// +// Call from the alias: ^#(\d+)\s+(.+)$ +// Regular Expression: checked +// +// Example of use: #10 give sword to Trispis +// This would send "give sword to Trispis" 10 times +// -------------------------------------------- +function OnRepeat (strAliasName, strOutput, wildcardsVB) +{ + wildcards = VBArray(wildcardsVB).toArray(); + + for (i = 1; i <= wildcards [0]; i++) + world.Send (wildcards [1]); +} // end of OnRepeat + +// -------------------------------------------- +// Example showing iterating through all worlds +// -------------------------------------------- + +function showworlds () +{ +worldlist = new VBArray(world.GetworldList()).toArray(); + +if (worldlist) // if not empty + for (i = 0; i < worldlist.length; i++) + world.note(worldlist [i]); + +} // end of showworlds + +// -------------------------------------------------- +// Example showing sending a message to another world +// -------------------------------------------------- + +function SendToWorld (name, message) +{ +var otherworld + + otherworld = world.getworld (name); + + if (otherworld == null) + { + world.note ("World " + name + " is not open"); + return; + } + + otherworld.send (message); + +} + +// -------------------------------------------- +// Example trigger routine that just shows what was passed to it +// -------------------------------------------- + +function ExampleTrigger (thename, theoutput, wildcardsVB) +{ + wildcards = VBArray(wildcardsVB).toArray(); + + world.note ("Trigger " + thename + " fired."); + world.note ("Matching line was: " + theoutput); + + for (i = 0; i < 10; i++) + if (wildcards [i] != "") + world.note ("Wildcard " + i + " = " + wildcards [i]); + +} + +/**************** +WEAPON COMPARISON +Compares two weapons and returns the result. + +Alias (MUST be regular expression): + ^compare (.+)\s(\d+d\d+)\s(\d+)/(\d+)\s(.+)\s(\d+d\d+)\s(\d+)/(\d+)(|.+)$ + +Syntax: + compare d
    / d
    / [action] + +Example: + --> "compare dagger 2d2 4/2 sword 4d6 5/5" + would compare the dagger to the sword and report which one's the best + + you can also include an action... + + --> "compare mace 6d7 2/3 pickaxe 2d12 1/4 say" + would say the best weapon + + NOTE: action can be multiple words (e.g "tell vryce") + + +****************/ +function CompareWeapons(alias_name, alias_output, wildcardsVB) { + //Collect wildcards into a Javascript array + wildcards = VBArray(wildcardsVB).toArray(); + + //General variables + var sendmud = AllToUpper(wildcards[8].replace(/^\W+/,'')).replace(/\W+$/,''); + + //Weapon one variables + var name1 = AllToUpper(wildcards[0]); + var num1 = parseInt(wildcards[1].substr(0,1)); + var dice1 = parseInt(wildcards[1].substr(2)); + var hit1 = parseInt(wildcards[2]); + var dam1 = parseInt(wildcards[3]); + var max1 = (num1*dice1)+dam1; + var min1 = num1+dam1; + var avg1 = (max1+min1)/2; + var score1 = avg1+(hit1/2); + var weap1stat = name1 + ": " + num1 + "d" + dice1 + " hr(" + hit1 + ") dr(" + dam1 + ") min(" + min1 + ") max(" + max1 + ") avg(" + avg1 + ")"; + + //Weapon two variables + var name2 = AllToUpper(wildcards[4]); + var num2 = parseInt(wildcards[5].substr(0,1)); + var dice2 = parseInt(wildcards[5].substr(2)); + var hit2 = parseInt(wildcards[6]); + var dam2 = parseInt(wildcards[7]); + var max2 = (num2*dice2)+dam2; + var min2 = num2+dam2; + var avg2 = (max2+min2)/2; + var score2 = avg2+(hit2/2); + var weap2stat = name2 + ": " + num2 + "d" + dice2 + " hr(" + hit2 + ") dr(" + dam2 + ") min(" + min2 + ") max(" + max2 + ") avg(" + avg2 + ")"; + + + //Calculate the better weapon + if (score1 > score2) { + var resstring = name1 + " is " + Math.round(100-score2*100/score1) + "% better than " + name2; + } else if (score1 < score2) { + var resstring = name2 + " is " + Math.round(100-score1*100/score2) + "% better than " + name1; + } + + //Send output either locally or with specified prefix to mud + if (sendmud != "") { + world.send(sendmud + " " + weap1stat); + world.send(sendmud + " " + weap2stat); + world.send(sendmud + " " + resstring); + } else { + world.note(weap1stat); + world.note(weap2stat); + world.note(resstring); + } +} +/********** +ALLTOUPPER +Returns string with the first letter in each word uppercase +***********/ +function AllToUpper(str) + { + aString = (str.replace(/^\W+/,'')).replace(/\W+$/,'').split(" "); + str = ""; + for (i = 0; i < aString.length; i++) { + str += aString[i].substr(0,1).toUpperCase() + aString[i].substr(1).toLowerCase() + " "; + } + return str.substr(0,str.length-1); +} + +// -------------------------------------------- +// Subroutine to be called remember which way you walked. +// +// Call from the alias: keypad-* +// Send: %1 +// +// -------------------------------------------- +function OnKeypadDirection (strAliasName, strOutput, wildcardsVB) +{ + wildcards = VBArray(wildcardsVB).toArray(); + world.setvariable("direction", wildcards [0]); +} + +world.note ("Scripting enabled - script file processed"); + diff --git a/cosmic rage/scripts/exampscript.lua b/cosmic rage/scripts/exampscript.lua new file mode 100644 index 0000000..d9f16d7 --- /dev/null +++ b/cosmic rage/scripts/exampscript.lua @@ -0,0 +1,275 @@ +-- Example of coding script routines for MUSHclient in Lua + +-- -------------------------------------------- +-- Example trigger routine that just shows what was passed to it +-- -------------------------------------------- + +function ExampleTrigger (thename, theoutput, wildcards, line) + + require "tprint" + + Note ("Trigger " .. thename .. " fired.") + Note ("Matching line was: " .. theoutput) + Note ("Wildcards ...") + tprint (wildcards) + Note ("Line with style runs ...") + tprint (line) + +end -- of ExampleTrigger + +-- ---------------------------------------------------------- +-- Example showing iterating through all triggers +-- ---------------------------------------------------------- + +function showtriggers () + local _, v + for _, v in ipairs (GetTriggerList ()) do + Note (v) + end +end -- of showtriggers + +-- ----------------------------------------------- +-- Example showing iterating through all variables +-- ------------------------------------------------ + +function showvariables () + table.foreach (GetVariableList(), print) +end -- of showvariables + +-- ---------------------------------------------------------- +-- Example showing iterating through all aliases with labels +-- ---------------------------------------------------------- + +function showaliases () + local _, v + for _, v in ipairs (GetAliasList ()) do + Note (v) + end +end -- of showaliases + + +-- --------------------------------------------------------- +-- Example showing running a script on world open +-- --------------------------------------------------------- +function OnWorldOpen () + Note ("---------- World Open ------------") +end -- of OnWorldOpen + +-- --------------------------------------------------------- +-- Example showing running a script on world close +-- --------------------------------------------------------- +function OnWorldClose () + Note ("---------- World Close ------------") +end -- of OnWorldClose + +-- --------------------------------------------------------- +-- Example showing running a script on world connect +-- --------------------------------------------------------- +function OnWorldConnect () + Note ("---------- World Connect ------------") +end -- of OnWorldConnect + +-- --------------------------------------------------------- +-- Example showing running a script on world disconnect +-- --------------------------------------------------------- +function OnWorldDisconnect () + Note ("---------- World Disconnect ------------") +end -- of OnWorldDisconnect + +-- --------------------------------------------------------- +-- Example showing running a script on an alias +-- +-- This script is designed to be called by an alias: ^teleport(.*)$ +-- +-- This alias SHOULD have "regular expression" checked. +-- +-- It is for teleporting (going to) a room by number +-- +-- The room is entered by name and looked up in the variables +-- list. +-- --------------------------------------------------------- +function OnTeleport (name, output, wildcards) + + local sDestination + local sHelp = "" + local iRoom + + sDestination = Trim (wildcards [1]) + + -- if nothing entered echo possible destinations + if sDestination == "" then + + Note ("-------- TELEPORT destinations ----------") + + local k, v + for k, v in pairs (GetVariableList ()) do + if string.sub (k, 1, 9) == "teleport_" then + if sHelp ~= "" then + sHelp = sHelp .. ", " + end + sHelp = sHelp .. string.sub (k, 10) + end + end + + -- if no destinations found, tell them + if sHelp == "" then + sHelp = "" + end + Note (sHelp) + return + end -- no destination supplied + + -- get contents of the destination variable + + iRoom = world.GetVariable ("teleport_" .. string.lower (sDestination)) + + -- if not found, or invalid name, that isn't in the list + if iRoom == nil then + Note ("******** Destination " .. sDestination .. " unknown *********") + return + end + + Note ("------> Teleporting to " .. sDestination) + Send ("@teleport #" .. iRoom) + +end -- end of OnTeleport + + +-- --------------------------------------------------------- +-- Example showing running a script on an alias +-- +-- This script is designed to be called by an alias: ^add_teleport(|\s*(\w*)\s*(\d*))$ +-- +-- This alias SHOULD have "regular expression" checked. +-- +-- It is for adding a room to the list of rooms to teleport to (by +-- the earlier script). +-- +-- eg. ADD_TELEPORT dungeon 1234 +-- +-- --------------------------------------------------------- +function OnAddTeleport (name, output, wildcards) + + local sDestination + local iRoom + local iStatus + + sDestination = Trim (wildcards [2]) + + -- if nothing entered tell them command syntax + if sDestination == "" then + Note ("Syntax: add_teleport name dbref") + Note (" eg. add_teleport LandingBay 4421") + return + end + + -- room to go to + iRoom = wildcards [3] + + if not tonumber (iRoom) then + Note ("Room number must be numeric, you entered " .. iRoom) + return + end + + -- add room and destination location to variable list + iStatus = world.SetVariable ("teleport_" .. string.lower (sDestination), iRoom) + + if iStatus ~= 0 then + Note ("Room name must be alphabetic, you entered: " + sDestination) + return + end + + Note ("Teleport location " .. sDestination .. "(#" + .. iRoom .. ") added to teleport list") + +end -- of OnAddTeleport + +-- ------------------------------------------ +-- Example showing a script called by a timer +-- ------------------------------------------- +function OnTimer (strTimerName) + Note ("Timer has fired!") +end -- of OnTimer + + +-- -------------------------------------------- +-- Example showing a script called by a trigger +-- Should be connected to a trigger matching on: <*hp *m *mv>* +-- (the above example will work for SMAUG default prompts (eg. <100hp 10m 40mv>) +-- it may need to be changed depending on the MUD prompt format). +-- -------------------------------------------- +function OnStats (name, trig_line, wildcards) + + local iHP = wildcards [1] + local iMana = wildcards [2] + local iMV = wildcards [3] + + Note ("Your HP are " .. iHP) + Note ("Your Mana is " .. iMana) + Note ("Your movement points are " .. iMV) + +end -- of OnStats + + +-- -------------------------------------------- +-- Subroutine to be called to repeat a command. +-- +-- Call from the alias: ^#(\d+)\s+(.+)$ +-- Regular Expression: checked +-- +-- Example of use: #10 give sword to Trispis +-- This would send "give sword to Trispis" 10 times +-- -------------------------------------------- +function OnRepeat (name, line, wildcards) + +local count = wildcards [1] + + if not tonumber (count) then + Note ("Repeat count must be numeric, you entered ", count) + return + end + + local i + for i = 1, count do + Send (wildcards [2]) + end + +end -- of OnRepeat + +-- -------------------------------------------- +-- Example showing iterating through all worlds +-- -------------------------------------------- + +function showworlds () + local _, v + + for _, v in ipairs (GetWorldList ()) do + Note (v) + end + +end -- of showworlds + +-- -------------------------------------------------- +-- Example showing sending a message to another world +-- -------------------------------------------------- + +function SendToWorld (name, message) + +local otherworld + + otherworld = GetWorld (name) + + if otherworld == nil then + Note ("World " .. name .. " is not open") + return + end + + Send (otherworld, message) + + -- alternative syntax: otherworld:Send (message) + +end -- of SendToWorld + + +Note ("Lua scripting enabled - script file processed") + diff --git a/cosmic rage/scripts/exampscript.pl b/cosmic rage/scripts/exampscript.pl new file mode 100644 index 0000000..65ec27f --- /dev/null +++ b/cosmic rage/scripts/exampscript.pl @@ -0,0 +1,441 @@ +# Example of coding script routines for MUSHclient in PerlScript + +# ---------------------------------------------------------- +# Error codes returned by various functions +# ---------------------------------------------------------- + +my $eOK = 0; # No error +my $eWorldOpen = 30001; # The world is already open +my $eWorldClosed = 30002; # The world is closed, this action cannot be performed +my $eNoNameSpecified = 30003; # No name has been specified where one is required +my $eCannotPlaySound = 30004; # The sound file could not be played +my $eTriggerNotFound = 30005; # The specified trigger name does not exist +my $eTriggerAlreadyExists = 30006; # Attempt to add a trigger that already exists +my $eTriggerCannotBeEmpty = 30007; # The trigger "match" string cannot be empty +my $eInvalidObjectLabel = 30008; # The name of this object is invalid +my $eScriptNameNotLocated = 30009; # Script name is not in the script file +my $eAliasNotFound = 30010; # The specified alias name does not exist +my $eAliasAlreadyExists = 30011; # Attempt to add a alias that already exists +my $eAliasCannotBeEmpty = 30012; # The alias "match" string cannot be empty +my $eCouldNotOpenFile = 30013; # Unable to open requested file +my $eLogFileNotOpen = 30014; # Log file was not open +my $eLogFileAlreadyOpen = 30015; # Log file was already open +my $eLogFileBadWrite = 30016; # Bad write to log file +my $eTimerNotFound = 30017; # The specified timer name does not exist +my $eTimerAlreadyExists = 30018; # Attempt to add a timer that already exists +my $eVariableNotFound = 30019; # Attempt to delete a variable that does not exist +my $eCommandNotEmpty = 30020; # Attempt to use SetCommand with a non-empty command window +my $eBadRegularExpression = 30021; # Bad regular expression syntax +my $eTimeInvalid = 30022; # Time given to AddTimer is invalid +my $eBadMapItem = 30023; # Direction given to AddToMapper is invalid +my $eNoMapItems = 30024; # No items in mapper +my $eUnknownOption = 30025; # Option name not found +my $eOptionOutOfRange = 30026; # New value for option is out of range +my $eTriggerSequenceOutOfRange = 30027; # Trigger sequence value invalid +my $eTriggerSendToInvalid = 30028; # Where to send trigger text to is invalid +my $eTriggerLabelNotSpecified = 30029; # Trigger label not specified/invalid for 'send to variable' +my $ePluginFileNotFound = 30030; # File name specified for plugin not found +my $eProblemsLoadingPlugin = 30031; # There was a parsing or other problem loading the plugin +my $ePluginCannotSetOption = 30032; # Plugin is not allowed to set this option +my $ePluginCannotGetOption = 30033; # Plugin is not allowed to get this option +my $eNoSuchPlugin = 30034; # Requested plugin is not installed +my $eNotAPlugin = 30035; # Only a plugin can do this +my $eNoSuchRoutine = 30036; # Plugin does not support that subroutine (subroutine not in script) +my $ePluginDoesNotSaveState = 30037; # Plugin does not support saving state +my $ePluginCouldNotSaveState = 30037; # Plugin could not save state (eg. no state directory) +my $ePluginDisabled = 30039; # Plugin is currently disabled +my $eErrorCallingPluginRoutine = 30040; # Could not call plugin routine +my $eCommandsNestedTooDeeply = 30041; # Calls to "Execute" nested too deeply +my $eCannotCreateChatSocket = 30042; # Unable to create socket for chat connection +my $eCannotLookupDomainName = 30043; # Unable to do DNS (domain name) lookup for chat connection +my $eNoChatConnections = 30044; # No chat connections open +my $eChatPersonNotFound = 30045; # Requested chat person not connected +my $eBadParameter = 30046; # General problem with a parameter to a script call +my $eChatAlreadyListening = 30047; # Already listening for incoming chats +my $eChatIDNotFound = 30048; # Chat session with that ID not found +my $eChatAlreadyConnected = 30049; # Already connected to that server/port +my $eClipboardEmpty = 30050; # Cannot get (text from the) clipboard +my $eFileNotFound = 30051; # Cannot open the specified file +my $eAlreadyTransferringFile = 30052; # Already transferring a file +my $eNotTransferringFile = 30053; # Not transferring a file +my $eNoSuchCommand = 30054; # There is not a command of that name +my $eArrayAlreadyExists = 30055; # That array already exists +my $eBadKeyName = 30056; # That name is not permitted for a key +my $eArrayDoesNotExist = 30056; # That array does not exist +my $eArrayNotEvenNumberOfValues = 30057; # Values to be imported into array are not in pairs +my $eImportedWithDuplicates = 30058; # Import succeeded, however some values were overwritten +my $eBadDelimiter = 30059; # Import/export delimiter must be a single character, other than backslash +my $eSetReplacingExistingValue = 30060; # Array element set, existing value overwritten +my $eKeyDoesNotExist = 30061; # Array key does not exist +my $eCannotImport = 30062; # Cannot import because cannot find unused temporary character + + +# ---------------------------------------------------------- +# Flags for AddTrigger +# ---------------------------------------------------------- + +my $eEnabled = 1; # enable trigger +my $eOmitFromLog = 2; # omit from log file +my $eOmitFromOutput = 4; # omit trigger from output +my $eKeepEvaluating = 8; # keep evaluating +my $eIgnoreCase = 16; # ignore case when matching +my $eTriggerRegularExpression = 32; # trigger uses regular expression +my $eExpandVariables = 512; # expand variables like @direction +my $eReplace = 1024; # replace existing trigger of same name +my $eTemporary = 16384; # temporary - do not save to world file + +# ---------------------------------------------------------- +# Colours for AddTrigger +# ---------------------------------------------------------- + +my $NOCHANGE = -1; +my $custom1 = 0; +my $custom2 = 1; +my $custom3 = 2; +my $custom4 = 3; +my $custom5 = 4; +my $custom6 = 5; +my $custom7 = 6; +my $custom8 = 7; +my $custom9 = 8; +my $custom10 = 9; +my $custom11 = 10; +my $custom12 = 11; +my $custom13 = 12; +my $custom14 = 13; +my $custom15 = 14; +my $custom16 = 15; + +# ---------------------------------------------------------- +# Flags for AddAlias +# ---------------------------------------------------------- + +# my $eEnabled = 1; # same as for AddTrigger +my $eIgnoreAliasCase = 32; # ignore case when matching +my $eOmitFromLogFile = 64; # omit this alias from the log file +my $eAliasRegularExpression = 128; # alias is regular expressions +# my $eExpandVariables = 512; # same as for AddTrigger +# my $eReplace = 1024; # same as for AddTrigger +my $eAliasSpeedWalk = 2048; # interpret send string as a speed walk string +my $eAliasQueue = 4096; # queue this alias for sending at the speedwalking delay interval +my $eAliasMenu = 8192; # this alias appears on the alias menu +my $eTemporary = 16384; # temporary - do not save to world file + +# ---------------------------------------------------------- +# Flags for AddTimer +# ---------------------------------------------------------- + +# my $eEnabled = 1; # same as for AddTrigger +my $eAtTime = 2; # if not set, time is "every" +my $eOneShot = 4; # if set, timer only fires once +my $eTimerSpeedWalk = 8; # timer does a speed walk when it fires +my $eTimerNote = 16; # timer does a world.note when it fires +my $eActiveWhenClosed = 32; # timer fires even when world is disconnected +# my $eReplace = 1024; # same as for AddTrigger +# my $eTemporary = 16384; # same as for AddTrigger + +# ---------------------------------------------------------- +# Example showing iterating through all triggers with labels +# ---------------------------------------------------------- + +sub showtriggers +{ +foreach $item (Win32::OLE::in ($world->GetTriggerList)) + { + $world->note($item); + } +} # end of showtriggers + + +# ----------------------------------------------- +# Example showing iterating through all variables +# ------------------------------------------------ + +sub showvariables +{ +foreach $item (Win32::OLE::in ($world->GetVariableList)) + { + ($key, $value) = ($item, $world->GetVariable ($item)); + $world->note($key . " = " . $value) if (defined ($key)); + } +} # end of showvariables + + +# ---------------------------------------------------------- +# Example showing iterating through all aliases with labels +# ---------------------------------------------------------- + +sub showaliases +{ +foreach $item (Win32::OLE::in ($world->GetAliasList)) + { + $world->note($item); + } +} # end of showaliases + + +# --------------------------------------------------------- +# Example showing running a script on world open +# --------------------------------------------------------- +sub OnWorldOpen +{ +$world->note ("---------- World Open ------------"); +} # end of OnWorldOpen + +# --------------------------------------------------------- +# Example showing running a script on world close +# --------------------------------------------------------- +sub OnWorldClose +{ +$world->note ("---------- World Close ------------"); +} # end of OnWorldClose + +# --------------------------------------------------------- +# Example showing running a script on world connect +# --------------------------------------------------------- +sub OnWorldConnect +{ +$world->note ("---------- World Connect ------------"); +} # end of OnWorldConnect + +# --------------------------------------------------------- +# Example showing running a script on world disconnect +# --------------------------------------------------------- +sub OnWorldDisconnect +{ +$world->note ("---------- World Disconnect ------------"); +} # end of OnWorldDisconnect + + +# --------------------------------------------------------- +# Example showing running a script on an alias +# +# This script is designed to be called by an alias: ^teleport(.*)$ +# +# This alias SHOULD have "regular expression" checked. +# +# It is for teleporting (going to) a room by number +# +# The room is entered by name and looked up in the variables +# list. +# --------------------------------------------------------- +sub OnTeleport +{ + +my ($thename, $theoutput, $wildcards) = @_; + +$sDestination = $world->trim ($world->GetAliasInfo ($thename, 101)); + +# if nothing entered echo possible destinations + +if ($sDestination eq "") + { + $world->note ("-------- TELEPORT destinations ----------"); + + foreach $item (Win32::OLE::in ($world->GetVariableList())) + { + ($key, $value) = ($item, $world->GetVariable ($item)); + if (substr ($key, 0, 9) eq "teleport_") + { + $sHelp .= ", " if ($sHelp ne ""); + $sHelp .= substr ($key, 9); + } + } + + # if no destinations found, tell them + + $sHelp = "" if ($sHelp eq ""); + $world->note ($sHelp); + return; + } # no destination supplied + +# get contents of the destination variable + +$iRoom = $world->GetVariable ("teleport_" . lc ($sDestination)); + +# if not found, or invalid name, that isn't in the list +if (!defined ($iRoom)) + { + $world->note ("******** Destination $sDestination unknown *********"); + return; + } + +$world->note ("------> Teleporting to $sDestination"); +$world->send ("\@teleport #$iRoom"); + +} # end of OnTeleport + +# --------------------------------------------------------- +# Example showing running a script on an alias +# +# This script is designed to be called by an alias: ^add_teleport(|\s*(\w*)\s*(\d*))$ +# +# This alias SHOULD have "regular expression" checked. +# +# It is for adding a room to the list of rooms to teleport to (by +# the earlier script). +# +# eg. ADD_TELEPORT dungeon 1234 +# +# --------------------------------------------------------- +sub OnAddTeleport +{ +my ($thename, $theoutput, $wildcards) = @_; + +# wildcard 2 is the room name + +$sDestination = $world->trim ($world->GetAliasInfo ($thename, 102)); + +# if nothing entered tell them command syntax +if ($sDestination eq "") + { + $world->note ("Syntax: add_teleport name dbref"); + $world->note (" eg. add_teleport LandingBay 4421"); + return; + } + +# wildcard 3 is where to go to + +$iRoom = $world->trim ($world->GetAliasInfo ($thename, 103)); + +# add room and destination location to variable list +$iStatus = $world->SetVariable ("teleport_$sDestination", $iRoom); + +if ($iStatus != 0) + { + $world->note ("Room name must be alphabetic, you entered: $sDestination"); + return; + } + +$world->note ("Teleport location $sDestination (#$iRoom) added to teleport list"); + +} # end of OnAddTeleport + + +# ------------------------------------------ +# Example showing a script called by a timer +# ------------------------------------------- +sub OnTimer +{ +my ($strTimerName) = @_; + +$world->note ("Timer $strTimerName has fired!"); +} # end of OnTimer + +# -------------------------------------------- +# Example showing a script called by a trigger +# Should be connected to a trigger matching on: <*hp *m *mv>* +# (the above example will work for SMAUG default prompts (eg. <100hp 10m 40mv>) +# it may need to be changed depending on the MUD prompt format). +# -------------------------------------------- +sub OnStats +{ +my ($strTriggerName, $trig_line, $wildcards) = @_; + +$iHP = $world->GetTriggerInfo ($strTriggerName, 101); +$iMana = $world->GetTriggerInfo ($strTriggerName, 102); +$iMV = $world->GetTriggerInfo ($strTriggerName, 103); + +$world->Note ("Your HP are $iHP"); +$world->Note ("Your Mana is $iMana"); +$world->Note ("Your movement points are $iMV"); + +} # end of OnStats + + + +# -------------------------------------------- +# Subroutine to be called to repeat a command. +# +# Call from the alias: ^#(\d+)\s+(.+)$ +# Regular Expression: checked +# +# Example of use: #10 give sword to Trispis +# This would send "give sword to Trispis" 10 times +# -------------------------------------------- +sub OnRepeat +{ +my ($thename, $theoutput, $wildcards) = @_; + + $iCount = $world->GetAliasInfo ($thename, 101); # count of times + $iCommand = $world->GetAliasInfo ($thename, 102); # what to send + + for ($i = 1; $i <= $iCount; $i++) + { + $world->Send ($iCommand); + } +} # end of OnRepeat + + + +# -------------------------------------------- +# Example showing iterating through all worlds +# -------------------------------------------- + +sub showworlds +{ + foreach $item (Win32::OLE::in ($world->GetWorldList)) + { + $world->note($item); + } + +} # end of showworlds + +# -------------------------------------------------- +# Example showing sending a message to another world +# -------------------------------------------------- + +sub SendToWorld + { + my ($name, $message) = @_; + + my $otherworld; + + $otherworld = $world->getworld ($name); + + if (!defined ($otherworld)) + { + $world->note("World " . $name . " is not open"); + return; + } + + $otherworld->send($message); + + } + +# -------------------------------------------- +# Example trigger routine that just shows what was passed to it +# -------------------------------------------- + +sub ExampleTrigger +{ + my ($thename, $theoutput, @$wildcards) = @_; + + $world->note ("Trigger " . $thename . " fired."); + $world->note ("Matching line was: " . $theoutput); + + for ($i = 1; $i <= 10; $i++) + { + $wildcard = $world->GetTriggerInfo ($thename, 100 + $i); + $world->note ("Wildcard $i = $wildcard"); + } +} + + +# -------------------------------------------- +# Subroutine to be called remember which way you walked. +# +# Call from the alias: keypad-* +# Send: %1 +# +# -------------------------------------------- +sub OnKeypadDirection +{ +my ($thename, $theoutput, $wildcards) = @_; + + $Direction = $world->GetAliasInfo ($thename, 101); + $world->setvariable("direction", $Direction); +} + +$world->note ("Scripting enabled - script file processed"); + diff --git a/cosmic rage/scripts/exampscript.pys b/cosmic rage/scripts/exampscript.pys new file mode 100644 index 0000000..a3d4e65 --- /dev/null +++ b/cosmic rage/scripts/exampscript.pys @@ -0,0 +1,402 @@ +# Example of coding script routines for MUSHclient in Python + +# ---------------------------------------------------------- +# Error codes returned by various functions +# ---------------------------------------------------------- + +eOK = 0 # No error +eWorldOpen = 30001 # The world is already open +eWorldClosed = 30002 # The world is closed, this action cannot be performed +eNoNameSpecified = 30003 # No name has been specified where one is required +eCannotPlaySound = 30004 # The sound file could not be played +eTriggerNotFound = 30005 # The specified trigger name does not exist +eTriggerAlreadyExists = 30006 # Attempt to add a trigger that already exists +eTriggerCannotBeEmpty = 30007 # The trigger "match" string cannot be empty +eInvalidObjectLabel = 30008 # The name of this object is invalid +eScriptNameNotLocated = 30009 # Script name is not in the script file +eAliasNotFound = 30010 # The specified alias name does not exist +eAliasAlreadyExists = 30011 # Attempt to add a alias that already exists +eAliasCannotBeEmpty = 30012 # The alias "match" string cannot be empty +eCouldNotOpenFile = 30013 # Unable to open requested file +eLogFileNotOpen = 30014 # Log file was not open +eLogFileAlreadyOpen = 30015 # Log file was already open +eLogFileBadWrite = 30016 # Bad write to log file +eTimerNotFound = 30017 # The specified timer name does not exist +eTimerAlreadyExists = 30018 # Attempt to add a timer that already exists +eVariableNotFound = 30019 # Attempt to delete a variable that does not exist +eCommandNotEmpty = 30020 # Attempt to use SetCommand with a non-empty command window +eBadRegularExpression = 30021 # Bad regular expression syntax +eTimeInvalid = 30022 # Time given to AddTimer is invalid +eBadMapItem = 30023 # Direction given to AddToMapper is invalid +eNoMapItems = 30024 # No items in mapper +eUnknownOption = 30025 # Option name not found +eOptionOutOfRange = 30026 # New value for option is out of range +eTriggerSequenceOutOfRange = 30027 # Trigger sequence value invalid +eTriggerSendToInvalid = 30028 # Where to send trigger text to is invalid +eTriggerLabelNotSpecified = 30029 # Trigger label not specified/invalid for 'send to variable' +ePluginFileNotFound = 30030 # File name specified for plugin not found +eProblemsLoadingPlugin = 30031 # There was a parsing or other problem loading the plugin +ePluginCannotSetOption = 30032 # Plugin is not allowed to set this option +ePluginCannotGetOption = 30033 # Plugin is not allowed to get this option +eNoSuchPlugin = 30034 # Requested plugin is not installed +eNotAPlugin = 30035 # Only a plugin can do this +eNoSuchRoutine = 30036 # Plugin does not support that subroutine (subroutine not in script) +ePluginDoesNotSaveState = 30037 # Plugin does not support saving state +ePluginCouldNotSaveState = 30037 # Plugin could not save state (eg. no state directory) +ePluginDisabled = 30039 # Plugin is currently disabled +eErrorCallingPluginRoutine = 30040 # Could not call plugin routine +eCommandsNestedTooDeeply = 30041 # Calls to "Execute" nested too deeply +eCannotCreateChatSocket = 30042 # Unable to create socket for chat connection +eCannotLookupDomainName = 30043 # Unable to do DNS (domain name) lookup for chat connection +eNoChatConnections = 30044 # No chat connections open +eChatPersonNotFound = 30045 # Requested chat person not connected +eBadParameter = 30046 # General problem with a parameter to a script call +eChatAlreadyListening = 30047 # Already listening for incoming chats +eChatIDNotFound = 30048 # Chat session with that ID not found +eChatAlreadyConnected = 30049 # Already connected to that server/port +eClipboardEmpty = 30050 # Cannot get (text from the) clipboard +eFileNotFound = 30051 # Cannot open the specified file +eAlreadyTransferringFile = 30052 # Already transferring a file +eNotTransferringFile = 30053 # Not transferring a file +eNoSuchCommand = 30054 # There is not a command of that name +eArrayAlreadyExists = 30055 # That array already exists +eBadKeyName = 30056 # That name is not permitted for a key +eArrayDoesNotExist = 30056 # That array does not exist +eArrayNotEvenNumberOfValues = 30057 # Values to be imported into array are not in pairs +eImportedWithDuplicates = 30058 # Import succeeded, however some values were overwritten +eBadDelimiter = 30059 # Import/export delimiter must be a single character, other than backslash +eSetReplacingExistingValue = 30060 # Array element set, existing value overwritten +eKeyDoesNotExist = 30061 # Array key does not exist +eCannotImport = 30062 # Cannot import because cannot find unused temporary character + + +# ---------------------------------------------------------- +# Flags for AddTrigger +# ---------------------------------------------------------- + +eEnabled = 1 # enable trigger +eOmitFromLog = 2 # omit from log file +eOmitFromOutput = 4 # omit trigger from output +eKeepEvaluating = 8 # keep evaluating +eIgnoreCase = 16 # ignore case when matching +eTriggerRegularExpression = 32 # trigger uses regular expression +eExpandVariables = 512 # expand variables like @direction +eReplace = 1024 # replace existing trigger of same name +eLowercaseWildcard = 2048 # wildcards forced to lower-case +eTemporary = 16384 # temporary - do not save to world file + +# ---------------------------------------------------------- +# Colours for AddTrigger +# ---------------------------------------------------------- + +NOCHANGE = -1 +custom1 = 0 +custom2 = 1 +custom3 = 2 +custom4 = 3 +custom5 = 4 +custom6 = 5 +custom7 = 6 +custom8 = 7 +custom9 = 8 +custom10 = 9 +custom11 = 10 +custom12 = 11 +custom13 = 12 +custom14 = 13 +custom15 = 14 +custom16 = 15 + +# ---------------------------------------------------------- +# Flags for AddAlias +# ---------------------------------------------------------- + +# eEnabled = 1 # same as for AddTrigger +eIgnoreAliasCase = 32 # ignore case when matching +eOmitFromLogFile = 64 # omit this alias from the log file +eAliasRegularExpression = 128 # alias is regular expressions +# eExpandVariables = 512 # same as for AddTrigger +# eReplace = 1024 # same as for AddTrigger +eAliasSpeedWalk = 2048 # interpret send string as a speed walk string +eAliasQueue = 4096 # queue this alias for sending at the speedwalking delay interval +eAliasMenu = 8192 # this alias appears on the alias menu +# eTemporary = 16384 # same as for AddTrigger + +# ---------------------------------------------------------- +# Flags for AddTimer +# ---------------------------------------------------------- + +# eEnabled = 1 # same as for AddTrigger +eAtTime = 2 # if not set, time is "every" +eOneShot = 4 # if set, timer only fires once +eTimerSpeedWalk = 8 # timer does a speed walk when it fires +eTimerNote = 16 # timer does a world.note when it fires +eActiveWhenClosed = 32 # timer fires even when world is disconnected +# eReplace = 1024 # same as for AddTrigger +# eTemporary = 16384 # same as for AddTrigger + + +# ---------------------------------------------------------- +# Example showing iterating through all triggers +# ---------------------------------------------------------- + +def showtriggers (): + triggerlist = world.GetTriggerList + if (triggerlist): + for t in triggerlist : world.Note (t) + + +# ----------------------------------------------- +# Example showing iterating through all variables +# ------------------------------------------------ + +def showvariables (): + variablelist = world.GetVariableList + if (variablelist ): + for v in variablelist : world.Note (v + " = " + + world.GetVariable(v)) + +# ---------------------------------------------------------- +# Example showing iterating through all aliases +# ---------------------------------------------------------- + +def showaliases (): + aliaslist = world.GetAliasList + if (aliaslist ): + for a in aliaslist : world.Note (a) + + +# --------------------------------------------------------- +# Example showing running a script on world open +# --------------------------------------------------------- +def OnWorldOpen (): + world.Note ("---------- World Open ------------") + +# --------------------------------------------------------- +# Example showing running a script on world close +# --------------------------------------------------------- +def OnWorldClose (): + world.Note ("---------- World Close ------------") + +# --------------------------------------------------------- +# Example showing running a script on world connect +# --------------------------------------------------------- +def OnWorldConnect (): + world.Note ("---------- World Connect ------------") + +# --------------------------------------------------------- +# Example showing running a script on world disconnect +# --------------------------------------------------------- +def OnWorldDisconnect (): + world.Note ("---------- World Disconnect ------------") + +# --------------------------------------------------------- +# Example showing running a script on an alias +# +# This script is designed to be called by the alias below: +# +# +# +# +# +# +# +# (remove the leading #'s and paste into the alias configuration screen) +# +# It is for teleporting (going to) a room by number +# +# The room is entered by name and looked up in the variables +# list. +# --------------------------------------------------------- +def OnTeleport (thename, theoutput, wildcards): + sHelp = ""; + sDestination = wildcards [0] + + # remove leading spaces from destination + if len(sDestination) > 0: + while sDestination [0] == " ": + sDestination = sDestination [1:] + + # if nothing entered echo possible destinations + if len(sDestination) == 0: + world.note ("-------- TELEPORT destinations ----------") + roomlist = world.GetVariableList + + # find list of all variables + if roomlist : + # loop through each variable, and add to help if it starts with "teleport_" + for room in roomlist: + if room [:9] == "teleport_": + if len (sHelp) > 0: + sHelp += ", " + sHelp = sHelp + room [9:] + + # if no destinations found, tell them + if sHelp == "": + sHelp = "" + world.note (sHelp) + return + + + # get contents of the destination variable + + iRoom = world.GetVariable ("teleport_" + sDestination) + + # if not found, or invalid name, that isn't in the list + if not iRoom: + world.note ("******** Destination " + sDestination + " unknown *********") + return + + world.note ("------> Teleporting to " + sDestination) + world.send ("@teleport #" + iRoom) + + + +# --------------------------------------------------------- +# Example showing running a script on an alias +# +# This script is designed to be called by an alias: +# +# +# +# +# +# +# (remove the leading #'s and paste into the alias configuration screen) +# +# It is for adding a room to the list of rooms to teleport to (by +# the earlier script). +# +# eg. ADD_TELEPORT dungeon 1234 +# +# --------------------------------------------------------- +def OnAddTeleport (thename, theoutput, wildcards): + + # wildcard one is the destination + sDestination = wildcards [1] + + # remove leading spaces from destination + if len(sDestination) > 0: + while sDestination [0] == " ": + sDestination = sDestination [1:] + + # if nothing entered tell them command syntax + if len (sDestination) == 0: + world.note ("Syntax: add_teleport name dbref") + world.note (" eg. add_teleport LandingBay 4421") + return + + + # wildcard 2 is the room to go to + iRoom= wildcards [2] + + # add room and destination location to variable list + iStatus = world.SetVariable ("teleport_" + sDestination, int(iRoom)) + + if iStatus != 0: + world.note ("Room name must be alphabetic, you entered: " + sDestination) + return + + world.note ("Teleport location " + sDestination + "(#" + + iRoom + ") added to teleport list") + + + +# ------------------------------------------ +# Example showing a script called by a timer +# ------------------------------------------- +def OnTimer (strTimerName): + world.note ("Timer " + strTimerName + " has fired!") + + +# -------------------------------------------- +# Example showing a script called by a trigger +# Should be connected to a trigger matching on: <*hp *m *mv>* +# (the above example will work for SMAUG default prompts (eg. <100hp 10m 40mv>) +# it may need to be changed depending on the MUD prompt format). +# -------------------------------------------- +def OnStats (strTriggerName, trig_line, wildcards): + iHP = wildcards [0] + iMana = wildcards [1] + iMV = wildcards [2] + + world.Note ("Your HP are " + iHP) + world.Note ("Your Mana is " + iMana) + world.Note ("Your movement points are " + iMV) + + + +# -------------------------------------------- +# Subroutine to be called to repeat a command. +# +# Call from the alias: +# +# +# +# +# +# +# (remove the leading #'s and paste into the alias configuration screen) +# +# Example of use: #10 give sword to Trispis +# This would send "give sword to Trispis" 10 times +# -------------------------------------------- +def OnRepeat (strAliasName, strOutput, wildcards): + for i in range (int (wildcards [0])): + world.Send (wildcards [1]) + + +# -------------------------------------------- +# Example showing iterating through all worlds +# -------------------------------------------- + +def showworlds (): + worldlist = world.GetworldList + if (worldlist ): + for w in worldlist : world.Note (w) + + +# -------------------------------------------------- +# Example showing sending a message to another world +# -------------------------------------------------- + +def SendToWorld (name, message): + otherworld = world.getworld (name); + if otherworld: + otherworld.Send (message) + else: + world.note ("World " + name + " is not open") + return + + +# -------------------------------------------- +# Example trigger routine that just shows what was passed to it +# -------------------------------------------- + +def ExampleTrigger (thename, theoutput, wildcards): + world.note ("Trigger " + thename + " fired."); + world.note ("Matching line was: " + theoutput); + for i in range (10): + if wildcards [i]: + world.note ("Wildcard " + str(i) + " = " + wildcards [i]) + +world.note ("Scripting enabled - script file processed") + diff --git a/cosmic rage/scripts/exampscript.vbs b/cosmic rage/scripts/exampscript.vbs new file mode 100644 index 0000000..0867400 --- /dev/null +++ b/cosmic rage/scripts/exampscript.vbs @@ -0,0 +1,1094 @@ +' Example of coding script routines for MUSHclient in VBscript + +option explicit + +' ---------------------------------------------------------- +' Error codes returned by various functions +' ---------------------------------------------------------- + +const eOK = 0 ' No error +const eWorldOpen = 30001 ' The world is already open +const eWorldClosed = 30002 ' The world is closed, this action cannot be performed +const eNoNameSpecified = 30003 ' No name has been specified where one is required +const eCannotPlaySound = 30004 ' The sound file could not be played +const eTriggerNotFound = 30005 ' The specified trigger name does not exist +const eTriggerAlreadyExists = 30006 ' Attempt to add a trigger that already exists +const eTriggerCannotBeEmpty = 30007 ' The trigger "match" string cannot be empty +const eInvalidObjectLabel = 30008 ' The name of this object is invalid +const eScriptNameNotLocated = 30009 ' Script name is not in the script file +const eAliasNotFound = 30010 ' The specified alias name does not exist +const eAliasAlreadyExists = 30011 ' Attempt to add a alias that already exists +const eAliasCannotBeEmpty = 30012 ' The alias "match" string cannot be empty +const eCouldNotOpenFile = 30013 ' Unable to open requested file +const eLogFileNotOpen = 30014 ' Log file was not open +const eLogFileAlreadyOpen = 30015 ' Log file was already open +const eLogFileBadWrite = 30016 ' Bad write to log file +const eTimerNotFound = 30017 ' The specified timer name does not exist +const eTimerAlreadyExists = 30018 ' Attempt to add a timer that already exists +const eVariableNotFound = 30019 ' Attempt to delete a variable that does not exist +const eCommandNotEmpty = 30020 ' Attempt to use SetCommand with a non-empty command window +const eBadRegularExpression = 30021 ' Bad regular expression syntax +const eTimeInvalid = 30022 ' Time given to AddTimer is invalid +const eBadMapItem = 30023 ' Direction given to AddToMapper is invalid +const eNoMapItems = 30024 ' No items in mapper +const eUnknownOption = 30025 ' Option name not found +const eOptionOutOfRange = 30026 ' New value for option is out of range +const eTriggerSequenceOutOfRange = 30027 ' Trigger sequence value invalid +const eTriggerSendToInvalid = 30028 ' Where to send trigger text to is invalid +const eTriggerLabelNotSpecified = 30029 ' Trigger label not specified/invalid for 'send to variable' +const ePluginFileNotFound = 30030 ' File name specified for plugin not found +const eProblemsLoadingPlugin = 30031 ' There was a parsing or other problem loading the plugin +const ePluginCannotSetOption = 30032 ' Plugin is not allowed to set this option +const ePluginCannotGetOption = 30033 ' Plugin is not allowed to get this option +const eNoSuchPlugin = 30034 ' Requested plugin is not installed +const eNotAPlugin = 30035 ' Only a plugin can do this +const eNoSuchRoutine = 30036 ' Plugin does not support that subroutine (subroutine not in script) +const ePluginDoesNotSaveState = 30037 ' Plugin does not support saving state +const ePluginCouldNotSaveState = 30037 ' Plugin could not save state (eg. no state directory) +const ePluginDisabled = 30039 ' Plugin is currently disabled +const eErrorCallingPluginRoutine = 30040 ' Could not call plugin routine +const eCommandsNestedTooDeeply = 30041 ' Calls to "Execute" nested too deeply +const eCannotCreateChatSocket = 30042 ' Unable to create socket for chat connection +const eCannotLookupDomainName = 30043 ' Unable to do DNS (domain name) lookup for chat connection +const eNoChatConnections = 30044 ' No chat connections open +const eChatPersonNotFound = 30045 ' Requested chat person not connected +const eBadParameter = 30046 ' General problem with a parameter to a script call +const eChatAlreadyListening = 30047 ' Already listening for incoming chats +const eChatIDNotFound = 30048 ' Chat session with that ID not found +const eChatAlreadyConnected = 30049 ' Already connected to that server/port +const eClipboardEmpty = 30050 ' Cannot get (text from the) clipboard +const eFileNotFound = 30051 ' Cannot open the specified file +const eAlreadyTransferringFile = 30052 ' Already transferring a file +const eNotTransferringFile = 30053 ' Not transferring a file +const eNoSuchCommand = 30054 ' There is not a command of that name +const eArrayAlreadyExists = 30055 ' That array already exists +const eBadKeyName = 30056 ' That name is not permitted for a key +const eArrayDoesNotExist = 30056 ' That array does not exist +const eArrayNotEvenNumberOfValues = 30057 ' Values to be imported into array are not in pairs +const eImportedWithDuplicates = 30058 ' Import succeeded, however some values were overwritten +const eBadDelimiter = 30059 ' Import/export delimiter must be a single character, other than backslash +const eSetReplacingExistingValue = 30060 ' Array element set, existing value overwritten +const eKeyDoesNotExist = 30061 ' Array key does not exist +const eCannotImport = 30062 ' Cannot import because cannot find unused temporary character + + +' ---------------------------------------------------------- +' Flags for AddTrigger +' ---------------------------------------------------------- + +const eEnabled = 1 ' enable trigger +const eOmitFromLog = 2 ' omit from log file +const eOmitFromOutput = 4 ' omit trigger from output +const eKeepEvaluating = 8 ' keep evaluating +const eIgnoreCase = 16 ' ignore case when matching +const eTriggerRegularExpression = 32 ' trigger uses regular expression +const eExpandVariables = 512 ' expand variables like @direction +const eReplace = 1024 ' replace existing trigger of same name +const eTemporary = 16384 ' temporary - do not save to world file + +' ---------------------------------------------------------- +' Colours for AddTrigger +' ---------------------------------------------------------- + +const NOCHANGE = -1 +const custom1 = 0 +const custom2 = 1 +const custom3 = 2 +const custom4 = 3 +const custom5 = 4 +const custom6 = 5 +const custom7 = 6 +const custom8 = 7 +const custom9 = 8 +const custom10 = 9 +const custom11 = 10 +const custom12 = 11 +const custom13 = 12 +const custom14 = 13 +const custom15 = 14 +const custom16 = 15 + +' ---------------------------------------------------------- +' Flags for AddAlias +' ---------------------------------------------------------- + +' const eEnabled = 1 ' same as for AddTrigger +const eIgnoreAliasCase = 32 ' ignore case when matching +const eOmitFromLogFile = 64 ' omit this alias from the log file +const eAliasRegularExpression = 128 ' alias is regular expressions +' const eExpandVariables = 512 ' same as for AddTrigger +' const eReplace = 1024 ' same as for AddTrigger +const eAliasSpeedWalk = 2048 ' interpret send string as a speed walk string +const eAliasQueue = 4096 ' queue this alias for sending at the speedwalking delay interval +const eAliasMenu = 8192 ' this alias appears on the alias menu +' const eTemporary = 16384 ' same as for AddTrigger + +' ---------------------------------------------------------- +' Flags for AddTimer +' ---------------------------------------------------------- + +' const eEnabled = 1 ' same as for AddTrigger +const eAtTime = 2 ' if not set, time is "every" +const eOneShot = 4 ' if set, timer only fires once +const eTimerSpeedWalk = 8 ' timer does a speed walk when it fires +const eTimerNote = 16 ' timer does a world.note when it fires +const eActiveWhenClosed = 32 ' timer fires even when world is disconnected +' const eReplace = 1024 ' same as for AddTrigger +' const eTemporary = 16384 ' same as for AddTrigger + +' ---------------------------------------------------------- +' Example showing iterating through all triggers with labels +' ---------------------------------------------------------- +sub showtriggers + +dim mylist +dim i + +mylist = world.GetTriggerList + +if not IsEmpty (mylist) then + for i = lbound (mylist) to ubound (mylist) + world.note mylist (i) + next +End If + +end sub + +' ----------------------------------------------- +' Example showing iterating through all variables +' ------------------------------------------------ +sub showvariables + +dim mylist +dim i + +mylist = world.GetVariableList + +if not IsEmpty (mylist) then + for i = lbound (mylist) to ubound (mylist) + world.note mylist (i) & " = " & world.GetVariable (mylist (i)) + next +End If + +end sub + +' --------------------------------------------------------- +' Example showing iterating through all aliases with labels +' --------------------------------------------------------- +sub showaliases + +dim mylist +dim i + +mylist = world.GetAliasList + +if not IsEmpty (mylist) then + for i = lbound (mylist) to ubound (mylist) + world.note mylist (i) + next +End If + +end sub + +' --------------------------------------------------------- +' Example showing running a script on world open +' --------------------------------------------------------- +sub OnWorldOpen +world.note "---------- World Open ------------" +end sub + +' --------------------------------------------------------- +' Example showing running a script on world close +' --------------------------------------------------------- +sub OnWorldClose +world.note "---------- World Close ------------" +end sub + +' --------------------------------------------------------- +' Example showing running a script on world connect +' --------------------------------------------------------- +sub OnWorldConnect +world.note "---------- World Connect ------------" +end sub + +' --------------------------------------------------------- +' Example showing running a script on world disconnect +' --------------------------------------------------------- +sub OnWorldDisconnect +world.note "---------- World Disconnect ------------" +end sub + +' --------------------------------------------------------- +' Example showing running a script on an alias +' +' This script is designed to be called by an alias: ^teleport(.*)$ +' +' This alias should have "regular expression" checked. +' +' It is for teleporting (going to) a room by number +' +' The room is entered by name and looked up in the variables +' list. +' --------------------------------------------------------- +sub OnTeleport (thename, theoutput, thewildcards) + +dim sDestination +dim sRoomList +dim sHelp +dim iSubscript +dim iRoom + +sDestination = Trim (thewildcards (1)) + +' if nothing entered echo possible destinations +if sDestination = "" then + world.note "-------- TELEPORT destinations ----------" + + ' find list of all variables + sRoomList = world.GetVariableList + + if not IsEmpty (sRoomList) then + + ' loop through each variable, and add to help if it starts with "teleport_" + for iSubscript = lbound (sRoomList) to ubound (sRoomList) + if Left (sRoomList (iSubscript), 9) = "teleport_" then + if sHelp <> "" then + sHelp = sHelp & ", " + end if + sHelp = sHelp & Mid (sRoomList (iSubscript), 10) + end if ' variable starts with "teleport_" + next ' loop through sRoomList + + end if ' having at least one room + + ' if no destinations found, tell them + if sHelp = "" then + sHelp = "" + end if ' no destinations found in list + world.note sHelp + exit sub + +end if ' no destination supplied + +' get contents of the destination variable +iRoom = world.GetVariable ("teleport_" & lCase (sDestination)) + +' if not found, or invalid name, that isn't in the list +if IsEmpty (iRoom) or IsNull (iRoom) then + world.note "******** Destination " & sDestination & " unknown *********" + exit sub +end if + +world.note "------> Teleporting to " & sDestination +world.send "@teleport #" & cstr (iRoom) + +end sub + +' --------------------------------------------------------- +' Example showing running a script on an alias +' +' This script is designed to be called by an alias: ADD_TELEPORT * * +' +' This alias should NOT have "regular expression" checked. +' +' It is for adding a room to the list of rooms to teleport to (by +' the earlier script). +' +' eg. ADD_TELEPORT dungeon 1234 +' +' --------------------------------------------------------- +sub OnAddTeleport (thename, theoutput, thewildcards) + +dim sDestination +dim iRoom +dim iStatus +dim sCurrentLocation + +' wildcard one is the destination +sDestination = Trim (thewildcards (1)) + +' if nothing entered tell them command syntax +if sDestination = "" then + world.note "Syntax: add_teleport name dbref" + world.note " eg. add_teleport LandingBay 4421" + exit sub +end if + +' wildcard 2 is the room to go to +iRoom= Trim (thewildcards (2)) + +if not IsNumeric (iRoom) then + world.note "Room to teleport to must be a number, you entered: " & iRoom + exit sub +end if + +' add room and destination location to variable list +iStatus = world.SetVariable ("teleport_" & sDestination, iRoom) + +if iStatus <> 0 then + world.note "Room name must be alphabetic, you entered: " & sDestination + exit sub +end if + +world.note "Teleport location " & sDestination & "(#" _ + & iRoom & ") added to teleport list" + +end sub + + +' ------------------------------------------ +' Example showing a script called by a timer +' ------------------------------------------- +sub OnTimer (strTimerName) +world.note "Timer has fired!" +end sub + + +' -------------------------------------------- +' Example showing a script called by a trigger +' Should be connected to a trigger matching on: <*hp *m *mv>* +' (the above example will work for SMAUG default prompts (eg. <100hp 10m 40mv>) +' it may need to be changed depending on the MUD prompt format). +' -------------------------------------------- +sub OnStats (strTriggerName, trig_line, arrWildCards) + +dim iHP +dim iMana +dim iMV + +iHP = arrWildCards (1) +iMana = arrWildCards (2) +iMV = arrWildCards (3) + +world.Note "Your HP are " & iHP +world.Note "Your Mana is " & iMana +world.Note "Your movement points are " & iMV + +end sub + +' -------------------------------------------- +' Example showing an alias used to test lag +' Should be connected to an alias matching on: lag +' -------------------------------------------- +sub OnLagTest (strAliasName, strOutput, arrWildCards) + World.Send "@pem/silent me=PING: " & now() +end sub + +' -------------------------------------------- +' Example showing a trigger used as part of the lag test +' Should be connected to a trigger matching on: PING: * +' Set trigger to: Omit from log file, Omit from output +' -------------------------------------------- +Sub OnPing (strTriggerName, strOutput, arrWildCards) +Dim CurrentTime, PingTime, Elapsed + CurrentTime = Now () + PingTime = arrWildCards (1) + Elapsed = DateDiff ("s", PingTime, CurrentTime) + World.SetStatus "Lag: " & Elapsed & " seconds." +End Sub + +' --------------------------------------------------------- +' Example showing running a script on world connect +' This script turns logging on for this world. +' --------------------------------------------------------- +Sub OnWorldConnectWithLogging +Dim FileName + + FileName = Replace (World.Worldname, " ", "") ' Remove spaces from file name + +' Add other editing here if you have weird characters in your mud names. + + FileName = FileName & ".txt" + if World.OpenLog (FileName, True) = eOK then ' true means append to any existing log file + World.WriteLog "--- Log Opened " & Now () & " ---" ' make note in log file + World.Note "Opened log file" & FileName ' make note in world window + end if +End Sub + +' --------------------------------------------------------- +' Example showing running a script on world disconnect +' This script turns logging off for this world. +' --------------------------------------------------------- +Sub OnWorldDisconnectWithLogging + + if World.IsLogOpen then + World.Note "Closing log file" ' note in world window we are closing the log + World.WriteLog "--- Log Closed " & Now () & " ---" ' note in log file + World.CloseLog ' close log file + end if + +End Sub + +' -------------------------------------------- +' Subroutine to be called to repeat a command. +' +' Call from the alias: ^#([0-9]+) (.+)$ +' Regular Expression: checked +' +' Example of use: #10 give sword to Trispis +' This would send "give sword to Trispis" 10 times +' -------------------------------------------- +Sub OnRepeat (strAliasName, strOutput, arrWildCards) +Dim i + For i = 1 to arrWildCards (1) + World.Send arrWildCards (2) + next +End Sub + + +' -------------------------------------------- +' Subroutine to be called to gag a player +' +' Call from the alias: gag * +' Regular expression: no +' Label: lblGag +' Script: OnGag +' +' Example of use: gag twink +' +' This updates a trigger "lblGag" +' -------------------------------------------- +Sub OnGag (strAliasName, strOutput, arrWildCards) + +Dim trMatch +Dim trResponse +Dim trFlags +Dim trColour +Dim trWildcard +Dim trSoundfilename +Dim trScriptname +Dim iStatus + +' If trigger already exists, see who it matches on, then delete it +If world.IsTrigger ("lblGag") = eOK Then + world.GetTrigger "lblGag", trMatch, trResponse, trFlags, _ + trColour, trWildcard, trSoundfilename, trScriptname + world.DeleteTrigger "lblGag" + trMatch = trMatch & "|" ' Separate names by | ("or" symbol) +End If + +' Add new person to list of names to match on +trMatch = trMatch & LCase (Trim (arrWildCards (1))) ' add new name to list + +' Add our new trigger to trigger list +world.AddTrigger "lblGag", trMatch, "", _ + eEnabled + eOmitFromLog + eOmitFromOutput + eIgnoreCase + eTriggerRegularExpression, _ + NOCHANGE, 0, "", "" + +' Tell the user what we did +world.Note "Added " & arrWildcards (1) & " to list of gags" + +End Sub + +' -------------------------------------------- +' Example of copying a file in a subroutine +' +' This might be used on a "connect" to change your web page to indicate +' you are connected to a MUD, then use a similar one to copy a different +' file to indicate you are disconnected. +' -------------------------------------------- +Sub CopyFile +Const ForReading = 1 +Const ForWriting = 2 + + Dim fso, tf, contents + + Set fso = CreateObject("Scripting.FileSystemObject") + + Set tf = fso.OpenTextFile("c:\file_connected.htm", ForReading) + contents = tf.ReadAll + tf.Close + + Set tf = fso.OpenTextFile("c:\index.htm ", ForWriting, True) + tf.Write (contents) + tf.Close + +End Sub + +' -------------------------------------------- +' Example showing iterating through all worlds +' -------------------------------------------- +sub ShowWorlds + + dim mylist + dim i + + mylist = world.GetWorldList + + if not IsEmpty (mylist) then + for i = lbound (mylist) to ubound (mylist) + world.note mylist (i) + next + End If + +end sub + +' -------------------------------------------------- +' Example showing sending a message to another world +' -------------------------------------------------- + +sub SendToWorld (name, message) +dim otherworld + + set otherworld = world.getworld (name) + + if otherworld is nothing then + world.note "World " + name + " is not open" + exit sub + end if + + otherworld.send message + +end sub + +' -------------------------------------------- +' Subroutine to be called remember which way you walked. +' +' Call from the alias: keypad-* +' Send: %1 +' +' -------------------------------------------- +Sub OnKeypadDirection (strAliasName, strOutput, arrWildCards) + world.setvariable "direction", arrWildcards (1) +End Sub + +' -------------------------------------------- +' Trigger to count experience points. +' Match on: You are awarded * experience points for the battle. +' -------------------------------------------- + +dim gTotalExperience ' this is a global variable +gTotalExperience = 0 ' initialise it + +Sub OnExperience (strTriggerName, strOutput, arrWildCards) + gTotalExperience = gTotalExperience + arrWildCards (1) + World.SetStatus "Experience earned is now: " & CStr (gTotalExperience) +End Sub + +' -------------------------------------------- +' Subroutine to discard the speedwalk queue. +' +' Call from the alias: DISCARD +' +' -------------------------------------------- +Sub OnDiscardQueue (strAliasName, strOutput, arrWildCards) + world.discardqueue +End Sub + +' -------------------------------------------- +' Subroutine to replace one name with another (Name1 with Name2) +' +' Call from the trigger: +' +' Match on: Name1 +' Send: +' Regular Expression: checked +' Ignore case: checked +' Omit from output: checked +' Omit from log: checked +' Label: NameChange +' Script: OnNameChange +' +' -------------------------------------------- +sub OnNameChange (strTriggerName, trig_line, arrWildCards) +dim strChangedLine + + strChangedLine = world.Replace (trig_line, "Name1", "Name2", true) + strChangedLine = world.Replace (strChangedLine, "name1", "Name2", true) + world.note strChangedLine + world.writelog strChangedLine + +End Sub + +' -------------------------------------------- +' Alias to gag players automatically +' +' Call from the alias: GAG * +' +' eg. GAG twerp +' +' It maintains a list of gagged players in the +' variable "gaglist" (which you can edit in the +' world configuration screen if you need) +' +' You may need to change the text of the trigger +' match slightly. (eg. add "tells") +' +' -------------------------------------------- + +sub OnGag (thename, theoutput, thewildcards) +dim sName +dim sList +dim flags + +sName = Trim (thewildcards (1)) + +' do nothing if no name +if sName = "" then exit sub + +' get existing list +sList = world.GetVariable ("gaglist") + +' if empty create new one, otherwise add to end +if IsEmpty (sList) then + sList = sName +else + slist = sList + "|" + sName +end if + +' remember gag list for next time +world.SetVariable "gaglist", sList + +' addtrigger flags +' 1 = enabled +' 2 = omit from log file +' 4 = omit from output +' 16 = ignore case +' 32 = regular expression +' 1024 = replace existing trigger of same name + +flags = 1 + 2 + 4 + 16 + 32 + 1024 + +World.addtrigger "gag", "^(" + sList + ") (says|pages)", _ + "", flags, -1, 0, "", "" + +End Sub + +' -------------------------------------------- +' ShowOptions +' +' Lists options set in MUSHclient. +' +' Type: /ShowOptions +' +' To change an option do something like this: +' +' /world.setoption "max_output_lines", 2000 +' /world.setoption "mud_can_remove_underline", 1 +' +' -------------------------------------------- + +sub ShowOptions +dim mylist + dim i + + mylist = world.GetOptionList + + if not IsEmpty (mylist) then + for i = lbound (mylist) to ubound (mylist) + world.note mylist (i) + " = " + cstr (world.GetOption ( mylist (i))) + next + End If +End Sub + +' -------------------------------------------- +' MXP callbacks +' -------------------------------------------- + +' -------------------------------------------- +' MXP startup +' +' Called when MXP is activated. +' -------------------------------------------- + +sub OnMXPStartUp + world.note "MXP started up" +end sub + +' -------------------------------------------- +' MXP shutdown +' +' Called when MXP is deactivated. +' -------------------------------------------- + +sub OnMXPShutDown + world.note "MXP shut down" +end sub + + +' -------------------------------------------- +' Errors/warnings/information/messages +' +' Called by MXP when there is an error or warning etc. +' +' Level is: +' E - error +' W - warning +' I - information +' A - all other +' +' Number is the error number (see forum for details) +' +' Line is the line number in the output window +' +' Message is the text of the message +' +' Return true to suppress the message from appearing in +' the MXP debug window, false to allow it to appear. +' -------------------------------------------- + +function OnMXPError (level, number, line, message) + + ' display warnings and errors in the output window + if level = "W" or level = "E" then + world.NoteColourName "white", "red" + world.Note level + "(" + cstr (number) + ")[ " + cstr(line) + "]: " + message + end if + + ' suppress error number 20001 from the debug window + if number = 20001 then OnMXPError = true + +end function + +' -------------------------------------------- +' MXP start tag +' +' Called when a server-defined, or built-in tag is encountered +' (eg. ) +' +' Name is tag name (lowercase), eg. "font" +' +' Args is the argument list (eg. "fore=red back=blue") +' +' Mylist is the argument list, parsed into an array, eg. +' Array item 0 : fore=red +' Array item 1 : back=blue +' +' Unnamed arguments are preceded by an argument number. +' eg. would give: +' +' Array item 0 : 1=red +' Array item 1 : 2=blue +' +' +' Return true to suppress the tag from having an effect +' otherwise return false to allow it to act. +' -------------------------------------------- +function OnMXPStartTag (name, args, mylist) + + dim i + + world.AppendToNotepad "MXP", "Opening tag: " + name + vbCRLF + + if not IsEmpty (mylist) then + for i = lbound (mylist) to ubound (mylist) + world.AppendToNotepad "MXP", "Arg " + cstr (i) + " = " + mylist (i) + vbCRLF + next + End If + + ' ignore tag + if name = "rdesc" then OnMXPStartTag = true + +end function + +' -------------------------------------------- +' MXP set variable +' +' This is called when MXP sets a variable. +' +' Name - variable name (always preceded by "mxp_") +' Contents - what it is being set to. +' -------------------------------------------- +sub OnMXPvariable (name, contents) + world.note "Var " + name + " set to " + contents +end sub + +' -------------------------------------------- +' MXP end tag +' +' This is called when an MXP end tag is processed +' (eg. +' +' Name - tag name (lowercase) (eg. "color") +' Text - text between start and end tag +' eg. Go West +' When the is received Text will be "Go West" +' +' -------------------------------------------- +sub OnMXPEndTag (name, text) + world.AppendToNotepad "MXP", "Closing tag: " + name + vbCRLF +end sub + +' --------------------------------------------------------- +' +' See if memberName is in listName +' +' eg. if IsMember ("spell_list", "fiery blast") then +' ... do something ... +' +' +' --------------------------------------------------------- +Function IsMember (listName, memberName) +dim ListContents +dim theList +dim WantedMember +dim i + +' Default to not found +IsMember = False + +' Fix up member to remove surrounding spaces and make lower case +WantedMember = Trim (LCase (memberName)) + +' Can't find blank items +If WantedMember = "" Then + Exit Function +End If + +' Get list +ListContents = World.GetVariable (listName) + +' If no list, the member can't be in it +If IsEmpty (ListContents) or IsNull (ListContents) then + Exit Function +End If + +' Split list at commas +theList = split (ListContents, ",") + +' Loop through list, seeing if wanted member is in it +If Not IsEmpty (theList) then + For i = lbound (theList) to ubound (theList) + If theList (i) = WantedMember then + IsMember = True + Exit Function + End If ' end of found it + Next ' end of loop +End If ' end of any items in list + +End Function + +' --------------------------------------------------------- +' +' Add memberName to listName +' +' eg. AddItem "spell_list", "fiery blast" +' +' Note - it is up to you to test if the item is already +' in the list (using IsMember) or it will be added +' twice. +' +' +' --------------------------------------------------------- +Sub AddItem (listName, memberName) +dim ListContents +dim theList +dim NewMember +dim i + +' Get existing list +ListContents = World.GetVariable (listName) + +' Make sure new member is lower case with no spaces around it +NewMember = Trim (LCase (memberName)) + +' Don't add blank items +If NewMember = "" Then + Exit Sub +End If + +' Need comma after previous member, if any +If ListContents <> "" Then + ListContents = ListContents & "," +End If + +' Add new item +ListContents = ListContents & NewMember + +World.SetVariable listName, ListContents + +End Sub + +' --------------------------------------------------------- +' +' Delete memberName from listName +' +' eg. DeleteItem "spell_list", "fiery blast" +' +' +' --------------------------------------------------------- +Sub DeleteItem (listName, memberName) +dim ListContents +dim theList +dim WantedMember +dim i +dim NewContents + +' Fix up member to remove surrounding spaces and make lower case +WantedMember = Trim (LCase (memberName)) + +' Can't delete blank items +If WantedMember = "" Then + Exit Sub +End If + +' Get list +ListContents = World.GetVariable (listName) + +' If no list, the member can't be in it +If IsEmpty (ListContents) or IsNull (ListContents) then + Exit Sub +End If + +' Split list at commas +theList = split (ListContents, ",") + +' New contents are empty now +NewContents = "" + +' Loop through list, copying across all but delete item +If Not IsEmpty (theList) then + For i = lbound (theList) to ubound (theList) + If theList (i) <> WantedMember then + If NewContents <> "" Then + NewContents = NewContents & "," + End If + NewContents = NewContents & theList (i) + End If ' end of not deleted item + Next ' end of loop +End If ' end of any items in list + +' Store new list contents +World.SetVariable listName, NewContents + +End Sub + + +' --------------------------------------------------------- +' +' Delete the entire list called listName +' +' eg. DeleteList "spell_list" +' +' +' --------------------------------------------------------- +Sub DeleteList (listName) + +World.DeleteVariable listName + +End Sub + +' --------------------------------------------------------- +' Example of opening another world from an alias. +' +' Alias: openworld * +' Label: OpenWorld +' Script: OpenWorld +' --------------------------------------------------------- +Sub OpenWorld (thename, theoutput, thewildcards) +dim otherworld +dim filename + + filename = "worlds\" & thewildcards (1) & ".mcl" + set otherworld = world.open (filename) + + if otherworld is nothing then + world.note "Could not open world file " & filename + else + otherworld.activate + end if + +End Sub + +' --------------------------------------------------------- +' Example of toggling from one world to the next +' +' Alias: toggle +' Label: ToggleWorld +' Script: ToggleWorld +' --------------------------------------------------------- +Sub ToggleWorld (thename, theoutput, thewildcards) + dim mylist + dim i + dim thisworld + dim otherworld + + thisworld = 0 + + ' get list of worlds + mylist = world.GetWorldList + + ' find which world we are + If not IsEmpty (mylist) then + for i = lbound (mylist) to ubound (mylist) + If world.WorldName = mylist (i) then + thisworld = i + End If + next + End If + + ' find next world, wrap around at end of list + if thisworld = ubound (mylist) then + thisworld = 0 + else + thisworld = thisworld + 1 + End If + + ' get reference to next world + set otherworld = world.GetWorld (mylist (thisworld)) + + ' activate it + If not (otherworld is nothing) then + otherworld.activate + End If + +End Sub + +' --------------------------------------------------------- +' Example of going to another world +' +' Alias: world * +' Label: GoToWorld +' Script: GoToWorld +' --------------------------------------------------------- +Sub GoToWorld (thename, theoutput, thewildcards) + dim mylist + dim i + dim otherworld + + ' get list of worlds + mylist = world.GetWorldList + + i = cint (thewildcards (1)) + + if i < 0 or i > ubound (mylist) then + world.note "You do not have a world number " & i + exit sub + End If + + ' get reference to next world + set otherworld = world.GetWorld (mylist (i)) + + ' activate it + If not (otherworld is nothing) then + otherworld.activate + End If + +End Sub + +' --------------------------------------------------------- +' Alias to enable all triggers +' +' Alias: enable_triggers +' Label: EnableTriggers +' Script: EnableTriggers +' --------------------------------------------------------- + +Sub EnableTriggers (thename, theoutput, thewildcards) +world.setoption "enable_triggers", 1 +End Sub + +' --------------------------------------------------------- +' Alias to disable all triggers +' +' Alias: disable_triggers +' Label: DisableTriggers +' Script: DisableTriggers +' --------------------------------------------------------- + +Sub DisableTriggers (thename, theoutput, thewildcards) +world.setoption "enable_triggers", 0 +End Sub + +world.note "Scripting enabled - script file processed" + diff --git a/cosmic rage/socket/core.dll b/cosmic rage/socket/core.dll new file mode 100644 index 0000000..9cb49ee Binary files /dev/null and b/cosmic rage/socket/core.dll differ diff --git a/cosmic rage/socket/ftp.lua b/cosmic rage/socket/ftp.lua new file mode 100644 index 0000000..598f65d --- /dev/null +++ b/cosmic rage/socket/ftp.lua @@ -0,0 +1,281 @@ +----------------------------------------------------------------------------- +-- FTP support for the Lua language +-- LuaSocket toolkit. +-- Author: Diego Nehab +-- RCS ID: $Id: ftp.lua,v 1.45 2007/07/11 19:25:47 diego Exp $ +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Declare module and import dependencies +----------------------------------------------------------------------------- +local base = _G +local table = require("table") +local string = require("string") +local math = require("math") +local socket = require("socket") +local url = require("socket.url") +local tp = require("socket.tp") +local ltn12 = require("ltn12") +module("socket.ftp") + +----------------------------------------------------------------------------- +-- Program constants +----------------------------------------------------------------------------- +-- timeout in seconds before the program gives up on a connection +TIMEOUT = 60 +-- default port for ftp service +PORT = 21 +-- this is the default anonymous password. used when no password is +-- provided in url. should be changed to your e-mail. +USER = "ftp" +PASSWORD = "anonymous@anonymous.org" + +----------------------------------------------------------------------------- +-- Low level FTP API +----------------------------------------------------------------------------- +local metat = { __index = {} } + +function open(server, port, create) + local tp = socket.try(tp.connect(server, port or PORT, TIMEOUT, create)) + local f = base.setmetatable({ tp = tp }, metat) + -- make sure everything gets closed in an exception + f.try = socket.newtry(function() f:close() end) + return f +end + +function metat.__index:portconnect() + self.try(self.server:settimeout(TIMEOUT)) + self.data = self.try(self.server:accept()) + self.try(self.data:settimeout(TIMEOUT)) +end + +function metat.__index:pasvconnect() + self.data = self.try(socket.tcp()) + self.try(self.data:settimeout(TIMEOUT)) + self.try(self.data:connect(self.pasvt.ip, self.pasvt.port)) +end + +function metat.__index:login(user, password) + self.try(self.tp:command("user", user or USER)) + local code, reply = self.try(self.tp:check{"2..", 331}) + if code == 331 then + self.try(self.tp:command("pass", password or PASSWORD)) + self.try(self.tp:check("2..")) + end + return 1 +end + +function metat.__index:pasv() + self.try(self.tp:command("pasv")) + local code, reply = self.try(self.tp:check("2..")) + local pattern = "(%d+)%D(%d+)%D(%d+)%D(%d+)%D(%d+)%D(%d+)" + local a, b, c, d, p1, p2 = socket.skip(2, string.find(reply, pattern)) + self.try(a and b and c and d and p1 and p2, reply) + self.pasvt = { + ip = string.format("%d.%d.%d.%d", a, b, c, d), + port = p1*256 + p2 + } + if self.server then + self.server:close() + self.server = nil + end + return self.pasvt.ip, self.pasvt.port +end + +function metat.__index:port(ip, port) + self.pasvt = nil + if not ip then + ip, port = self.try(self.tp:getcontrol():getsockname()) + self.server = self.try(socket.bind(ip, 0)) + ip, port = self.try(self.server:getsockname()) + self.try(self.server:settimeout(TIMEOUT)) + end + local pl = math.mod(port, 256) + local ph = (port - pl)/256 + local arg = string.gsub(string.format("%s,%d,%d", ip, ph, pl), "%.", ",") + self.try(self.tp:command("port", arg)) + self.try(self.tp:check("2..")) + return 1 +end + +function metat.__index:send(sendt) + self.try(self.pasvt or self.server, "need port or pasv first") + -- if there is a pasvt table, we already sent a PASV command + -- we just get the data connection into self.data + if self.pasvt then self:pasvconnect() end + -- get the transfer argument and command + local argument = sendt.argument or + url.unescape(string.gsub(sendt.path or "", "^[/\\]", "")) + if argument == "" then argument = nil end + local command = sendt.command or "stor" + -- send the transfer command and check the reply + self.try(self.tp:command(command, argument)) + local code, reply = self.try(self.tp:check{"2..", "1.."}) + -- if there is not a a pasvt table, then there is a server + -- and we already sent a PORT command + if not self.pasvt then self:portconnect() end + -- get the sink, source and step for the transfer + local step = sendt.step or ltn12.pump.step + local readt = {self.tp.c} + local checkstep = function(src, snk) + -- check status in control connection while downloading + local readyt = socket.select(readt, nil, 0) + if readyt[tp] then code = self.try(self.tp:check("2..")) end + return step(src, snk) + end + local sink = socket.sink("close-when-done", self.data) + -- transfer all data and check error + self.try(ltn12.pump.all(sendt.source, sink, checkstep)) + if string.find(code, "1..") then self.try(self.tp:check("2..")) end + -- done with data connection + self.data:close() + -- find out how many bytes were sent + local sent = socket.skip(1, self.data:getstats()) + self.data = nil + return sent +end + +function metat.__index:receive(recvt) + self.try(self.pasvt or self.server, "need port or pasv first") + if self.pasvt then self:pasvconnect() end + local argument = recvt.argument or + url.unescape(string.gsub(recvt.path or "", "^[/\\]", "")) + if argument == "" then argument = nil end + local command = recvt.command or "retr" + self.try(self.tp:command(command, argument)) + local code = self.try(self.tp:check{"1..", "2.."}) + if not self.pasvt then self:portconnect() end + local source = socket.source("until-closed", self.data) + local step = recvt.step or ltn12.pump.step + self.try(ltn12.pump.all(source, recvt.sink, step)) + if string.find(code, "1..") then self.try(self.tp:check("2..")) end + self.data:close() + self.data = nil + return 1 +end + +function metat.__index:cwd(dir) + self.try(self.tp:command("cwd", dir)) + self.try(self.tp:check(250)) + return 1 +end + +function metat.__index:type(type) + self.try(self.tp:command("type", type)) + self.try(self.tp:check(200)) + return 1 +end + +function metat.__index:greet() + local code = self.try(self.tp:check{"1..", "2.."}) + if string.find(code, "1..") then self.try(self.tp:check("2..")) end + return 1 +end + +function metat.__index:quit() + self.try(self.tp:command("quit")) + self.try(self.tp:check("2..")) + return 1 +end + +function metat.__index:close() + if self.data then self.data:close() end + if self.server then self.server:close() end + return self.tp:close() +end + +----------------------------------------------------------------------------- +-- High level FTP API +----------------------------------------------------------------------------- +local function override(t) + if t.url then + local u = url.parse(t.url) + for i,v in base.pairs(t) do + u[i] = v + end + return u + else return t end +end + +local function tput(putt) + putt = override(putt) + socket.try(putt.host, "missing hostname") + local f = open(putt.host, putt.port, putt.create) + f:greet() + f:login(putt.user, putt.password) + if putt.type then f:type(putt.type) end + f:pasv() + local sent = f:send(putt) + f:quit() + f:close() + return sent +end + +local default = { + path = "/", + scheme = "ftp" +} + +local function parse(u) + local t = socket.try(url.parse(u, default)) + socket.try(t.scheme == "ftp", "wrong scheme '" .. t.scheme .. "'") + socket.try(t.host, "missing hostname") + local pat = "^type=(.)$" + if t.params then + t.type = socket.skip(2, string.find(t.params, pat)) + socket.try(t.type == "a" or t.type == "i", + "invalid type '" .. t.type .. "'") + end + return t +end + +local function sput(u, body) + local putt = parse(u) + putt.source = ltn12.source.string(body) + return tput(putt) +end + +put = socket.protect(function(putt, body) + if base.type(putt) == "string" then return sput(putt, body) + else return tput(putt) end +end) + +local function tget(gett) + gett = override(gett) + socket.try(gett.host, "missing hostname") + local f = open(gett.host, gett.port, gett.create) + f:greet() + f:login(gett.user, gett.password) + if gett.type then f:type(gett.type) end + f:pasv() + f:receive(gett) + f:quit() + return f:close() +end + +local function sget(u) + local gett = parse(u) + local t = {} + gett.sink = ltn12.sink.table(t) + tget(gett) + return table.concat(t) +end + +command = socket.protect(function(cmdt) + cmdt = override(cmdt) + socket.try(cmdt.host, "missing hostname") + socket.try(cmdt.command, "missing command") + local f = open(cmdt.host, cmdt.port, cmdt.create) + f:greet() + f:login(cmdt.user, cmdt.password) + f.try(f.tp:command(cmdt.command, cmdt.argument)) + if cmdt.check then f.try(f.tp:check(cmdt.check)) end + f:quit() + return f:close() +end) + +get = socket.protect(function(gett) + if base.type(gett) == "string" then return sget(gett) + else return tget(gett) end +end) + diff --git a/cosmic rage/socket/http.lua b/cosmic rage/socket/http.lua new file mode 100644 index 0000000..c020d8e --- /dev/null +++ b/cosmic rage/socket/http.lua @@ -0,0 +1,350 @@ +----------------------------------------------------------------------------- +-- HTTP/1.1 client support for the Lua language. +-- LuaSocket toolkit. +-- Author: Diego Nehab +-- RCS ID: $Id: http.lua,v 1.70 2007/03/12 04:08:40 diego Exp $ +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Declare module and import dependencies +------------------------------------------------------------------------------- +local socket = require("socket") +local url = require("socket.url") +local ltn12 = require("ltn12") +local mime = require("mime") +local string = require("string") +local base = _G +local table = require("table") +module("socket.http") + +----------------------------------------------------------------------------- +-- Program constants +----------------------------------------------------------------------------- +-- connection timeout in seconds +TIMEOUT = 60 +-- default port for document retrieval +PORT = 80 +-- user agent field sent in request +USERAGENT = socket._VERSION + +----------------------------------------------------------------------------- +-- Reads MIME headers from a connection, unfolding where needed +----------------------------------------------------------------------------- +local function receiveheaders(sock, headers) + local line, name, value, err + headers = headers or {} + -- get first line + line, err = sock:receive() + if err then return nil, err end + -- headers go until a blank line is found + while line ~= "" do + -- get field-name and value + name, value = socket.skip(2, string.find(line, "^(.-):%s*(.*)")) + if not (name and value) then return nil, "malformed reponse headers" end + name = string.lower(name) + -- get next line (value might be folded) + line, err = sock:receive() + if err then return nil, err end + -- unfold any folded values + while string.find(line, "^%s") do + value = value .. line + line = sock:receive() + if err then return nil, err end + end + -- save pair in table + if headers[name] then headers[name] = headers[name] .. ", " .. value + else headers[name] = value end + end + return headers +end + +----------------------------------------------------------------------------- +-- Extra sources and sinks +----------------------------------------------------------------------------- +socket.sourcet["http-chunked"] = function(sock, headers) + return base.setmetatable({ + getfd = function() return sock:getfd() end, + dirty = function() return sock:dirty() end + }, { + __call = function() + -- get chunk size, skip extention + local line, err = sock:receive() + if err then return nil, err end + local size = base.tonumber(string.gsub(line, ";.*", ""), 16) + if not size then return nil, "invalid chunk size" end + -- was it the last chunk? + if size > 0 then + -- if not, get chunk and skip terminating CRLF + local chunk, err, part = sock:receive(size) + if chunk then sock:receive() end + return chunk, err + else + -- if it was, read trailers into headers table + headers, err = receiveheaders(sock, headers) + if not headers then return nil, err end + end + end + }) +end + +socket.sinkt["http-chunked"] = function(sock) + return base.setmetatable({ + getfd = function() return sock:getfd() end, + dirty = function() return sock:dirty() end + }, { + __call = function(self, chunk, err) + if not chunk then return sock:send("0\r\n\r\n") end + local size = string.format("%X\r\n", string.len(chunk)) + return sock:send(size .. chunk .. "\r\n") + end + }) +end + +----------------------------------------------------------------------------- +-- Low level HTTP API +----------------------------------------------------------------------------- +local metat = { __index = {} } + +function open(host, port, create) + -- create socket with user connect function, or with default + local c = socket.try((create or socket.tcp)()) + local h = base.setmetatable({ c = c }, metat) + -- create finalized try + h.try = socket.newtry(function() h:close() end) + -- set timeout before connecting + h.try(c:settimeout(TIMEOUT)) + h.try(c:connect(host, port or PORT)) + -- here everything worked + return h +end + +function metat.__index:sendrequestline(method, uri) + local reqline = string.format("%s %s HTTP/1.1\r\n", method or "GET", uri) + return self.try(self.c:send(reqline)) +end + +function metat.__index:sendheaders(headers) + local h = "\r\n" + for i, v in base.pairs(headers) do + h = i .. ": " .. v .. "\r\n" .. h + end + self.try(self.c:send(h)) + return 1 +end + +function metat.__index:sendbody(headers, source, step) + source = source or ltn12.source.empty() + step = step or ltn12.pump.step + -- if we don't know the size in advance, send chunked and hope for the best + local mode = "http-chunked" + if headers["content-length"] then mode = "keep-open" end + return self.try(ltn12.pump.all(source, socket.sink(mode, self.c), step)) +end + +function metat.__index:receivestatusline() + local status = self.try(self.c:receive(5)) + -- identify HTTP/0.9 responses, which do not contain a status line + -- this is just a heuristic, but is what the RFC recommends + if status ~= "HTTP/" then return nil, status end + -- otherwise proceed reading a status line + status = self.try(self.c:receive("*l", status)) + local code = socket.skip(2, string.find(status, "HTTP/%d*%.%d* (%d%d%d)")) + return self.try(base.tonumber(code), status) +end + +function metat.__index:receiveheaders() + return self.try(receiveheaders(self.c)) +end + +function metat.__index:receivebody(headers, sink, step) + sink = sink or ltn12.sink.null() + step = step or ltn12.pump.step + local length = base.tonumber(headers["content-length"]) + local t = headers["transfer-encoding"] -- shortcut + local mode = "default" -- connection close + if t and t ~= "identity" then mode = "http-chunked" + elseif base.tonumber(headers["content-length"]) then mode = "by-length" end + return self.try(ltn12.pump.all(socket.source(mode, self.c, length), + sink, step)) +end + +function metat.__index:receive09body(status, sink, step) + local source = ltn12.source.rewind(socket.source("until-closed", self.c)) + source(status) + return self.try(ltn12.pump.all(source, sink, step)) +end + +function metat.__index:close() + return self.c:close() +end + +----------------------------------------------------------------------------- +-- High level HTTP API +----------------------------------------------------------------------------- +local function adjusturi(reqt) + local u = reqt + -- if there is a proxy, we need the full url. otherwise, just a part. + if not reqt.proxy and not PROXY then + u = { + path = socket.try(reqt.path, "invalid path 'nil'"), + params = reqt.params, + query = reqt.query, + fragment = reqt.fragment + } + end + return url.build(u) +end + +local function adjustproxy(reqt) + local proxy = reqt.proxy or PROXY + if proxy then + proxy = url.parse(proxy) + return proxy.host, proxy.port or 3128 + else + return reqt.host, reqt.port + end +end + +local function adjustheaders(reqt) + -- default headers + local lower = { + ["user-agent"] = USERAGENT, + ["host"] = reqt.host, + ["connection"] = "close, TE", + ["te"] = "trailers" + } + -- if we have authentication information, pass it along + if reqt.user and reqt.password then + lower["authorization"] = + "Basic " .. (mime.b64(reqt.user .. ":" .. reqt.password)) + end + -- override with user headers + for i,v in base.pairs(reqt.headers or lower) do + lower[string.lower(i)] = v + end + return lower +end + +-- default url parts +local default = { + host = "", + port = PORT, + path ="/", + scheme = "http" +} + +local function adjustrequest(reqt) + -- parse url if provided + local nreqt = reqt.url and url.parse(reqt.url, default) or {} + -- explicit components override url + for i,v in base.pairs(reqt) do nreqt[i] = v end + if nreqt.port == "" then nreqt.port = 80 end + socket.try(nreqt.host and nreqt.host ~= "", + "invalid host '" .. base.tostring(nreqt.host) .. "'") + -- compute uri if user hasn't overriden + nreqt.uri = reqt.uri or adjusturi(nreqt) + -- ajust host and port if there is a proxy + nreqt.host, nreqt.port = adjustproxy(nreqt) + -- adjust headers in request + nreqt.headers = adjustheaders(nreqt) + return nreqt +end + +local function shouldredirect(reqt, code, headers) + return headers.location and + string.gsub(headers.location, "%s", "") ~= "" and + (reqt.redirect ~= false) and + (code == 301 or code == 302) and + (not reqt.method or reqt.method == "GET" or reqt.method == "HEAD") + and (not reqt.nredirects or reqt.nredirects < 5) +end + +local function shouldreceivebody(reqt, code) + if reqt.method == "HEAD" then return nil end + if code == 204 or code == 304 then return nil end + if code >= 100 and code < 200 then return nil end + return 1 +end + +-- forward declarations +local trequest, tredirect + +function tredirect(reqt, location) + local result, code, headers, status = trequest { + -- the RFC says the redirect URL has to be absolute, but some + -- servers do not respect that + url = url.absolute(reqt.url, location), + source = reqt.source, + sink = reqt.sink, + headers = reqt.headers, + proxy = reqt.proxy, + nredirects = (reqt.nredirects or 0) + 1, + create = reqt.create + } + -- pass location header back as a hint we redirected + headers = headers or {} + headers.location = headers.location or location + return result, code, headers, status +end + +function trequest(reqt) + -- we loop until we get what we want, or + -- until we are sure there is no way to get it + local nreqt = adjustrequest(reqt) + local h = open(nreqt.host, nreqt.port, nreqt.create) + -- send request line and headers + h:sendrequestline(nreqt.method, nreqt.uri) + h:sendheaders(nreqt.headers) + -- if there is a body, send it + if nreqt.source then + h:sendbody(nreqt.headers, nreqt.source, nreqt.step) + end + local code, status = h:receivestatusline() + -- if it is an HTTP/0.9 server, simply get the body and we are done + if not code then + h:receive09body(status, nreqt.sink, nreqt.step) + return 1, 200 + end + local headers + -- ignore any 100-continue messages + while code == 100 do + headers = h:receiveheaders() + code, status = h:receivestatusline() + end + headers = h:receiveheaders() + -- at this point we should have a honest reply from the server + -- we can't redirect if we already used the source, so we report the error + if shouldredirect(nreqt, code, headers) and not nreqt.source then + h:close() + return tredirect(reqt, headers.location) + end + -- here we are finally done + if shouldreceivebody(nreqt, code) then + h:receivebody(headers, nreqt.sink, nreqt.step) + end + h:close() + return 1, code, headers, status +end + +local function srequest(u, b) + local t = {} + local reqt = { + url = u, + sink = ltn12.sink.table(t) + } + if b then + reqt.source = ltn12.source.string(b) + reqt.headers = { + ["content-length"] = string.len(b), + ["content-type"] = "application/x-www-form-urlencoded" + } + reqt.method = "POST" + end + local code, headers, status = socket.skip(1, trequest(reqt)) + return table.concat(t), code, headers, status +end + +request = socket.protect(function(reqt, body) + if base.type(reqt) == "string" then return srequest(reqt, body) + else return trequest(reqt) end +end) diff --git a/cosmic rage/socket/smtp.lua b/cosmic rage/socket/smtp.lua new file mode 100644 index 0000000..8f3cfcf --- /dev/null +++ b/cosmic rage/socket/smtp.lua @@ -0,0 +1,251 @@ +----------------------------------------------------------------------------- +-- SMTP client support for the Lua language. +-- LuaSocket toolkit. +-- Author: Diego Nehab +-- RCS ID: $Id: smtp.lua,v 1.46 2007/03/12 04:08:40 diego Exp $ +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Declare module and import dependencies +----------------------------------------------------------------------------- +local base = _G +local coroutine = require("coroutine") +local string = require("string") +local math = require("math") +local os = require("os") +local socket = require("socket") +local tp = require("socket.tp") +local ltn12 = require("ltn12") +local mime = require("mime") +module("socket.smtp") + +----------------------------------------------------------------------------- +-- Program constants +----------------------------------------------------------------------------- +-- timeout for connection +TIMEOUT = 60 +-- default server used to send e-mails +SERVER = "localhost" +-- default port +PORT = 25 +-- domain used in HELO command and default sendmail +-- If we are under a CGI, try to get from environment +DOMAIN = os.getenv("SERVER_NAME") or "localhost" +-- default time zone (means we don't know) +ZONE = "-0000" + +--------------------------------------------------------------------------- +-- Low level SMTP API +----------------------------------------------------------------------------- +local metat = { __index = {} } + +function metat.__index:greet(domain) + self.try(self.tp:check("2..")) + self.try(self.tp:command("EHLO", domain or DOMAIN)) + return socket.skip(1, self.try(self.tp:check("2.."))) +end + +function metat.__index:mail(from) + self.try(self.tp:command("MAIL", "FROM:" .. from)) + return self.try(self.tp:check("2..")) +end + +function metat.__index:rcpt(to) + self.try(self.tp:command("RCPT", "TO:" .. to)) + return self.try(self.tp:check("2..")) +end + +function metat.__index:data(src, step) + self.try(self.tp:command("DATA")) + self.try(self.tp:check("3..")) + self.try(self.tp:source(src, step)) + self.try(self.tp:send("\r\n.\r\n")) + return self.try(self.tp:check("2..")) +end + +function metat.__index:quit() + self.try(self.tp:command("QUIT")) + return self.try(self.tp:check("2..")) +end + +function metat.__index:close() + return self.tp:close() +end + +function metat.__index:login(user, password) + self.try(self.tp:command("AUTH", "LOGIN")) + self.try(self.tp:check("3..")) + self.try(self.tp:command(mime.b64(user))) + self.try(self.tp:check("3..")) + self.try(self.tp:command(mime.b64(password))) + return self.try(self.tp:check("2..")) +end + +function metat.__index:plain(user, password) + local auth = "PLAIN " .. mime.b64("\0" .. user .. "\0" .. password) + self.try(self.tp:command("AUTH", auth)) + return self.try(self.tp:check("2..")) +end + +function metat.__index:auth(user, password, ext) + if not user or not password then return 1 end + if string.find(ext, "AUTH[^\n]+LOGIN") then + return self:login(user, password) + elseif string.find(ext, "AUTH[^\n]+PLAIN") then + return self:plain(user, password) + else + self.try(nil, "authentication not supported") + end +end + +-- send message or throw an exception +function metat.__index:send(mailt) + self:mail(mailt.from) + if base.type(mailt.rcpt) == "table" then + for i,v in base.ipairs(mailt.rcpt) do + self:rcpt(v) + end + else + self:rcpt(mailt.rcpt) + end + self:data(ltn12.source.chain(mailt.source, mime.stuff()), mailt.step) +end + +function open(server, port, create) + local tp = socket.try(tp.connect(server or SERVER, port or PORT, + TIMEOUT, create)) + local s = base.setmetatable({tp = tp}, metat) + -- make sure tp is closed if we get an exception + s.try = socket.newtry(function() + s:close() + end) + return s +end + +-- convert headers to lowercase +local function lower_headers(headers) + local lower = {} + for i,v in base.pairs(headers or lower) do + lower[string.lower(i)] = v + end + return lower +end + +--------------------------------------------------------------------------- +-- Multipart message source +----------------------------------------------------------------------------- +-- returns a hopefully unique mime boundary +local seqno = 0 +local function newboundary() + seqno = seqno + 1 + return string.format('%s%05d==%05u', os.date('%d%m%Y%H%M%S'), + math.random(0, 99999), seqno) +end + +-- send_message forward declaration +local send_message + +-- yield the headers all at once, it's faster +local function send_headers(headers) + local h = "\r\n" + for i,v in base.pairs(headers) do + h = i .. ': ' .. v .. "\r\n" .. h + end + coroutine.yield(h) +end + +-- yield multipart message body from a multipart message table +local function send_multipart(mesgt) + -- make sure we have our boundary and send headers + local bd = newboundary() + local headers = lower_headers(mesgt.headers or {}) + headers['content-type'] = headers['content-type'] or 'multipart/mixed' + headers['content-type'] = headers['content-type'] .. + '; boundary="' .. bd .. '"' + send_headers(headers) + -- send preamble + if mesgt.body.preamble then + coroutine.yield(mesgt.body.preamble) + coroutine.yield("\r\n") + end + -- send each part separated by a boundary + for i, m in base.ipairs(mesgt.body) do + coroutine.yield("\r\n--" .. bd .. "\r\n") + send_message(m) + end + -- send last boundary + coroutine.yield("\r\n--" .. bd .. "--\r\n\r\n") + -- send epilogue + if mesgt.body.epilogue then + coroutine.yield(mesgt.body.epilogue) + coroutine.yield("\r\n") + end +end + +-- yield message body from a source +local function send_source(mesgt) + -- make sure we have a content-type + local headers = lower_headers(mesgt.headers or {}) + headers['content-type'] = headers['content-type'] or + 'text/plain; charset="iso-8859-1"' + send_headers(headers) + -- send body from source + while true do + local chunk, err = mesgt.body() + if err then coroutine.yield(nil, err) + elseif chunk then coroutine.yield(chunk) + else break end + end +end + +-- yield message body from a string +local function send_string(mesgt) + -- make sure we have a content-type + local headers = lower_headers(mesgt.headers or {}) + headers['content-type'] = headers['content-type'] or + 'text/plain; charset="iso-8859-1"' + send_headers(headers) + -- send body from string + coroutine.yield(mesgt.body) +end + +-- message source +function send_message(mesgt) + if base.type(mesgt.body) == "table" then send_multipart(mesgt) + elseif base.type(mesgt.body) == "function" then send_source(mesgt) + else send_string(mesgt) end +end + +-- set defaul headers +local function adjust_headers(mesgt) + local lower = lower_headers(mesgt.headers) + lower["date"] = lower["date"] or + os.date("!%a, %d %b %Y %H:%M:%S ") .. (mesgt.zone or ZONE) + lower["x-mailer"] = lower["x-mailer"] or socket._VERSION + -- this can't be overriden + lower["mime-version"] = "1.0" + return lower +end + +function message(mesgt) + mesgt.headers = adjust_headers(mesgt) + -- create and return message source + local co = coroutine.create(function() send_message(mesgt) end) + return function() + local ret, a, b = coroutine.resume(co) + if ret then return a, b + else return nil, a end + end +end + +--------------------------------------------------------------------------- +-- High level SMTP API +----------------------------------------------------------------------------- +send = socket.protect(function(mailt) + local s = open(mailt.server, mailt.port, mailt.create) + local ext = s:greet(mailt.domain) + s:auth(mailt.user, mailt.password, ext) + s:send(mailt) + s:quit() + return s:close() +end) diff --git a/cosmic rage/socket/tp.lua b/cosmic rage/socket/tp.lua new file mode 100644 index 0000000..0683869 --- /dev/null +++ b/cosmic rage/socket/tp.lua @@ -0,0 +1,123 @@ +----------------------------------------------------------------------------- +-- Unified SMTP/FTP subsystem +-- LuaSocket toolkit. +-- Author: Diego Nehab +-- RCS ID: $Id: tp.lua,v 1.22 2006/03/14 09:04:15 diego Exp $ +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Declare module and import dependencies +----------------------------------------------------------------------------- +local base = _G +local string = require("string") +local socket = require("socket") +local ltn12 = require("ltn12") +module("socket.tp") + +----------------------------------------------------------------------------- +-- Program constants +----------------------------------------------------------------------------- +TIMEOUT = 60 + +----------------------------------------------------------------------------- +-- Implementation +----------------------------------------------------------------------------- +-- gets server reply (works for SMTP and FTP) +local function get_reply(c) + local code, current, sep + local line, err = c:receive() + local reply = line + if err then return nil, err end + code, sep = socket.skip(2, string.find(line, "^(%d%d%d)(.?)")) + if not code then return nil, "invalid server reply" end + if sep == "-" then -- reply is multiline + repeat + line, err = c:receive() + if err then return nil, err end + current, sep = socket.skip(2, string.find(line, "^(%d%d%d)(.?)")) + reply = reply .. "\n" .. line + -- reply ends with same code + until code == current and sep == " " + end + return code, reply +end + +-- metatable for sock object +local metat = { __index = {} } + +function metat.__index:check(ok) + local code, reply = get_reply(self.c) + if not code then return nil, reply end + if base.type(ok) ~= "function" then + if base.type(ok) == "table" then + for i, v in base.ipairs(ok) do + if string.find(code, v) then + return base.tonumber(code), reply + end + end + return nil, reply + else + if string.find(code, ok) then return base.tonumber(code), reply + else return nil, reply end + end + else return ok(base.tonumber(code), reply) end +end + +function metat.__index:command(cmd, arg) + if arg then + return self.c:send(cmd .. " " .. arg.. "\r\n") + else + return self.c:send(cmd .. "\r\n") + end +end + +function metat.__index:sink(snk, pat) + local chunk, err = c:receive(pat) + return snk(chunk, err) +end + +function metat.__index:send(data) + return self.c:send(data) +end + +function metat.__index:receive(pat) + return self.c:receive(pat) +end + +function metat.__index:getfd() + return self.c:getfd() +end + +function metat.__index:dirty() + return self.c:dirty() +end + +function metat.__index:getcontrol() + return self.c +end + +function metat.__index:source(source, step) + local sink = socket.sink("keep-open", self.c) + local ret, err = ltn12.pump.all(source, sink, step or ltn12.pump.step) + return ret, err +end + +-- closes the underlying c +function metat.__index:close() + self.c:close() + return 1 +end + +-- connect with server and return c object +function connect(host, port, timeout, create) + local c, e = (create or socket.tcp)() + if not c then return nil, e end + c:settimeout(timeout or TIMEOUT) + local r, e = c:connect(host, port) + if not r then + c:close() + return nil, e + end + return base.setmetatable({c = c}, metat) +end + diff --git a/cosmic rage/socket/url.lua b/cosmic rage/socket/url.lua new file mode 100644 index 0000000..0e31d8a --- /dev/null +++ b/cosmic rage/socket/url.lua @@ -0,0 +1,297 @@ +----------------------------------------------------------------------------- +-- URI parsing, composition and relative URL resolution +-- LuaSocket toolkit. +-- Author: Diego Nehab +-- RCS ID: $Id: url.lua,v 1.38 2006/04/03 04:45:42 diego Exp $ +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Declare module +----------------------------------------------------------------------------- +local string = require("string") +local base = _G +local table = require("table") +module("socket.url") + +----------------------------------------------------------------------------- +-- Module version +----------------------------------------------------------------------------- +_VERSION = "URL 1.0.1" + +----------------------------------------------------------------------------- +-- Encodes a string into its escaped hexadecimal representation +-- Input +-- s: binary string to be encoded +-- Returns +-- escaped representation of string binary +----------------------------------------------------------------------------- +function escape(s) + return string.gsub(s, "([^A-Za-z0-9_])", function(c) + return string.format("%%%02x", string.byte(c)) + end) +end + +----------------------------------------------------------------------------- +-- Protects a path segment, to prevent it from interfering with the +-- url parsing. +-- Input +-- s: binary string to be encoded +-- Returns +-- escaped representation of string binary +----------------------------------------------------------------------------- +local function make_set(t) + local s = {} + for i,v in base.ipairs(t) do + s[t[i]] = 1 + end + return s +end + +-- these are allowed withing a path segment, along with alphanum +-- other characters must be escaped +local segment_set = make_set { + "-", "_", ".", "!", "~", "*", "'", "(", + ")", ":", "@", "&", "=", "+", "$", ",", +} + +local function protect_segment(s) + return string.gsub(s, "([^A-Za-z0-9_])", function (c) + if segment_set[c] then return c + else return string.format("%%%02x", string.byte(c)) end + end) +end + +----------------------------------------------------------------------------- +-- Encodes a string into its escaped hexadecimal representation +-- Input +-- s: binary string to be encoded +-- Returns +-- escaped representation of string binary +----------------------------------------------------------------------------- +function unescape(s) + return string.gsub(s, "%%(%x%x)", function(hex) + return string.char(base.tonumber(hex, 16)) + end) +end + +----------------------------------------------------------------------------- +-- Builds a path from a base path and a relative path +-- Input +-- base_path +-- relative_path +-- Returns +-- corresponding absolute path +----------------------------------------------------------------------------- +local function absolute_path(base_path, relative_path) + if string.sub(relative_path, 1, 1) == "/" then return relative_path end + local path = string.gsub(base_path, "[^/]*$", "") + path = path .. relative_path + path = string.gsub(path, "([^/]*%./)", function (s) + if s ~= "./" then return s else return "" end + end) + path = string.gsub(path, "/%.$", "/") + local reduced + while reduced ~= path do + reduced = path + path = string.gsub(reduced, "([^/]*/%.%./)", function (s) + if s ~= "../../" then return "" else return s end + end) + end + path = string.gsub(reduced, "([^/]*/%.%.)$", function (s) + if s ~= "../.." then return "" else return s end + end) + return path +end + +----------------------------------------------------------------------------- +-- Parses a url and returns a table with all its parts according to RFC 2396 +-- The following grammar describes the names given to the URL parts +-- ::= :///;?# +-- ::= @: +-- ::= [:] +-- :: = {/} +-- Input +-- url: uniform resource locator of request +-- default: table with default values for each field +-- Returns +-- table with the following fields, where RFC naming conventions have +-- been preserved: +-- scheme, authority, userinfo, user, password, host, port, +-- path, params, query, fragment +-- Obs: +-- the leading '/' in {/} is considered part of +----------------------------------------------------------------------------- +function parse(url, default) + -- initialize default parameters + local parsed = {} + for i,v in base.pairs(default or parsed) do parsed[i] = v end + -- empty url is parsed to nil + if not url or url == "" then return nil, "invalid url" end + -- remove whitespace + -- url = string.gsub(url, "%s", "") + -- get fragment + url = string.gsub(url, "#(.*)$", function(f) + parsed.fragment = f + return "" + end) + -- get scheme + url = string.gsub(url, "^([%w][%w%+%-%.]*)%:", + function(s) parsed.scheme = s; return "" end) + -- get authority + url = string.gsub(url, "^//([^/]*)", function(n) + parsed.authority = n + return "" + end) + -- get query stringing + url = string.gsub(url, "%?(.*)", function(q) + parsed.query = q + return "" + end) + -- get params + url = string.gsub(url, "%;(.*)", function(p) + parsed.params = p + return "" + end) + -- path is whatever was left + if url ~= "" then parsed.path = url end + local authority = parsed.authority + if not authority then return parsed end + authority = string.gsub(authority,"^([^@]*)@", + function(u) parsed.userinfo = u; return "" end) + authority = string.gsub(authority, ":([^:]*)$", + function(p) parsed.port = p; return "" end) + if authority ~= "" then parsed.host = authority end + local userinfo = parsed.userinfo + if not userinfo then return parsed end + userinfo = string.gsub(userinfo, ":([^:]*)$", + function(p) parsed.password = p; return "" end) + parsed.user = userinfo + return parsed +end + +----------------------------------------------------------------------------- +-- Rebuilds a parsed URL from its components. +-- Components are protected if any reserved or unallowed characters are found +-- Input +-- parsed: parsed URL, as returned by parse +-- Returns +-- a stringing with the corresponding URL +----------------------------------------------------------------------------- +function build(parsed) + local ppath = parse_path(parsed.path or "") + local url = build_path(ppath) + if parsed.params then url = url .. ";" .. parsed.params end + if parsed.query then url = url .. "?" .. parsed.query end + local authority = parsed.authority + if parsed.host then + authority = parsed.host + if parsed.port then authority = authority .. ":" .. parsed.port end + local userinfo = parsed.userinfo + if parsed.user then + userinfo = parsed.user + if parsed.password then + userinfo = userinfo .. ":" .. parsed.password + end + end + if userinfo then authority = userinfo .. "@" .. authority end + end + if authority then url = "//" .. authority .. url end + if parsed.scheme then url = parsed.scheme .. ":" .. url end + if parsed.fragment then url = url .. "#" .. parsed.fragment end + -- url = string.gsub(url, "%s", "") + return url +end + +----------------------------------------------------------------------------- +-- Builds a absolute URL from a base and a relative URL according to RFC 2396 +-- Input +-- base_url +-- relative_url +-- Returns +-- corresponding absolute url +----------------------------------------------------------------------------- +function absolute(base_url, relative_url) + if base.type(base_url) == "table" then + base_parsed = base_url + base_url = build(base_parsed) + else + base_parsed = parse(base_url) + end + local relative_parsed = parse(relative_url) + if not base_parsed then return relative_url + elseif not relative_parsed then return base_url + elseif relative_parsed.scheme then return relative_url + else + relative_parsed.scheme = base_parsed.scheme + if not relative_parsed.authority then + relative_parsed.authority = base_parsed.authority + if not relative_parsed.path then + relative_parsed.path = base_parsed.path + if not relative_parsed.params then + relative_parsed.params = base_parsed.params + if not relative_parsed.query then + relative_parsed.query = base_parsed.query + end + end + else + relative_parsed.path = absolute_path(base_parsed.path or "", + relative_parsed.path) + end + end + return build(relative_parsed) + end +end + +----------------------------------------------------------------------------- +-- Breaks a path into its segments, unescaping the segments +-- Input +-- path +-- Returns +-- segment: a table with one entry per segment +----------------------------------------------------------------------------- +function parse_path(path) + local parsed = {} + path = path or "" + --path = string.gsub(path, "%s", "") + string.gsub(path, "([^/]+)", function (s) table.insert(parsed, s) end) + for i = 1, table.getn(parsed) do + parsed[i] = unescape(parsed[i]) + end + if string.sub(path, 1, 1) == "/" then parsed.is_absolute = 1 end + if string.sub(path, -1, -1) == "/" then parsed.is_directory = 1 end + return parsed +end + +----------------------------------------------------------------------------- +-- Builds a path component from its segments, escaping protected characters. +-- Input +-- parsed: path segments +-- unsafe: if true, segments are not protected before path is built +-- Returns +-- path: corresponding path stringing +----------------------------------------------------------------------------- +function build_path(parsed, unsafe) + local path = "" + local n = table.getn(parsed) + if unsafe then + for i = 1, n-1 do + path = path .. parsed[i] + path = path .. "/" + end + if n > 0 then + path = path .. parsed[n] + if parsed.is_directory then path = path .. "/" end + end + else + for i = 1, n-1 do + path = path .. protect_segment(parsed[i]) + path = path .. "/" + end + if n > 0 then + path = path .. protect_segment(parsed[n]) + if parsed.is_directory then path = path .. "/" end + end + end + if parsed.is_absolute then path = "/" .. path end + return path +end diff --git a/cosmic rage/spell/american-words.10 b/cosmic rage/spell/american-words.10 new file mode 100644 index 0000000..f086ee0 --- /dev/null +++ b/cosmic rage/spell/american-words.10 @@ -0,0 +1,56 @@ +afterward +apologize +behavior +behavior's +catalog +catalog's +center +center's +check +checks +color +color's +colors +defense +defense's +favor +favor's +favorite +fices +flavor +flavor's +gray +judgment +labeled +labeling +labor +labor's +learned +organization +organization's +organize +organized +organizes +organizing +practice +practice's +program +program's +programed +programing +programmed +programming +programs +realize +realized +realizes +realizing +recognize +recognized +recognizes +recognizing +rumor +rumor's +spelled +story +story's diff --git a/cosmic rage/spell/american-words.20 b/cosmic rage/spell/american-words.20 new file mode 100644 index 0000000..6e0a21c --- /dev/null +++ b/cosmic rage/spell/american-words.20 @@ -0,0 +1,207 @@ +adapter +adapter's +aging +analyze +analyzed +analyzes +analyzing +apologized +apologizes +apologizing +appall +appalls +ass +ass's +authorization +authorization's +authorize +authorized +authorizes +authorizing +ax +ax's +canceled +canceling +catalogs +centered +centering +centers +check's +checker +checker's +civilization +civilization's +civilize +civilized +civilizes +civilizing +colored +coloring +computerize +computerized +computerizes +computerizing +counseled +counseling +cozy +criticize +criticized +criticizes +criticizing +defensive +dependent +dependent's +dialed +dialing +dialings +dialog +dialog's +draft +draft's +drafted +drafting +drafts +dreamed +emphasize +emphasized +emphasizes +emphasizing +endeavor +favorable +favored +favoring +favorites +favors +fiber +fiber's +fibers +finalize +finalized +finalizes +finalizing +formulas +fulfill +fulfills +generalization +generalization's +generalizations +generalize +generalized +generalizes +generalizing +honor +honor's +honored +honoring +honors +humor +humor's +initialization +initialize +initialized +initializes +initializing +inquire +inquired +inquires +inquiries +inquiring +inquiry +inquiry's +judgment's +judgments +license +license's +licensed +licenses +licensing +liter +liter's +marvelous +maximize +meter +meter's +meters +minimize +modeled +modeling +modelings +mold +mold's +neighbor +neighbor's +neighborhood +neighborhood's +neighbors +offense +offense's +offenses +offensive +optimization +optimize +optimized +optimizes +optimizing +organizations +organizer +organizers +patronize +patronized +patronizes +patronizing +practiced +practices +practicing +privatization +prize +prize's +prizes +publicize +publicized +publicizes +publicizing +queuing +realization +realization's +recognizable +rumored +rumoring +rumors +signaled +signaling +skeptical +specialize +specialized +specializes +specializing +specialty +specialty's +spoiled +standardize +standardized +standardizes +standardizing +stories +subsidize +subsidized +subsidizes +subsidizing +summarize +summarized +summarizes +summarizing +sympathize +synthesizer +synthesizer's +theater +theater's +tire +tired +tires +tiring +traveled +traveling +travelings +unauthorized +whiskey +whiskey's diff --git a/cosmic rage/spell/english-contractions.10 b/cosmic rage/spell/english-contractions.10 new file mode 100644 index 0000000..55282e3 --- /dev/null +++ b/cosmic rage/spell/english-contractions.10 @@ -0,0 +1,13 @@ +aren't +can't +couldn't +didn't +doesn't +don't +haven't +isn't +they're +wasn't +won't +wouldn't +you're diff --git a/cosmic rage/spell/english-contractions.35 b/cosmic rage/spell/english-contractions.35 new file mode 100644 index 0000000..9249481 --- /dev/null +++ b/cosmic rage/spell/english-contractions.35 @@ -0,0 +1,5 @@ +I'm +ain't +ma'am +o'clock +we're diff --git a/cosmic rage/spell/english-upper.10 b/cosmic rage/spell/english-upper.10 new file mode 100644 index 0000000..e16d8df --- /dev/null +++ b/cosmic rage/spell/english-upper.10 @@ -0,0 +1,26 @@ +American +Brown +Brown's +Christian +Christian's +Congress +Congress's +Doctor +England +England's +English +English's +Europe +Europe's +French +French's +God +God's +I +John +John's +Mister +Mister's +Mr +Mr's +Mrs diff --git a/cosmic rage/spell/english-upper.35 b/cosmic rage/spell/english-upper.35 new file mode 100644 index 0000000..3dfe7f1 --- /dev/null +++ b/cosmic rage/spell/english-upper.35 @@ -0,0 +1,212 @@ +African +Africans +Allah +Allah's +Americanism +Americanism's +Americanisms +Americans +April +April's +Aprils +Asian +Asians +August +August's +Augusts +B +B's +British +Britisher +C +C's +Catholic +Catholicism +Catholicism's +Catholicisms +Catholics +Celsius +Celsiuses +Chicano +Chicano's +Chicanos +Christianities +Christianity +Christianity's +Christians +Christmas +Christmas's +Christmases +Cs +D +D's +December +December's +Decembers +Dutch +Dutch's +E +E's +Easter +Easter's +Easters +Englished +Englishes +Englishing +Es +Eskimo +Eskimo's +Eskimos +European +Europeans +F +F's +Fahrenheit +Fahrenheits +Februaries +February +February's +Friday +Friday's +Fridays +G +G's +Greek +Greek's +Greeks +H +H's +Halloween +Halloween's +Halloweens +Hebrew +Hebrew's +Hebrews +Hispanic +Hispanics +I'm +Indian +Indian's +Indians +Islam +Islam's +Islamic +Islamics +Islams +Januaries +January +January's +Jew +Jew's +Jewish +Jews +Judaism +Judaism's +Judaisms +Julies +July +July's +June +June's +Junes +K +K's +Koran +Koran's +Korans +Latin +Latin's +Latins +March +March's +Marches +Marxism +Marxism's +Marxisms +Marxist +Marxist's +Marxists +May +May's +Mays +Monday +Monday's +Mondays +Moslem's +Ms +Muslim +Muslim's +Muslims +N +N's +Nazi +Nazi's +Nazis +Negro +Negro's +Negroes +November +November's +Novembers +O +OK +OKs +October +October's +Octobers +Os +P +P's +Passover +Passover's +Passovers +Protestant +Protestant's +Protestants +S +S's +Sabbath +Sabbath's +Sabbaths +Satan +Satan's +Saturday +Saturday's +Saturdays +Scotch +Scotches +September +September's +Septembers +Sunday +Sunday's +Sundays +T +T's +Taurus +Taurus's +Tauruses +Thursday +Thursday's +Thursdays +Tuesday +Tuesday's +Tuesdays +U +V +V's +W +W's +Wednesday +Wednesday's +Wednesdays +Xmas +Xmas's +Xmases +Y +Y's +Yankee +Yankee's +Yankees +Yiddish +Yiddish's diff --git a/cosmic rage/spell/english-upper.40 b/cosmic rage/spell/english-upper.40 new file mode 100644 index 0000000..89403e0 --- /dev/null +++ b/cosmic rage/spell/english-upper.40 @@ -0,0 +1,532 @@ +A +A's +Advent +Advent's +Advents +Africa +Africa's +America +America's +Americana +Americana's +Anglican +Anglicans +Anglo +Anglo's +Anglos +Antarctic +Antarctic's +Antarctica +Antarctica's +Apr +Apr's +Aquarius +Aquarius's +Aquariuses +Arab +Arab's +Arabic +Arabic's +Arabs +Arctic +Arctic's +Aries +Arieses +As +Asia +Asia's +AstroTurf +AstroTurfs +Atlantic +Atlantic's +Aug +Aug's +Australia +Australia's +Australian +Australian's +Australians +Ave +Ave's +Aves +Baptist +Baptist's +Baptists +Bible +Bible's +Bibles +Black's +Blvd +Braille +Braille's +Brailled +Brailles +Brailling +Britain +Britain's +Brownie +Brownie's +Brownies +Buddha +Buddha's +Buddhas +Buddhism +Buddhism's +Buddhisms +Buddhist +Buddhist's +Buddhists +Canadian +Canadians +Cancer +Cancer's +Cancers +Cantonese +Cantonese's +Capitol +Capitol's +Capitols +Capricorn +Capricorn's +Capricorns +Caribbean +Caribbeans +Caucasian +Caucasians +Chinatown +Chinatown's +Chinatowns +Chinese +Christ +Christ's +Christs +Ci +Co +Co's +Coke +Coke's +Cokes +Communion +Communion's +Communions +Confederacy +Confederacy's +Confederate +Confederates +Congresses +Constitution +Cyrillic +Dalmatian +Dalmatian's +Dalmatians +Danish +Dec +Dec's +Democrat +Democrat's +Democratic +Democrats +Dixie +Dixie's +Dr +Dr's +Dumpster +Dumpsters +Emmies +Emmy +Emmy's +Episcopalian +Episcopalians +Father +Father's +Fathers +Feb +Feb's +Fed +Fed's +Feds +Frenched +Frenches +Frenching +Freudian +Freudians +Fri +Fri's +Frisbee +Frisbee's +Frisbees +Gemini +Gemini's +Geminis +Gen +Gen's +German +German's +Germans +Gospel +Gospel's +Gospels +Grammies +Grammy +Hanukkah +Hanukkah's +Hanukkahs +Highness +Highness's +Hindu +Hindu's +Hinduism +Hinduism's +Hinduisms +Hindus +Hollywood +Hollywood's +Holocaust +House +House's +I'd +I'll +I've +Inc +Inc's +Internet +Inuit +Inuit's +Inuits +Irish +Italian +Italian's +Italians +J +J's +Jacuzzi +Jacuzzis +Jan +Jan's +Japanese +Japaneses +Jeep +Jeeps +Jesus +Jr +Jr's +Jul +Jul's +Jun +Jun's +Junior +Juniors +Jupiter +Jupiter's +Kleenex +Kleenex's +Kleenexes +Korean +Koreans +Kwanzaa +Kwanzaas +L +L's +Latina +Latina's +Latinas +Latino +Latinos +Laundromat +Laundromat's +Laundromats +Lent +Lent's +Lents +Leo +Leo's +Leos +Libra +Libra's +Libras +Ln +Lord +Lord's +Lords +Lutheran +Lutheran's +Lutherans +M +M's +Mace +Mace's +Maced +Maces +Macing +Mafia +Mafia's +Mafias +Mandarin +Maori +Maori's +Maoris +Mar +Mar's +Marine +Marines +Mars +Martian +Martians +Mason +Mason's +Masons +Mass +Masses +McCoy +McCoy's +McCoys +Mecca +Mecca's +Meccas +Medicaid +Medicaid's +Medicaids +Medicare +Medicare's +Medicares +Mediterranean +Mediterranean's +Mediterraneans +Mercuries +Mercury +Mercury's +Messiah +Messiah's +Messiahs +Messrs +Messrs's +Methodist +Methodist's +Methodists +Mexican +Mexicans +Midwest +Midwest's +Midwestern +Miss +Miss's +Misses +Mon +Mon's +Mons +Mormon +Mormon's +Mormons +Mount +Mount's +Mt +Mt's +Muhammad +Muhammad's +Muzak +Muzak's +Muzaks +Neptune +Neptune's +Nov +Nov's +Oct +Oct's +Olympic +Olympics +Orient +Orient's +Oriental +Orientals +Orients +Oscar +Oscar's +Oscars +Pacific +Pacific's +Pentagon +Pentagon's +Pharaoh +Pharaoh's +Pharaohs +Pilgrim +Pilgrims +Pisces +Pisces's +Pkwy +Pl +Plexiglas +Plexiglas's +Plexiglases +Pluto +Pluto's +Polaroid +Polaroid's +Polaroids +Pole +Pole's +Poles +Polish +Pope +Pope's +Popes +Popsicle +Popsicle's +Popsicles +Portuguese +Portuguese's +Presbyterian +Presbyterians +Prof +Prohibition +Prohibition's +Prohibitions +Puritan +Puritan's +Puritans +Pyrex +Pyrex's +Pyrexes +Q +Q's +R +R's +Ramadan +Ramadan's +Ramadans +Rd +Rd's +Realtor +Realtors +Renaissance +Renaissance's +Renaissances +Rep +Rep's +Representative +Representatives +Republican +Republicans +Resurrection +Resurrection's +Resurrections +Rev +Rev's +Reverend +Rollerblade +Rollerblades +Roman +Romans +Rte +Russian +Russian's +Russians +Sagittarius +Sagittarius's +Sagittariuses +Santa +Santa's +Sat +Sat's +Saturn +Saturn's +Savior +Savior's +Scandinavia +Scandinavia's +Scandinavian +Scandinavians +Scorpio +Scorpio's +Scorpios +Scottish +Scripture +Scripture's +Scriptures +Sec +Secretaries +Secretary +Sen +Senate +Senate's +Senates +Senior +Seniors +Sept +Sept's +Sgt +Sikh +Sikh's +Sikhism +Sikhism's +Sikhisms +Sikhs +Soviet +Soviets +Spanish +Spanish's +Spartan +Spartans +Sq +Sq's +Sr +St +St's +Styrofoam +Styrofoams +Sun +Swiss +Swisses +Taiwanese +Talmud +Talmud's +Talmuds +Teflon +Teflon's +Teflons +Thanksgiving +Thanksgivings +Thermos +Thermos's +Thermoses +Thurs +Trinities +Trinity +Trinity's +Tues +Tylenol +Uranus +Uranus's +Velcro +Velcro's +Velcros +Venus +Venuses +Virgo +Virgo's +Virgos +Walkman +Walkmans +Wed +Wed's +Welsh +Western +Westerner +Westerners +Westerns +White +White's +Whites +X +X's +Xerox +Xerox's +Xeroxed +Xeroxes +Xeroxing +Yank +Yank's +Yanks +Yuletide +Yuletides +Z diff --git a/cosmic rage/spell/english-words.10 b/cosmic rage/spell/english-words.10 new file mode 100644 index 0000000..1763505 --- /dev/null +++ b/cosmic rage/spell/english-words.10 @@ -0,0 +1,4946 @@ +a +abilities +ability +ability's +able +about +above +absence +absence's +absolute +absolutely +abuse +academic +accept +acceptable +accepted +accepting +accepts +access +access's +accessible +accident +accident's +accidental +accidentally +accord +accorded +according +accordingly +accords +account +account's +accounts +accuracy +accuracy's +accurate +achieve +achieved +achieves +achieving +acquire +acquired +acquires +acquiring +across +act +act's +acted +acting +action +action's +actions +active +activities +activity +activity's +acts +actual +actually +add +added +adding +addition +addition's +additional +address +address's +addressed +addresses +addressing +adds +adequate +adjust +administration +administration's +admit +admits +admitted +admittedly +admitting +adopt +adopted +adopting +adopts +advance +advanced +advances +advancing +advantage +advantage's +advantages +advertise +advertised +advertises +advertising +advertising's +advice +advice's +advise +advised +advises +advising +affair +affair's +affairs +affect +affected +affecting +affects +afford +afraid +after +afternoon +afternoon's +again +against +age +age's +agency +agency's +ages +ago +agree +agreed +agreeing +agreement +agreement's +agrees +ahead +aid +aim +aimed +aiming +aims +air +air's +alarm +album +album's +algorithm +algorithm's +algorithms +alias +alive +all +allow +allowed +allowing +allows +almost +alone +along +already +also +alter +altered +altering +alternate +alternative +alternative's +alternatively +alternatives +alters +although +altogether +always +am +ambiguous +among +amongst +amount +amount's +amounts +amuse +amused +amuses +amusing +an +analogue +analogue's +analysis +analysis's +ancient +and +angle +angle's +angry +animal +animal's +announce +announcement +announcement's +annoy +annoyed +annoying +annoys +annual +anonymous +another +answer +answer's +answered +answering +answers +any +anybody +anyone +anyplace +anything +anyway +anywhere +apart +apologies +apology +apparent +apparently +appeal +appeal's +appear +appearance +appearance's +appeared +appearing +appears +apple +apple's +application +application's +applications +applied +applies +apply +applying +appreciate +appreciated +appreciates +appreciating +approach +appropriate +approval +approval's +approve +approved +approves +approving +arbitrary +are +area +area's +areas +argue +argued +argues +arguing +argument +argument's +arguments +arise +arises +arithmetic +arithmetic's +arm +arm's +army +army's +around +arrange +arranged +arrangement +arrangement's +arrangements +arranges +arranging +arrive +arrived +arrives +arriving +art +art's +article +article's +articles +artificial +artist +artist's +as +aside +ask +asked +asking +asks +asleep +aspect +aspect's +aspects +assembler +assembler's +assembly +assembly's +assistant +assistant's +associate +associated +associates +associating +association +association's +assume +assumed +assumes +assuming +assumption +assumption's +assure +assured +assures +assuring +at +ate +atmosphere +atmosphere's +attach +attached +attaching +attachs +attack +attempt +attempted +attempting +attempts +attend +attended +attending +attends +attention +attention's +attitude +attitude's +attract +attractive +audience +audience's +author +author's +authorities +authority +authority's +authors +automatic +automatically +automobile +automobile's +autumn +available +average +average's +avoid +avoided +avoiding +avoids +awake +award +aware +away +awful +awkward +back +back's +backed +background +background's +backing +backing's +backs +backwards +bad +badly +balance +balance's +ball +ball's +ban +band +band's +bank +bank's +bar +bar's +bars +base +base's +based +bases +basic +basically +basing +basis +basis's +battery +battery's +be +bear +bearing +bearing's +bears +beautiful +became +because +become +becomes +becoming +bed +bed's +been +before +beforehand +began +begin +beginning +beginning's +begins +begun +behalf +behalf's +behave +behind +being +being's +believe +believed +believes +believing +belong +belongs +below +benefit +benefit's +benefits +besides +best +bet +bet's +bets +better +betting +between +beyond +bid +bidding +bids +big +bigger +biggest +bill +bill's +binary +bind +binding +binds +biology +biology's +bit +bit's +bite +bites +biting +bits +bitten +bizarre +black +blame +blame's +blank +block +block's +blow +blue +blue's +board +board's +boards +boat +boat's +bodies +body +body's +book +book's +books +boot +boot's +bore +borne +borrow +borrowed +borrowing +borrows +both +bother +bothered +bothering +bothers +bottle +bottle's +bottom +bottom's +bought +bound +box +box's +boxes +boy +boy's +bracket +brackets +branch +branch's +branches +brand +brand's +breach +breach's +break +breaking +breaking's +breaks +bridge +bridge's +brief +briefly +bright +bring +bringing +brings +broadcast +broadcasting +broadcasts +broke +broken +brother +brother's +brought +brown +brown's +bucket +bucket's +budget +budget's +buffer +buffer's +bug +bug's +bugs +build +building +building's +buildings +builds +built +bulk +bulk's +bulletin +bulletin's +buried +buries +bury +burying +bus +bus's +business +business's +busy +but +button +button's +buy +buying +buys +by +byte +bytes +calculate +calculation +calculations +call +called +calling +calling's +calls +came +campaign +campaign's +can +candidate +candidate's +cannot +capable +capacity +capacity's +capital +capital's +captain +captain's +car +car's +card +card's +cardboard +cardboard's +cards +care +careful +carefully +cares +carried +carries +carry +carrying +case +case's +cases +cassette +cassette's +cat +cat's +catch +catches +catching +categories +category +category's +caught +cause +cause's +caused +causes +causing +cease +cell +cell's +cent +cent's +central +century +century's +certain +certainly +chain +chain's +chair +chair's +chairman +chairman's +chance +chance's +chances +change +changed +changes +changing +channel +channel's +channels +chaos +chaos's +chapter +chapter's +char +character +character's +characters +charge +charged +charges +charging +chars +cheap +cheaper +cheapest +checked +checking +chemical +chemical's +child +child's +children +children's +chip +chip's +chips +choice +choice's +choose +chooses +choosing +chose +chosen +church +church's +circle +circle's +circuit +circuit's +circulation +circulation's +circumstance +circumstances +citizen +citizen's +city +city's +claim +claimed +claiming +claims +clarify +class +class's +classes +clean +clear +cleared +clearer +clearer's +clearest +clearing +clearly +clears +clever +clock +clock's +close +closed +closely +closer +closer's +closes +closest +closing +club +club's +clue +clue's +code +code's +coded +codes +coding +coffee +coffee's +cold +collapse +collect +collected +collecting +collection +collection's +collects +college +college's +colleges +column +column's +combination +combination's +combinations +combine +combined +combines +combining +come +comes +comes's +coming +command +commands +comment +comment's +commented +commenting +comments +commercial +commission +commission's +commitment +commitment's +committee +committee's +common +commonly +communicate +communication +communications +community +community's +company +company's +comparable +comparatively +compare +compared +compares +comparing +comparison +comparison's +compatibility +compatibility's +compatible +competition +competition's +compiler +compiler's +complain +complained +complaining +complains +complaint +complaint's +complaints +complete +completed +completely +completes +completing +complex +complexity +complexity's +complicate +complicated +complicates +complicating +component +component's +components +compose +composed +composes +composing +composition +composition's +comprehensive +compromise +compromise's +compulsory +compute +computed +computer +computer's +computers +computes +computing +concept +concept's +concern +concerned +concerning +concerns +conclusion +conclusion's +concrete +concrete's +condition +condition's +conditions +conference +conference's +confident +confirm +confirmed +confirming +confirms +confuse +confused +confuses +confusing +confusion +confusion's +connect +connected +connecting +connection +connection's +connections +connects +consequence +consequence's +consequences +consequently +consider +considerable +considerably +consideration +consideration's +considered +considering +considers +consist +consistency +consistency's +consistent +consists +constant +constraint +constraints +construct +consumption +consumption's +contact +contact's +contain +contained +containing +contains +content +content's +contents +context +context's +continually +continuation +continuation's +continue +continued +continues +continuing +continuous +continuously +contract +contrary +contrast +contribute +contribution +contributions +control +controlled +controlling +controls +convenient +convention +convention's +conventional +conventions +conversation +conversation's +convert +convince +convinced +convinces +convincing +cope +copied +copies +copy +copy's +copying +core +core's +corner +corner's +corners +correct +corrected +correcting +correction +correction's +correctly +corrects +corrupt +corrupted +corrupting +corrupts +cost +cost's +costing +costs +could +council +council's +count +counted +counter +counter's +counting +country +country's +counts +county +county's +couple +couple's +course +course's +courses +court +court's +cover +covered +covering +covering's +covers +covers's +crash +crashed +crashes +crashing +crazy +create +created +creates +creating +creation +creation's +creature +creature's +credit +credit's +crisis +crisis's +crisp +crisps +critical +criticism +criticism's +cross +cross's +cry +cs +cs's +culture +culture's +cumming +cums +cup +cup's +cure +curious +current +currently +cursor +cursor's +customer +customer's +cut +cuts +cutting +cutting's +cycle +cycle's +cycles +daily +damage +damage's +damaged +damages +damaging +danger +danger's +dangerous +dare +dark +data +data's +database +date +date's +dated +dates +dating +datum +datum's +day +day's +days +dead +deal +dealing +dealing's +deals +dealt +dear +death +death's +debate +debate's +decade +decade's +decent +decide +decided +decides +deciding +decision +decision's +decisions +declare +declared +declares +declaring +decrease +dedicate +dedicated +dedicates +dedicating +deduce +deem +deemed +deeming +deems +deep +deeply +default +default's +define +defined +defines +defining +definite +definitely +definition +definition's +definitions +definitive +degree +degree's +degrees +delay +delete +deleted +deletes +deleting +deliberate +deliberately +deliver +delivered +delivering +delivers +delivery +delivery's +demand +demands +democratic +demonstrate +demonstration +demonstration's +department +department's +depend +depended +depending +depends +depth +depth's +derive +derived +derives +deriving +describe +described +describes +describing +description +description's +descriptions +design +designed +designing +designs +desirable +desire +desired +desires +desiring +desk +desk's +desperate +despite +destroy +destroyed +destroying +destroys +detail +detail's +detailed +detailing +details +detect +detected +detecting +detects +determine +determined +determines +determining +develop +developed +developing +development +development's +develops +device +device's +devices +devote +devoted +devotes +devoting +dictionary +dictionary's +did +die +died +dies +differ +difference +difference's +differences +different +differently +difficult +difficulties +difficulty +difficulty's +digit +digital +digits +dinner +dinner's +direct +directed +directing +direction +direction's +directions +directly +director +director's +directory +directory's +directs +dirty +disadvantage +disadvantage's +disagree +disappear +disappeared +disappearing +disappears +disaster +disaster's +disc +disc's +discipline +discipline's +discount +discourage +discouraged +discourages +discouraging +discover +discovered +discovering +discovers +discs +discuss +discussed +discusses +discussing +discussion +discussion's +discussions +disk +disk's +dislike +display +displayed +displaying +displays +distance +distance's +distant +distinct +distinction +distinction's +distinctly +distinguish +distribute +distributed +distributes +distributing +distribution +distribution's +district +district's +disturb +disturbed +disturbing +disturbs +ditto +ditto's +divide +divided +divides +dividing +division +division's +do +document +document's +documentation +documentation's +documented +documenting +documents +doe +does +dog +dog's +doing +doing's +dollar +dollar's +domain +domain's +done +door +door's +doors +double +doubt +doubt's +doubtful +down +dozen +dozens +drastic +draw +drawing +drawing's +drawn +draws +dream +dream's +drew +drink +drive +driven +driver +driver's +drivers +drives +driving +drop +drop's +dropped +dropping +dropping's +drops +drove +dry +dubious +due +due's +dumb +dump +during +duty +duty's +dying +each +earlier +earliest +early +earth +earth's +ease +ease's +easier +easiest +easily +east +east's +easy +eat +eaten +eating +eating's +eats +economic +economy +economy's +edge +edge's +edit +edited +editing +edition +edition's +editor +editor's +editors +edits +education +education's +educational +effect +effect's +effective +effectively +effects +efficient +effort +effort's +efforts +eight +eight's +either +elect +elected +electing +election +election's +electric +electronic +electronics +electronics's +elects +element +element's +elements +elevator +else +elsewhere +embarrass +embarrassed +embarrasses +embarrassing +emergency +emergency's +emphasis +emphasis's +employee +employee's +empty +enable +enables +encounter +encountered +encountering +encounters +encourage +encouraged +encourages +encouraging +end +end's +ended +ending +ending's +ends +enemy +enemy's +engineer +engineer's +engineered +engineering +engineering's +engineers +enjoy +enormous +enough +ensure +ensured +ensures +ensuring +enter +entered +entering +enters +entire +entirely +entitle +entitled +entitles +entitling +entity +entity's +entrance +entrance's +entries +entry +entry's +environment +environment's +equal +equally +equipment +equipment's +equivalent +eraser +eraser's +err +error +error's +errors +escape +especially +essential +essentially +establish +established +establishes +establishing +establishment +establishment's +estimate +even +evened +evening +evening's +evenings +evens +event +event's +events +eventually +ever +every +everybody +everyone +everything +everywhere +evidence +evidence's +exact +exactly +examine +examined +examines +examining +example +example's +examples +excellent +except +exception +exception's +exceptions +excess +excess's +excessive +exchange +exclude +excluded +excludes +excluding +exclusive +excuse +execute +executed +executes +executing +exercise +exist +existed +existence +existence's +existing +exists +expand +expanded +expanding +expands +expansion +expansion's +expect +expected +expecting +expects +expense +expense's +expensive +experience +experience's +experienced +experiences +experiencing +experiment +experiment's +experimental +experiments +expert +expert's +experts +explain +explained +explaining +explains +explanation +explanation's +explicit +express +expressed +expresses +expressing +expression +expression's +extend +extended +extending +extends +extension +extension's +extensive +extent +extent's +external +extra +extract +extreme +extremely +eye +eye's +eyes +face +face's +facilities +facility +facility's +fact +fact's +factor +factor's +factors +facts +fail +failed +failing +failing's +fails +failure +failure's +fair +fairly +faith +faith's +fall +fallen +falling +falls +false +familiar +family +family's +famous +fan +fan's +fancy +far +farm +farm's +farther +farthest +fashion +fashion's +fast +faster +fastest +fatal +fate +fate's +father +father's +fault +fault's +faults +fear +fear's +feasible +feature +feature's +features +fed +federal +feed +feedback +feedback's +feeding +feeds +feel +feeling +feeling's +feels +feet +feet's +fell +felt +few +fewer +fewest +field +field's +fields +fight +figure +figure's +figures +file +file's +filed +files +filing +fill +filled +filling +filling's +fills +film +film's +final +finally +financial +find +finding +finding's +finds +fine +fine's +finger +finger's +fingers +finish +finished +finishes +finishing +finite +fire +fire's +firm +firmly +first +firstly +fiscal +fish +fish's +fishes +fit +fit's +fits +fitted +fitting +five +five's +fix +fixed +fixes +fixing +flag +flag's +flash +flashed +flashes +flashing +flashing's +flat +flew +flexible +flied +flies +flight +flight's +float +floated +floating +floats +floor +floor's +flow +flown +fly +flying +folk +folks +follow +followed +following +follows +food +food's +foot +foot's +for +force +force's +forced +forces +forcing +foreign +forever +forget +forgets +forgetting +forgot +forgotten +form +form's +formal +format +format's +formed +former +forming +forms +forth +forthcoming +fortunately +fortune +fortune's +forward +found +four +four's +fourth +fraction +fraction's +frame +frame's +free +freedom +freedom's +freely +french +frequent +frequently +fresh +friend +friend's +friendly +friends +fries +from +front +front's +fry +full +fully +fun +fun's +function +function's +functions +fund +fund's +fundamental +fundamentally +funds +funny +further +furthest +future +future's +gain +gained +gaining +gains +game +game's +games +gap +gap's +garbage +garbage's +garden +garden's +gas +gasoline +gather +gave +general +generally +generate +generated +generates +generating +generation +generation's +genuine +get +gets +getting +girl +girl's +give +given +gives +giving +glad +glass +glass's +global +go +go's +goes +going +going's +gone +good +goods +got +gotten +government +government's +governor +governor's +gradually +graduate +graduate's +grand +grands +grant +granted +granting +grants +graph +graph's +graphic +graphics +graphics's +grateful +grave +grave's +great +greater +greatest +greatly +green +green's +grew +grind +grinding +grinds +gross +grosses +ground +ground's +grounds +group +group's +groups +grow +growing +grown +grows +growth +growth's +guarantee +guarantee's +guaranteed +guaranteeing +guarantees +guard +guess +guessed +guesses +guessing +guide +gun +gun's +guy +guy's +habit +habit's +habits +hack +had +hair +hair's +half +half's +hall +hall's +hand +hand's +handed +handing +handle +handle's +handled +handles +handling +handling's +hands +handy +hang +hanged +hanging +hanging's +hangs +happen +happened +happening +happening's +happens +happily +happy +hard +harder +hardest +hardly +hardware +hardware's +harm +harm's +harmful +harmless +has +hat +hat's +hate +have +having +he +he's +head +head's +headed +header +header's +heading +heading's +heads +health +health's +healthy +hear +heard +hearing +hears +heart +heart's +heat +heat's +heavily +heavy +held +hell +hell's +hello +hello's +help +helped +helpful +helping +helping's +helps +hence +her +here +hereby +herself +hid +hidden +hide +hides +hiding +high +higher +highest +highly +hill +hill's +him +himself +hint +hint's +hints +his +historical +history +history's +hit +hits +hitting +hold +holding +holding's +holds +hole +hole's +holes +holiday +holiday's +holidays +home +home's +honest +hope +hope's +hoped +hopefully +hopes +hoping +horrible +horse +horse's +horses +hospital +hospital's +host +host's +hot +hotel +hotel's +hour +hour's +hours +house +house's +how +however +huge +human +hundred +hundred's +hundreds +hung +hunt +hurry +husband +husband's +ice +ice's +idea +idea's +ideal +ideal's +ideas +identical +identify +identity +identity's +if +ignore +ignored +ignores +ignoring +ill +illegal +image +image's +images +imagination +imagination's +imagine +immediate +immediately +impact +impact's +implement +implement's +implemented +implementing +implements +implication +implications +implied +implies +imply +implying +importance +importance's +important +importantly +impose +imposed +imposes +imposing +impossible +impression +impression's +improve +improved +improvement +improvement's +improvements +improves +improving +in +inability +inability's +inadequate +inch +inch's +inches +incident +incident's +incidentally +incline +inclined +inclines +inclining +include +included +includes +including +income +income's +incompatible +incomplete +inconsistent +inconvenience +inconvenience's +incorrect +increase +increased +increases +increasing +indeed +independent +independently +index +index's +indicate +indicates +indication +indication's +individual +individually +individuals +industrial +industry +industry's +inevitably +inferior +infinite +influence +influence's +info +info's +inform +information +information's +informed +informing +informs +initial +initially +initials +inner +innocent +input +input's +inputs +inputted +inputting +insert +inserted +inserting +inserts +inside +inside's +insist +insisted +insisting +insists +install +installed +installing +installs +instance +instance's +instant +instant's +instantly +instead +institution +institution's +institutions +instruction +instruction's +instructions +insurance +insurance's +integer +integer's +integers +integral +intelligence +intelligence's +intelligent +intend +intended +intending +intends +intention +intention's +interact +interest +interest's +interested +interesting +interests +interface +interface's +internal +international +interpret +interpretation +interpretation's +interpreted +interpreting +interprets +interval +intervals +intervention +intervention's +into +introduce +introduced +introduces +introducing +introduction +introduction's +invalid +invalid's +invariably +invent +invented +inventing +invents +investigate +invisible +invitation +invitation's +invite +invited +invites +inviting +involve +involved +involves +involving +irrelevant +irritate +irritated +irritates +irritating +is +isolate +isolated +isolates +isolating +issue +issue's +issued +issues +issuing +it +it's +item +item's +items +its +itself +job +job's +jobs +join +joined +joining +joins +joint +joint's +joke +joke's +joy +joy's +judge +judge's +jump +jumps +junk +junk's +just +justification +justification's +justified +justifies +justify +justifying +keen +keep +keeping +keeping's +keeps +kept +key +key's +keyboard +keyboard's +keys +kid +kid's +kill +killed +killing +kills +kind +kindly +kinds +king +king's +knew +knock +knocked +knocking +knocks +know +knowing +knowledge +knowledge's +known +knows +label +label's +labels +laboratory +laboratory's +lack +lack's +lacked +lacking +lacks +ladies +lady +lady's +lain +land +land's +landed +landing +landing's +lands +language +language's +languages +large +largely +larger +largest +last +lasts +late +later +latest +latter +law +law's +laws +lay +layout +layout's +lazy +leach +lead +leaded +leader +leader's +leading +leads +leaf +learn +learning +learning's +learns +least +leave +leaved +leaves +leaves's +leaving +leaving's +lecture +lecture's +lectures +led +left +leg +leg's +legal +legally +legs +lend +length +length's +less +lesser +lesson +lessons +let +lets +letter +letter's +letters +letting +level +levels +liable +libraries +library +library's +lie +lied +lies +life +life's +lifetime +lifetime's +lift +light +light's +lights +like +liked +likely +likes +likewise +liking +limit +limit's +limited +limiting +limits +line +line's +linear +lines +link +link's +linked +linking +links +list +list's +listed +listen +listing +listing's +lists +literally +literature +literature's +little +live +lived +lives +lives's +living +load +load's +loaded +loading +loads +loan +loan's +local +location +location's +locations +lock +lock's +locked +locking +locks +log +log's +logged +logging +logging's +logic +logic's +logical +logs +long +longer +longest +look +looked +looking +looks +loop +loop's +loose +lorry +lorry's +lose +loses +losing +loss +loss's +lost +lot +lots +loudly +love +low +lower +lowest +luck +luck's +lucky +lunch +lunch's +lying +machine +machine's +machines +mad +made +magic +magic's +magnetic +magnitude +magnitude's +mail +mail's +main +mainly +maintain +maintained +maintaining +maintains +major +major's +majority +majority's +make +makes +making +making's +man +man's +manage +managed +manager +manager's +manages +managing +manipulation +manner +manner's +manual +manuals +many +map +map's +march +mark +mark's +marked +market +market's +marking +marks +marriage +marriage's +marry +mass +massive +master +master's +match +match's +matches +material +material's +materials +mathematical +mathematics +mathematics's +matter +matter's +matters +maximum +maximum's +may +maybe +me +mean +meaning +meaning's +meaningful +meaningless +meanings +means +means's +meant +measure +measure's +measured +measures +measuring +mechanic +mechanics +mechanism +mechanism's +media +media's +medical +medium +mediums +meet +meeting +meeting's +meetings +meets +member +member's +members +membership +membership's +memory +memory's +men +men's +mention +mentioned +mentioning +mentions +mere +merely +merit +merits +mess +mess's +message +message's +messages +messy +met +metal +metal's +method +method's +methods +middle +midnight +midnight's +might +mile +mile's +miles +military +million +million's +millions +mind +mind's +minded +minding +minds +mine +minimal +minimum +minimum's +minor +minority +minority's +minute +minute's +minutes +mislead +misleading +misleads +misled +miss +missed +misses +missing +mistake +mistake's +mistaken +mistakes +mistaking +mistook +misunderstand +misunderstanding +misunderstands +misunderstood +misuse +misuse's +mix +mixed +mixes +mixing +mod +mode +mode's +model +model's +models +modern +modified +modifies +modify +modifying +moment +moment's +money +money's +monitor +monitor's +month +month's +months +moral +more +morning +morning's +mornings +most +mostly +mother +mother's +motion +motion's +mouth +mouth's +move +moved +movement +movement's +movements +moves +movie +movie's +moving +much +multiple +music +music's +must +my +myself +mysterious +naive +name +name's +named +named's +namely +names +naming +naming's +nasty +nation +nation's +national +natural +naturally +nature +nature's +naughty +near +nearby +nearer +nearest +nearly +necessarily +necessary +necessity +necessity's +neck +neck's +need +needed +needing +needs +negative +neither +nervous +net +net's +network +network's +networks +never +nevertheless +new +news +news's +next +nice +nicer +nicest +night +night's +nine +nine's +no +nobody +noise +noise's +noisy +none +nonsense +nonsense's +nor +normal +normally +north +north's +not +note +note's +noted +notes +nothing +notice +notice's +noticed +notices +noticing +notify +noting +novel +novel's +now +nowadays +nowhere +numb +number +number's +numbers +numbest +numerical +numerous +obey +object +object's +objected +objecting +objection +objection's +objections +objects +obscure +observation +observation's +observe +observed +observes +observing +obtain +obtained +obtaining +obtains +obvious +obviously +occasion +occasion's +occasional +occasionally +occasions +occupied +occupies +occupy +occupying +occur +occurred +occurring +occurs +odd +odds +of +off +offer +offered +offering +offering's +offers +office +office's +officer +officer's +offices +official +often +oh +oil +oil's +old +older +oldest +omit +omits +omitted +omitting +on +once +one +ones +only +onto +open +opened +opening +opening's +opens +operate +operated +operates +operating +operation +operation's +operations +operator +operator's +operators +opinion +opinion's +opinions +opportunities +opportunity +opportunity's +oppose +opposed +opposes +opposing +opposite +opposition +opposition's +option +option's +optional +options +or +or's +order +order's +ordered +ordering +orders +ordinary +origin +origin's +original +originally +other +others +otherwise +ought +our +ours +ourselves +out +outer +output +output's +outside +over +overall +owe +owed +owes +owing +own +owner +owner's +owners +pack +pack's +package +package's +packages +packet +packet's +page +page's +pages +paid +pain +pain's +painful +pair +pair's +pairs +paper +paper's +papers +paragraph +paragraph's +parallel +parent +parent's +park +park's +part +part's +partial +partially +particular +particularly +parties +partly +parts +party +party's +pass +passed +passes +passing +past +patch +patch's +path +path's +patient +pattern +pattern's +patterns +pause +pay +payed +paying +pays +peace +peace's +peak +peak's +peculiar +pen +pen's +people +people's +per +perfect +perfectly +perform +performance +performance's +performed +performing +performs +perhaps +period +period's +permanent +permanently +permission +permission's +permit +permits +permitted +permitting +person +person's +personal +personally +persons +persuade +persuaded +persuades +persuading +petrol +phase +phase's +phenomenon +phenomenon's +philosophy +philosophy's +phone +phone's +phrase +phrase's +phrases +physical +pi +pick +picked +picking +picks +picture +picture's +pictures +piece +piece's +pieces +pile +pile's +pint +pint's +pipe +pipe's +place +place's +placed +places +placing +plain +plan +plan's +plane +plane's +planet +planet's +planned +planning +plans +plant +plant's +plastic +plastic's +play +played +playing +plays +plea +plea's +pleasant +please +pleased +pleases +pleasing +plenty +plenty's +plot +plot's +plots +plug +plug's +plus +pocket +pocket's +poem +poem's +poet +poet's +point +point's +pointed +pointing +pointing's +pointless +points +police +police's +policies +policy +policy's +political +poll +poll's +pool +pool's +poor +pop +popular +population +population's +port +port's +position +position's +positions +positive +possibilities +possibility +possibility's +possible +possibly +post +post's +posted +posting +posting's +postmaster +postmaster's +posts +potential +potentially +pound +pounds +power +power's +powerful +powers +practical +practically +precise +precisely +prefer +preferable +preferably +preference +preference's +preferred +preferring +prefers +preparation +preparation's +prepare +prepared +prepares +preparing +presence +presence's +present +presented +presenting +presents +preserve +president +president's +press +pressed +presses +pressing +pressure +pressure's +presumably +presume +pretty +prevent +prevented +preventing +prevents +previous +previously +price +price's +prices +primary +prime +primitive +principle +principle's +principles +print +printed +printer +printer's +printers +printing +printing's +printout +prints +prior +private +probably +problem +problem's +problems +procedure +procedure's +process +process's +processed +processes +processing +processor +processor's +processors +produce +produced +produces +producing +product +product's +production +production's +products +professional +programmer +programmer's +programmers +progress +progress's +project +project's +projects +promise +promised +promises +promising +prompt +promptly +prone +proof +proof's +proper +properly +properties +property +property's +proportion +proportion's +proposal +proposal's +propose +proposed +proposes +proposing +prospect +prospect's +protect +protected +protecting +protection +protection's +protects +protest +protest's +prove +proved +proves +provide +provided +provides +providing +proving +public +publication +publication's +publicity +publicity's +publicly +publish +published +publishes +publishing +pull +pulled +pulling +pulls +punctuation +punctuation's +puncture +purchase +pure +purely +purpose +purpose's +purposes +push +pushed +pushes +pushing +put +puts +putt +putted +putting +putts +qualified +qualifies +qualify +qualifying +quality +quality's +quantities +quantity +quantity's +quarter +quarter's +question +question's +questions +queue +queue's +quick +quicker +quickest +quickly +quiet +quietly +quit +quite +quits +quitting +quote +quoted +quotes +quoting +race +race's +radio +radio's +rain +rain's +raise +raised +raises +raising +raising's +ran +random +randomly +range +range's +rapid +rapidly +rare +rarely +rate +rate's +rates +rather +raw +re +re's +reach +reached +reaches +reaching +react +reaction +reaction's +read +readable +reader +reader's +readers +readily +reading +reading's +reads +ready +real +reality +reality's +really +reason +reason's +reasonable +reasonably +reasons +recall +receive +received +receives +receiving +recent +recently +reception +reception's +recognition +recognition's +recommend +recommendation +recommendation's +recommended +recommending +recommends +record +record's +recorded +recording +recording's +records +recover +recovered +recovering +recovers +red +red's +reduce +reduced +reduces +reducing +reduction +reduction's +redundant +refer +reference +reference's +references +referred +referring +refers +reflect +reflected +reflecting +reflection +reflection's +reflects +refuse +refuse's +refused +refuses +refusing +regard +regarded +regarding +regardless +regards +region +region's +register +register's +registered +registering +registers +regret +regular +regularly +regulation +regulations +reject +rejected +rejecting +rejects +relate +related +relates +relating +relation +relation's +relationship +relationship's +relative +relatively +release +released +releases +releasing +relevance +relevance's +relevant +reliable +religion +religion's +religious +reluctant +rely +remain +remained +remaining +remains +remark +remarks +remember +remembered +remembering +remembers +remind +reminded +reminding +reminds +remote +remotely +removal +removal's +remove +removed +removes +removing +repair +repeat +repeated +repeatedly +repeating +repeats +replace +replaced +replacement +replacement's +replaces +replacing +replied +replies +reply +replying +report +report's +reported +reporting +reports +represent +representation +representation's +representative +representative's +represented +representing +represents +reproduce +request +requested +requesting +requests +require +required +requirement +requirement's +requirements +requires +requiring +research +research's +reserve +reserved +reserves +reserving +resident +resident's +resolution +resolution's +resort +resource +resource's +resourced +resources +resourcing +respect +respect's +respectively +respects +respond +response +response's +responses +responsibility +responsibility's +responsible +rest +rest's +restart +restore +restored +restores +restoring +restrict +restricted +restricting +restricts +result +result's +resulted +resulting +results +retain +return +returned +returning +returns +reveal +revealed +revealing +reveals +reverse +review +rewrite +rid +ridding +ride +ridiculous +rids +right +rights +rights's +ring +ring's +rise +risk +risk's +river +river's +road +road's +role +role's +roll +room +room's +rooms +root +root's +rough +roughly +round +route +route's +routine +routine's +row +row's +rubber +rubber's +rubbish +rubbish's +rule +rule's +rules +run +running +runs +rush +sad +sadly +safe +safely +safer +safest +safety +safety's +said +saint +saint's +sake +sake's +sale +sale's +sales +same +sample +sample's +sat +satisfied +satisfies +satisfy +satisfying +save +saved +saves +saving +saw +saw's +say +saying +saying's +says +says's +scale +scale's +scan +scene +scene's +scheme +scheme's +school +school's +schools +science +science's +sciences +scientific +score +score's +scores +scrap +scrap's +scratch +screen +screen's +screens +script +script's +search +searched +searches +searching +season +season's +second +secondary +secondly +seconds +secret +secretary +secretary's +section +section's +sections +secure +security +security's +see +seeing +seeing's +seek +seeking +seeks +seem +seemed +seeming +seems +seen +sees +select +selected +selecting +selection +selection's +selects +self +self's +sell +selling +sells +seminar +seminar's +send +sending +sends +senior +sense +sense's +sensible +sensibly +sensitive +sent +sentence +sentence's +sentences +separate +separately +sequence +sequence's +sequences +serial +serial's +series +series's +serious +seriously +serve +served +server +server's +serves +service +service's +services +serving +session +session's +sessions +set +sets +setting +setting's +settle +settled +settles +settling +seven +seven's +several +severe +severely +sex +sex's +shall +shame +shame's +shape +shape's +share +share's +shared +shares +sharing +sharp +she +sheet +sheet's +shelf +shelf's +shell +shell's +shift +ship +ship's +shoot +shop +shop's +shopped +shopping +shopping's +shops +short +shortage +shortage's +shorter +shortest +shortly +should +show +showed +showing +showing's +shown +shows +shut +shuts +shutting +side +side's +sides +sight +sight's +sign +sign's +signal +signal's +signals +signed +significance +significance's +significant +significantly +signing +signs +silly +similar +similarly +simple +simpler +simplest +simply +simultaneous +simultaneously +since +sincerely +single +sit +site +site's +sites +sits +sitting +sitting's +situation +situation's +situations +six +six's +size +size's +sizes +skill +skills +sleep +sleep's +slight +slightly +slip +slow +slower +slowest +slowly +small +smaller +smallest +smile +smile's +smooth +so +social +society +society's +soft +software +software's +sold +solely +solid +solution +solution's +solutions +solve +solved +solves +solving +some +somebody +somehow +someone +someplace +something +sometime +sometimes +somewhat +somewhere +son +son's +soon +sooner +soonest +sophisticate +sophisticated +sophisticates +sophisticating +sorry +sort +sort's +sorted +sorting +sorts +sought +sound +sound's +sounded +sounding +sounds +source +source's +sources +south +south's +southern +space +space's +spaces +spare +speak +speaker +speaker's +speakers +speaking +speaks +special +specially +specific +specifically +specified +specifies +specify +specifying +speech +speech's +speed +speed's +spell +spelling +spelling's +spells +spend +spending +spends +spent +spirit +spirit's +spite +spite's +split +splits +splitting +spoke +spoken +spot +spot's +spots +spotted +spotting +spread +spreading +spreads +spring +square +square's +stable +stable's +staff +staff's +stage +stage's +stages +stand +standard +standard's +standards +standing +standing's +stands +start +started +starting +starts +state +state's +stated +statement +statement's +statements +states +stating +station +station's +stations +statistic +statistical +statistics +status +status's +stay +stayed +staying +stays +steal +step +step's +stick +stick's +sticking +sticks +still +stock +stock's +stone +stone's +stones +stood +stop +stopped +stopping +stopping's +stops +stops's +storage +storage's +store +store's +stored +stores +storing +straight +straightforward +strange +strategy +strategy's +stream +stream's +street +street's +strength +strength's +strict +strictly +strike +strikes +striking +string +string's +strings +strong +strongly +struck +structure +structure's +structures +stuck +student +student's +students +studied +studies +study +studying +stuff +stupid +style +style's +subject +subject's +subjects +submit +submits +submitted +submitting +subsequent +subset +subset's +substantial +substitute +subtle +succeed +success +success's +successful +successfully +such +sudden +suddenly +suffer +suffered +suffering +suffering's +suffers +suffice +sufficient +sufficiently +sugar +sugar's +suggest +suggested +suggesting +suggestion +suggestion's +suggestions +suggests +suit +suit's +suitable +suitably +suited +suiting +suits +sum +sum's +summary +summary's +summer +summer's +sun +sun's +superior +supervisor +supervisor's +supplied +supplies +supply +supplying +support +supported +supporting +supports +suppose +supposed +supposedly +supposes +supposing +sure +surely +surface +surface's +surprise +surprised +surprises +surprising +survey +survive +survived +survives +surviving +suspect +suspected +suspecting +suspects +suspend +suspended +suspending +suspends +suspicion +suspicion's +switch +switch's +switched +switches +switching +symbol +symbol's +symbols +syntax +syntax's +system +system's +systems +table +table's +tables +take +taken +takes +taking +talk +talked +talking +talks +tank +tanks +tape +tape's +tapes +target +target's +task +task's +tasks +taste +taste's +taught +tax +tax's +tea +tea's +teach +teacher +teacher's +teaches +teaching +teaching's +team +team's +technical +technique +technique's +techniques +technology +technology's +tedious +teeth +teeth's +telephone +telephone's +television +television's +tell +telling +tells +temperature +temperature's +temporarily +temporary +ten +ten's +tend +tendency +tendency's +tends +term +term's +terminal +terminals +terminology +terminology's +terms +terribly +test +tested +testing +tests +text +text's +than +thank +thanks +that +that's +the +their +them +themselves +then +theoretical +theory +theory's +there +there's +thereby +therefore +these +they +thin +thing +thing's +things +think +thinking +thinking's +thinks +third +this +thoroughly +those +though +thought +thoughts +thousand +thousand's +thousands +threat +threat's +three +three's +threw +through +throughout +throw +throwing +thrown +throws +thus +ticket +tickets +tie +tied +ties +tight +till +time +time's +timed +times +timing +timing's +tin +title +title's +titles +to +today +today's +together +token +token's +told +tomorrow +tomorrow's +tonight +tonight's +too +took +tooth +tooth's +top +top's +topic +topic's +topics +total +total's +totally +touch +touched +touches +touching +toward +towards +town +town's +trace +trace's +track +track's +tracks +traditional +traffic +traffic's +train +trained +training +training's +trains +transfer +transferred +transferring +transfers +translate +translated +translates +translating +translation +translation's +transport +trap +trap's +trapped +trapping +traps +trash +trash's +travel +treat +treat's +treated +treating +treatment +treatment's +treats +tree +tree's +trees +trial +trial's +trick +trick's +tried +tries +trip +trip's +trivial +trouble +trouble's +truck +truck's +true +truly +trunk +trunk's +trust +trust's +trusted +trusting +trusts +truth +truth's +try +trying +tune +tune's +turn +turned +turning +turning's +turns +twelve +twelve's +twenty +twenty's +twice +two +two's +tying +type +type's +typed +types +typical +typing +ugly +ultimate +ultimately +unable +unacceptable +unaware +uncertain +unclear +under +undergraduate +undergraduate's +undergraduates +underneath +understand +understanding +understanding's +understands +understood +unfortunate +unfortunately +unhappy +uniform +uniform's +unique +unit +unit's +unite +units +universal +universities +university +university's +unknown +unless +unlike +unlikely +unlimited +unnecessarily +unnecessary +unpleasant +unreasonable +unsuitable +until +unusual +unwanted +up +update +updated +updates +updating +upon +upper +upset +upsets +upsetting +upwards +us +usage +usage's +use +used +useful +useless +user +user's +users +uses +using +usual +usually +utility +utility's +utterly +vacation +vacation's +vacations +vague +vaguely +valid +validity +validity's +valuable +value +value's +values +van +van's +variable +variables +variation +variation's +varied +varies +variety +variety's +various +vary +varying +vast +vastly +vector +vector's +version +version's +versions +very +via +vice +vice's +video +video's +view +view's +views +virtually +virtue +virtue's +visible +vision +vision's +visit +vital +voice +voice's +volume +volume's +vote +vote's +votes +wait +waited +waiting +waits +walk +walked +walking +walks +wall +wall's +walls +want +wanted +wanting +wants +war +warm +warn +warned +warning +warning's +warns +was +wash +waste +wasted +wastes +wasting +watch +watched +watches +watching +water +water's +way +way's +ways +we +weapon +weapon's +wear +wearing +wears +weather +weather's +week +week's +weekend +weekend's +weeks +weight +weight's +weird +welcome +welcomed +welcomes +welcoming +well +went +were +west +west's +western +what +whatever +whatsoever +wheel +wheel's +wheels +when +whenever +where +whereas +whereby +wherever +whether +which +while +whilst +white +who +whoever +whole +whom +whose +why +wide +widely +wider +widespread +widest +wife +wife's +wild +will +willed +willing +wills +win +wind +wind's +window +window's +windows +wine +wine's +winning +wins +winter +winter's +wire +wire's +wise +wish +wished +wishes +wishing +with +withdraw +within +without +woman +woman's +women +women's +won +wonder +wonder's +wondered +wonderful +wondering +wonders +wooden +word +word's +worded +wording +wording's +words +wore +work +work's +worked +worker +worker's +workers +working +working's +works +world +world's +worn +worried +worries +worry +worrying +worse +worst +worth +worthwhile +worthy +would +write +writer +writer's +writes +writing +writing's +written +wrong +wrote +year +year's +years +yellow +yellow's +yes +yesterday +yesterday's +yet +you +young +your +yours +yourself +zero +zero's diff --git a/cosmic rage/spell/english-words.20 b/cosmic rage/spell/english-words.20 new file mode 100644 index 0000000..af5c7f9 --- /dev/null +++ b/cosmic rage/spell/english-words.20 @@ -0,0 +1,8697 @@ +aardvark +aardvark's +abandon +abandoned +abandoning +abandons +abbreviate +abbreviated +abbreviates +abbreviating +abbreviation +abbreviation's +abbreviations +abide +abnormal +abnormally +abolish +abolished +abolishes +abolishing +abolition +abolition's +abort +aborted +aborting +abortion +abortion's +aborts +abroad +absent +absorb +absorbed +absorbing +absorbs +abstract +abstraction +abstraction's +absurd +abused +abuses +abusing +abusive +abysmal +academics +accelerate +accent +accent's +accents +acceptance +acceptance's +accessed +accesses +accessing +accidents +accommodate +accommodation +accommodation's +accompanied +accompanies +accompany +accompanying +accomplish +accomplished +accomplishes +accomplishing +accord's +accordance +accordance's +accountant +accountants +accounted +accounting +accounting's +accumulate +accumulated +accumulates +accumulating +accurately +accusation +accusation's +accusations +accuse +accused +accused's +accuses +accusing +accustom +accustomed +accustoming +accustoms +ace +ace's +achievement +achievement's +achievements +acid +acid's +acknowledge +acknowledged +acknowledges +acknowledging +acorn +acorn's +acoustic +acquaintance +acquaintance's +acquisition +acquisition's +acronym +acronym's +acronyms +activate +activated +activates +activating +actively +actor +actor's +actors +acute +adapt +adaptation +adaptation's +adapted +adapting +adapts +addict +addicted +addicting +addictive +addicts +additionally +additions +adequately +adhere +adhered +adheres +adhering +adjacent +adjective +adjective's +adjusted +adjusting +adjustment +adjustment's +adjustments +adjusts +administer +administered +administering +administers +administrative +admirable +admiration +admiration's +admire +admission +admission's +adoption +adoption's +adult +adults +advantageous +advent +advent's +adventure +adventure's +adventures +adventurous +adverse +adversely +advert +advertisement +advertisement's +advertisements +adverts +advisable +adviser +adviser's +advisers +advisory +advocate +advocated +advocates +advocating +aerial +aesthetic +aesthetically +affection +affection's +aforementioned +afternoons +aged +agenda +agenda's +agent +agent's +agents +aggressive +agony +agony's +agreements +agricultural +aided +aiding +aids +aircraft +aircraft's +airport +airport's +akin +alarmed +alarming +alarms +alas +albeit +albums +alcohol +alcohol's +alcoholic +alcoholic's +alert +algebra +algebra's +algebraic +aliases +alien +alien's +aliens +align +aligned +aligning +alignment +alignment's +aligns +alike +allegation +allegations +allege +alleged +allegedly +alleges +alleging +allergic +alleviate +alliance +alliance's +allies +allies's +allocate +allocated +allocates +allocating +allocation +allocation's +allocations +allowable +allowance +allowance's +allowances +ally +alongside +aloud +alpha +alpha's +alphabet +alphabet's +alphabetic +alphabetical +alteration +alteration's +alterations +amateur +amateur's +amaze +amazed +amazes +amazing +amazingly +ambassador +ambassador's +amber +amber's +ambient +ambiguities +ambiguity +ambiguity's +ambitious +amend +amended +amending +amendment +amendment's +amends +amp +amp's +ample +amplifier +amplifier's +amusement +amusement's +anagram +anagram's +analogous +analogy +analogy's +analyst +analyst's +anarchy +anarchy's +anatomy +anatomy's +ancestor +ancestors +anecdote +anecdotes +angel +angel's +angels +anger +anger's +angles +anguish +anguish's +animals +anniversary +anniversary's +announced +announcements +announces +announcing +annoyance +annoyance's +annually +anomalies +anomaly +anorak +anoraks +anthology +anthology's +anticipate +anticipated +anticipates +anticipating +anticipation +anticipation's +antidote +antidote's +antique +antique's +antisocial +anxious +anyhow +apathetic +apathy +apathy's +apology's +apostrophe +apostrophe's +appalled +appalling +appallingly +apparatus +apparatus's +apparatuses +appealed +appealing +appeals +appearances +append +appended +appending +appendix +appendix's +appends +applause +applause's +applicable +applicant +applicant's +applicants +appoint +appointed +appointing +appointment +appointment's +appointments +appoints +appraisal +appraisal's +appreciation +appreciation's +approached +approaches +approaching +appropriately +approximate +approximately +approximation +approximation's +apt +arbitrarily +arc +arc's +arcade +arcade's +arcane +arch +arch's +archaic +architecture +architecture's +archive +archive's +archived +archives +archiving +arena +arena's +arguable +arguably +arisen +arising +armed +arming +arms +arose +array +array's +arrays +arrest +arrested +arresting +arrests +arrival +arrival's +arrogance +arrogance's +arrogant +arrow +arrow's +arrows +artificially +artistic +artists +arts +ascend +ascended +ascending +ascends +ash +ashamed +ashcan +ashcan's +ashes +assault +assault's +assemble +assembled +assembles +assembling +assert +asserted +asserting +assertion +assertion's +asserts +assess +assessed +assesses +assessing +assessment +assessment's +asset +assets +assign +assigned +assigning +assignment +assignment's +assignments +assigns +assist +assistance +assistance's +assisted +assisting +assists +associations +assort +assorted +assorting +assorts +assumptions +asterisk +asterisk's +asterisks +astronomer +astronomers +astronomy +astronomy's +asynchronous +atheism +atheism's +atheist +atheist's +atheists +atlas +atlas's +atmospheric +atom +atom's +atomic +atoms +atrocities +atrocity +attach's +attachment +attachment's +attacked +attacking +attacks +attain +attendance +attendance's +attendant +attendant's +attentions +attitudes +attorney +attorney's +attorneys +attracted +attracting +attraction +attraction's +attracts +attribute +attributed +attributes +attributing +audible +audiences +audio +audio's +aunt +aunt's +authentic +autobiography +autobiography's +automate +automated +automates +automating +automobiles +autumn's +availability +availability's +await +awaited +awaiting +awaits +awarded +awarding +awards +awareness +awareness's +awfully +axes +axiom +axioms +axis +axis's +babies +baby +baby's +backbone +backbone's +backgrounds +backlog +backlog's +backspace +backward +bacteria +bacterium +badge +badge's +baffle +baffled +baffles +baffling +bag +bag's +baggage +baggage's +bags +bake +baked +bakes +baking +balanced +balances +balancing +ballet +ballet's +ballot +ballot's +balls +banal +banana +banana's +bananas +bands +bandwagon +bandwagon's +bandwidth +bandwidth's +bang +bang's +bankrupt +bankrupt's +banks +banned +banner +banner's +banning +bans +bare +barely +bargain +bargain's +bark +barked +barking +barks +baroque +baroque's +barred +barrel +barrel's +barrier +barrier's +barriers +barring +barrister +barrister's +barristers +basement +basement's +bash +bashed +bashes +bashing +basics +basket +basket's +bass +bass's +basses +bastard +bastard's +bastards +bat +bat's +batch +batch's +bath +bath's +bathroom +bathroom's +baths +batteries +battle +battle's +baud +baud's +bay +bay's +beach +beach's +beam +beam's +bean +bean's +beans +beard +beard's +bearded +bearding +beards +beast +beast's +beasts +beat +beaten +beating +beating's +beats +beautifully +beauty +beauty's +bedroom +bedroom's +beds +beef +beef's +beer +beer's +beers +beg +beginner +beginner's +beginners +behaved +behaves +behaving +beings +belief +belief's +beliefs +believable +believer +believer's +believers +bell +bell's +bells +belonged +belonging +belonging's +beloved +belt +belt's +bench +bench's +bend +bending +bends +beneath +beneficial +bent +beside +beta +beta's +beware +bias +bias's +biased +biases +biasing +bible +biblical +bicycle +bicycle's +bicycles +bigot +bigot's +bigoted +bigotry +bigotry's +billfold +billfold's +billion +billion's +billions +bills +bin +bin's +binding's +biochemistry +biochemistry's +biography +biography's +biological +biologist +biologist's +biologists +bird +bird's +birds +birth +birth's +birthday +birthday's +biscuit +biscuits +bishop +bishop's +bitmap +bitter +blackboard +blackboard's +blackmail +blackmail's +blacks +blade +blade's +blades +blamed +blames +blaming +blanket +blanket's +blanks +blast +blast's +blasted +blasting +blasts +blatant +blatantly +bless +blessed +blesses +blessing +blew +blind +blindly +blink +bliss +bliss's +blob +blob's +blocked +blocking +blocks +blood +blood's +bloody +blowing +blowing's +blown +blows +blues +blurb +blurb's +boats +bob +bobs +bog +bog's +bogged +bogging +boggle +boggles +bogs +bogus +boil +boiled +boiling +boils +bold +bolt +bolt's +bomb +bombed +bombing +bombs +bond +bond's +bone +bone's +bones +bonus +bonus's +booked +booking +booking's +booklet +booklet's +bookshop +bookshops +bookstore +boom +boost +boost's +boots +border +border's +borderline +borderline's +bored +boredom +boredom's +bores +boring +boring's +born +borrowing's +boss +boss's +bottles +bounce +boundaries +boundary +boundary's +bounds +bout +bout's +bow +bowl +bowl's +boys +bracket's +bracketed +bracketing +brain +brain's +brains +brake +brake's +brakes +branded +branding +brands +brass +brass's +brave +bread +bread's +breakdown +breakdown's +breakfast +breakfast's +breath +breath's +breathe +breathed +breathes +breathing +breathing's +bred +breed +breeding +breeding's +breeds +breeze +breeze's +brethren +brick +brick's +bricks +bridges +brigade +brigade's +brighter +brightest +brightly +brightness +brightness's +brilliant +brilliantly +broad +broadly +brothers +browse +browsed +browses +browsing +brush +brush's +brutal +bubble +bubble's +buck +buck's +bucks +buffered +buffering +buffers +bugger +bugger's +buggers +bulb +bulb's +bulbs +bull +bull's +bullet +bullets +bump +bunch +bunch's +bundle +bundle's +burden +burden's +bureaucracy +bureaucracy's +burn +burned +burning +burns +burnt +burst +bursting +bursts +buses +bush +bush's +businesses +buss +bust +bust's +butter +butter's +buttons +buyer +buyers +bye +bye's +bypass +bypass's +byte's +cabbage +cabbage's +cabinet +cabinet's +cable +cable's +cabled +cables +cabling +caffeine +caffeine's +caf +cage +cage's +cake +cake's +cakes +calculated +calculates +calculating +calculation's +calculator +calculator's +calculus +calculus's +calendar +calendar's +caller +caller's +calm +cam +cam's +camera +camera's +cameras +camp +camp's +campaigned +campaigning +campaigns +camps +campus +campus's +can's +cancel +cancels +cancer +cancer's +candidates +canonical +cans +cant +cant's +cap +cap's +capabilities +capability +capability's +capitalism +capitalism's +capitalist +capitalist's +capitals +caps +capture +captured +captures +capturing +carbon +carbon's +cared +career +career's +careers +careless +caring +carpet +carpet's +carriage +carriage's +carrier +carrier's +carrot +carrot's +carrots +cars +cartoon +cartoon's +cartoons +cartridge +cartridge's +cartridges +cased +cash +cash's +casing +casing's +cassettes +cast +casting +casting's +castle +castle's +casts +casual +catastrophic +categorically +cater +catered +catering +catering's +caters +cathedral +cathedral's +catholic +cats +cattle +cattle's +causal +causality +causality's +caution +caution's +cave +cave's +caveat +caveat's +ceased +ceases +ceasing +ceiling +ceiling's +celebrate +celebrated +celebrates +celebrating +celebration +celebration's +cells +cellular +censor +censor's +censored +censoring +censors +censorship +censorship's +centrally +centuries +ceremony +ceremony's +certainty +certainty's +certificate +certificate's +chains +chairs +chalk +chalk's +challenge +challenged +challenges +challenging +chamber +chamber's +champagne +champagne's +champion +champion's +chancellor +chancellor's +changeover +changeover's +chaotic +chap +chapel +chapel's +chaps +chapters +characteristic +characteristic's +characteristics +charitable +charities +charity +charity's +charm +charm's +charmed +charming +charms +chart +chart's +charter +charter's +charts +chase +chased +chases +chasing +chasing's +chat +chat's +chats +chatted +chatting +cheaply +cheat +cheated +cheating +cheats +cheek +cheek's +cheer +cheerful +cheers +cheese +cheese's +chemicals +chemist +chemist's +chemistry +chemistry's +chemists +chess +chess's +chest +chest's +chestnut +chestnut's +chew +chewed +chewing +chews +chicken +chicken's +chickens +chief +chief's +childhood +childhood's +childish +chocolate +chocolate's +choices +choir +choir's +chop +chopped +chopping +chops +choral +chord +chord's +chorus +chorus's +chuck +chucked +chucking +chucks +chunk +chunk's +chunks +churches +cider +cider's +cigarette +cigarette's +cinema +cinema's +circa +circles +circuitry +circuitry's +circuits +circular +circulate +circulated +circulates +circulating +circumstance's +cite +cited +cites +cities +citing +citizens +civil +civilian +civilian's +clarification +clarification's +clarified +clarifies +clarifying +clarity +clarity's +clash +clashes +classed +classic +classical +classics +classics's +classification +classification's +classified +classifies +classify +classifying +classing +clause +clause's +clauses +cleaned +cleaner +cleaner's +cleaners +cleanest +cleaning +cleaning's +cleanly +cleans +clearance +clearance's +clearing's +cleverer +cleverest +clich +clich's +click +click's +client +client's +clients +cliff +cliff's +climate +climate's +climb +climbed +climbing +climbs +clinic +clinic's +clinical +clip +clipped +clipping +clipping's +clips +clique +clique's +clocks +clog +clone +clone's +clones +closet +closet's +closure +closure's +cloth +cloth's +clothe +clothed +clothes +clothing +clothing's +cloud +cloud's +clouds +clubs +clues +clumsy +cluster +cluster's +clusters +coach +coach's +coal +coal's +coarse +coast +coast's +coat +coat's +coats +cobbler +cobblers +coding's +coherent +coin +coin's +coincide +coincidence +coincidence's +coined +coining +coins +coke +coke's +collaboration +collaboration's +collapsed +collapses +collapsing +collar +collar's +collate +collated +collates +collating +colleague +colleague's +colleagues +collections +collective +colon +colon's +colony +colony's +columns +combat +combat's +comedy +comedy's +comfort +comfort's +comfortable +comfortably +comic +comics +comma +comma's +commandment +commandments +commas +commence +commentary +commentary's +commentator +commentators +commercially +commissioned +commissioning +commissions +commit +commitments +commits +committed +committees +committing +commodity +commodity's +commons +commons's +communal +communicated +communicates +communicating +communication's +communism +communism's +communist +communist's +communists +communities +compact +companies +companion +companion's +comparative +comparisons +compassion +compassion's +compel +compelled +compelling +compelling's +compels +compensate +compensation +compensation's +compete +competed +competence +competence's +competent +competes +competing +competitive +competitor +competitors +compilation +compilation's +compile +compiled +compilers +compiles +compiling +complacent +complement +complement's +complementary +completeness +completeness's +completion +completion's +complication +complications +compliment +compliment's +comply +composer +composer's +composers +composite +compound +compound's +comprehend +comprehensible +comprehension +comprehension's +compress +compressed +compresses +compressing +compression +compression's +comprise +comprised +comprises +comprising +compulsion +compulsion's +computation +computation's +computational +con +con's +concatenate +concatenated +concatenates +concatenating +conceal +concealed +concealing +conceals +concede +conceivable +conceivably +conceive +conceived +conceives +conceiving +concentrate +concentrated +concentrates +concentrating +concentration +concentration's +conception +conception's +concepts +conceptual +concert +concert's +concerto +concerto's +concerts +concise +conclude +concluded +concludes +concluding +conclusions +concur +concurrently +condemn +condemnation +condemnation's +condemned +condemning +condemns +condense +condensed +condenses +condensing +conditional +conditioned +conditioning +conditioning's +condom +condom's +condone +conduct +conduct's +conducted +conducting +conductor +conductor's +conducts +conferences +confess +confidence +confidence's +confidential +confidentiality +confidentiality's +configuration +configuration's +configurations +configure +configured +configures +configuring +confine +confined +confines +confining +confirmation +confirmation's +conflict +conflict's +conflicted +conflicting +conflicts +conform +confront +confronted +confronting +confronts +congest +congested +congesting +congestion +congestion's +congests +congratulate +congratulations +conjecture +conjecture's +conjunction +conjunction's +connector +connector's +connotation +connotations +conscience +conscience's +conscious +consciously +consciousness +consciousness's +consecutive +consensus +consensus's +consent +consented +consenting +consents +consequent +conservation +conservation's +conservative +conservatives +considerate +considerations +consisted +consistently +consisting +consolation +consolation's +console +conspicuous +conspiracy +conspiracy's +constantly +constants +constituency +constituency's +constituent +constituents +constitute +constitutes +constitution +constitution's +constitutional +constrain +constrained +constraining +constrains +constructed +constructing +construction +construction's +constructions +constructive +constructs +consult +consultancy +consultant +consultant's +consultants +consultation +consultation's +consulted +consulting +consults +consume +consumed +consumer +consumer's +consumes +consuming +contacted +contacting +contacts +container +container's +contemplate +contemplated +contemplates +contemplating +contemporary +contempt +contempt's +contend +contention +contention's +contentious +contest +contest's +contexts +continent +continent's +continental +continual +continuations +continuity +continuity's +continuum +continuum's +contour +contour's +contraception +contraception's +contracted +contracting +contracts +contradict +contradicted +contradicting +contradiction +contradiction's +contradictory +contradicts +contravention +contravention's +contributed +contributes +contributing +contribution's +contributor +contributor's +contributors +contrive +contrived +contrives +contriving +controller +controller's +controllers +controversial +controversy +controversy's +convenience +convenience's +conveniently +conversations +converse +conversely +conversion +conversion's +conversions +converted +converter +converter's +converting +converts +convey +convict +convicted +convicting +conviction +conviction's +convictions +convicts +convincingly +cook +cook's +cooked +cookie +cookies +cooking +cooking's +cooks +cool +cooled +cooling +cools +cooperate +cooperation +cooperation's +coordinate +coordinates +coordination +coordination's +coped +copes +coping +coping's +copper +copper's +copyright +copyright's +corn +corn's +corporate +corporation +corporation's +corpse +corpse's +corpses +corrections +correlate +correlation +correlation's +correspond +corresponded +correspondence +correspondence's +correspondent +correspondent's +corresponding +corresponds +corridor +corridor's +corruption +corruption's +cosmic +cosmology +cosmology's +costly +cotton +cotton's +cough +councils +counsel +counsels +counterexample +counterpart +counterparts +countless +countries +countryside +countryside's +coupled +couples +coupling +courage +courage's +courier +courier's +courtesy +courtesy's +courts +cousin +cousin's +coverage +coverage's +cow +cow's +cows +crack +cracked +cracking +cracks +craft +craft's +cramp +cramped +cramping +cramps +crap +crap's +crass +crawl +crawled +crawling +crawls +cream +cream's +creative +creator +creator's +creatures +credibility +credibility's +credible +credits +creed +creed's +creep +crew +crew's +cricket +cricket's +cried +cries +crime +crime's +crimes +criminal +criminal's +criminals +criteria +criterion +criterion's +critic +criticisms +critics +crop +crop's +crops +crossed +crosses +crossing +crossing's +crossroad +crossroads +crossroads's +crossword +crowd +crowd's +crowded +crowding +crowds +crown +crown's +crucial +crude +cruel +cruelty +cruelty's +cruise +cruised +cruises +cruising +crunch +crunched +crunches +crunching +crush +crushed +crushes +crushing +crying +cryptic +crystal +crystal's +crystals +cube +cube's +cubic +cuckoo +cuckoo's +cuddly +cue +cue's +culprit +culprit's +cult +cult's +cultural +cultures +cumbersome +cumulative +cunning +cupboard +cupboard's +cups +cured +cures +curing +curiosity +curiosity's +curiously +curly +currency +currency's +curriculum +curriculum's +curry +curry's +curse +curse's +curtain +curtain's +curtains +curve +curve's +curves +custard +custard's +custom +custom's +customary +customers +customs +cute +cycled +cycling +cycling's +cyclist +cyclists +cylinder +cylinder's +cynic +cynic's +cynical +daft +damn +damnation +damnation's +damned +damning +damns +damp +dance +danced +dances +dancing +dangerously +dangers +dared +dares +daring +darkness +darkness's +darling +darling's +dash +dashed +dashes +dashing +databases +daughter +daughter's +dawn +dawn's +daylight +daylight's +daytime +daytime's +deadline +deadline's +deadly +deaf +dealer +dealer's +dealers +deaths +debatable +debated +debates +debating +debt +debt's +debug +debugged +debugger +debugging +debugs +decades +decay +decimal +decimal's +deck +deck's +declaration +declaration's +declarations +decline +declined +declines +declining +decode +decoded +decodes +decoding +decreased +decreases +decreasing +deduced +deduces +deducing +deduction +deduction's +deductions +deed +deed's +deeds +deeper +deepest +defaults +defeat +defeated +defeating +defeats +defect +defect's +defective +defects +defend +defended +defending +defends +deficiencies +deficiency +defy +degenerate +degradation +degradation's +degrade +degraded +degrades +degrading +deity +deity's +delayed +delaying +delays +deletion +deletion's +delicate +delicious +delight +delighted +delightful +delighting +delights +delimiters +delta +delta's +delusion +delusion's +demanded +demanding +demented +demise +demise's +democracy +democracy's +democratically +demolish +demolished +demolishes +demolishing +demonstrated +demonstrates +demonstrating +demonstrations +denied +denies +denominator +denominator's +denote +denotes +dense +density +density's +dentist +dentist's +deny +denying +departmental +departments +departure +departure's +dependence +dependence's +deposit +depress +depressed +depresses +depressing +depression +depression's +deprive +deprived +deprives +depriving +depths +deputy +deputy's +derange +deranged +deranges +deranging +derivative +derogatory +descend +descended +descending +descends +descriptive +desert +desert's +deserted +deserting +deserts +deserve +deserved +deserves +deserving +designate +designated +designates +designating +designer +designer's +designers +desktop +despair +desperately +despise +destination +destination's +destine +destined +destines +destining +destruction +destruction's +destructive +detach +detached +detaches +detaching +detectable +detection +detection's +detective +detective's +detector +detector's +deter +determination +determination's +deterrent +deterrent's +detract +devastate +devastated +devastates +devastating +developer +developers +developments +deviation +deviation's +devil +devil's +devious +devise +devised +devises +devising +devoid +diagnosis +diagnosis's +diagnostic +diagnostics +diagnostics's +diagonal +diagram +diagram's +diagrams +dial +dial's +dialect +dialect's +dialects +dials +diameter +diameter's +diary +diary's +dice +dictate +dictator +dictator's +dictatorship +dictatorship's +dictionaries +dies's +diesel +diesel's +diet +diet's +differed +differential +differentiate +differing +differs +dig +digest +digging +digit's +dignity +dignity's +digs +dilemma +dilemma's +dim +dimension +dimension's +dimensional +dimensions +dine +dined +diner +dines +dining +dip +diplomatic +dire +directive +directive's +directives +directories +directors +dirt +dirt's +disable +disabled +disables +disabling +disadvantages +disagreed +disagreeing +disagreement +disagreement's +disagrees +disappoint +disappointed +disappointing +disappointment +disappointment's +disappoints +disasters +disastrous +discard +discarded +discarding +discards +discharge +disciplinary +disclaimer +disclaimer's +disco +disco's +disconnect +disconnected +disconnecting +disconnects +discontinue +discontinued +discontinues +discontinuing +discounts +discoveries +discovery +discovery's +discrepancy +discrepancy's +discrete +discretion +discretion's +discriminate +discriminated +discriminates +discriminating +discrimination +discrimination's +disease +disease's +diseases +disguise +disguised +disguises +disguising +disgust +disgusted +disgusting +disgusts +dish +dish's +dishes +dishonest +disliked +dislikes +disliking +dismal +dismiss +dismissed +dismisses +dismissing +disorder +disorder's +disposable +disposal +disposal's +dispose +disposed +disposes +disposing +disposition +disposition's +dispute +disregard +disrupt +disruption +disruption's +dissertation +dissertation's +dissimilar +distances +distasteful +distinctions +distinctive +distinguished +distinguishes +distinguishing +distort +distorted +distorting +distortion +distortion's +distorts +distract +distracted +distracting +distracts +distress +distressed +distresses +distressing +disturbance +disturbance's +ditch +ditch's +dive +dived +diverse +diversity +diversity's +divert +diverted +diverting +diverts +dives +divine +diving +divisions +divorce +divorce's +doctor +doctor's +doctors +doctrine +doctrine's +documentary +dodge +dogma +dogma's +dogs +dole +dole's +dollars +domestic +dominant +dominate +dominated +dominates +dominating +don +donate +donated +donates +donating +donation +donation's +donations +dons +doom +doom's +doomed +dooming +dooms +dose +dose's +doses +dot +dot's +dots +dotted +dotting +doubled +doubles +doubling +doubtless +doubts +downhill +downright +downstairs +downwards +drag +drag's +dragged +dragging +dragon +dragon's +drags +drain +drain's +drained +draining +drains +drama +drama's +dramatic +dramatically +drank +drastically +drawback +drawback's +drawbacks +drawings +dread +dreaded +dreadful +dreading +dreads +dreaming +dreams +dreary +dress +dressed +dresses +dressing +dressing's +dried +dries +drift +drill +drill's +drinking +drinks +drip +dripped +dripping +dripping's +drips +drivel +drown +drowned +drowning +drowns +drug +drug's +drugs +drum +drum's +drums +drunk +drunken +drying +dual +duck +duck's +ducks +duff +duff's +dug +dull +duly +dummy +dummy's +dumped +dumping +dumps +dumpster +duplicate +duplicated +duplicates +duplicating +duplication +duplication's +duration +duration's +dust +dust's +dustbin +dustbin's +dusty +duties +dynamic +dynamically +dynamics +dynamics's +eager +eager's +eagerly +eagle +eagle's +ear +ear's +earn +earned +earning +earning's +earns +ears +eastern +eater +eater's +eccentric +echo +echo's +echoed +echoes +echoing +ecological +ecology +ecology's +economical +economically +economics +economics's +economies +edges +editions +editorial +educate +educated +educates +educating +effectiveness +effectiveness's +efficiency +efficiency's +efficiently +egg +egg's +eggs +ego +ego's +egos +eh +eighteen +eighteen's +eighth +elaborate +elderly +elections +electoral +electorate +electorate's +electrical +electricity +electricity's +electron +electron's +electronically +elegant +elementary +elephant +elephant's +elephants +elevators +eleven +eleven's +eligible +eliminate +eliminated +eliminates +eliminating +elite +elite's +elitist +elitist's +em +em's +embarrassment +embarrassment's +embed +embedded +embedding +embeds +emerge +emerged +emerges +emerging +eminent +eminently +emit +emotion +emotion's +emotional +emotionally +emotions +empire +empire's +empirical +employ +employed +employees +employer +employer's +employers +employing +employment +employment's +employs +emptied +empties +emptying +emulate +emulation +emulation's +emulator +emulator's +emulators +enabled +enabling +enclose +enclosed +encloses +enclosing +encode +encoded +encodes +encoding +encouragement +encouragement's +endings +endless +endlessly +enemies +energy +energy's +enforce +enforced +enforces +enforcing +engage +engaged +engages +engaging +engine +engine's +engines +enhance +enhanced +enhancement +enhancement's +enhances +enhancing +enjoyable +enjoyed +enjoying +enjoyment +enjoyment's +enjoys +enlarge +enlarged +enlarges +enlarging +enlighten +enlightened +enlightening +enlightenment +enlightenment's +enlightens +enormously +entail +entails +enterprise +enterprise's +entertain +entertained +entertaining +entertainment +entertainment's +entertains +enthusiasm +enthusiasm's +enthusiastic +entirety +entirety's +entities +envelope +envelope's +envelopes +environmental +environments +envisage +envisaged +envisages +envisaging +envy +envy's +epic +epic's +episode +episode's +episodes +equality +equality's +equals +equate +equation +equation's +equations +equilibrium +equilibrium's +equip +equipped +equipping +equips +equivalents +era +era's +erase +erased +erases +erasing +ergo +erroneous +escaped +escapes +escaping +esoteric +essay +essay's +essays +essence +essence's +establishments +estate +estate's +estimated +estimates +estimating +estimation +estimation's +eternal +eternity +eternity's +ethic +ethical +ethics +ethnic +etymology +etymology's +evaluate +evaluated +evaluates +evaluating +evaluation +evaluation's +evenly +eventual +everyday +evident +evidently +evil +evils +evolution +evolution's +evolutionary +evolve +evolved +evolves +evolving +exaggerate +exaggerated +exaggerates +exaggerating +exam +exam's +examination +examination's +examiner +examiner's +exams +exceed +exceeded +exceeding +exceedingly +exceeds +excepted +excepting +exceptional +exceptionally +excepts +excessively +exchanged +exchanges +exchanging +excite +excited +excitement +excitement's +excites +exciting +exclamation +exclamation's +exclusion +exclusion's +exclusively +excuses +executable +execution +execution's +executive +executive's +exempt +exercised +exercises +exercising +exhaust +exhausted +exhausting +exhaustive +exhausts +exhibit +exhibition +exhibition's +exit +exit's +exited +exiting +exits +exotic +expectation +expectation's +expectations +expedition +expedition's +expenditure +expenditure's +expenses +experimentally +experimentation +experimentation's +experimented +experimenting +expertise +expertise's +expire +expired +expires +expiring +expiry +expiry's +explanations +explanatory +explicitly +explode +exploded +explodes +exploding +exploit +exploit's +exploitation +exploitation's +exploited +exploiting +exploits +exploration +exploration's +explore +explored +explores +exploring +explosion +explosion's +explosions +explosive +exponential +export +export's +expose +exposed +exposes +exposing +exposure +exposure's +expressions +expressway +expressway's +expressways +extant +extensions +extensively +extents +externally +extinction +extinction's +extracted +extracting +extraction +extraction's +extracts +extraneous +extraordinarily +extraordinary +extras +extremes +extremist +extremist's +eyesight +eyesight's +fabric +fabric's +faced +faces +facilitate +facing +facing's +factories +factory +factory's +factual +factually +faculties +faculty +faculty's +failures +faint +fainter +faintest +fairer +fairest +fairness +fairness's +fairy +fairy's +faithful +fake +fall's +fallacious +fallacy +fallacy's +fame +fame's +familiarity +familiarity's +families +famine +famine's +fans +fantasies +fantastic +fantasy +fantasy's +farce +farce's +fare +fare's +farewell +farewell's +farmer +farmers +fascinate +fascinated +fascinates +fascinating +fascist +fascist's +fashionable +fashioned +fashioning +fashions +fat +fat's +fathers +fatuous +faucet +faulty +feared +fearing +fears +feasibility +feasibility's +feat +feat's +featured +featuring +fee +fee's +feeble +feeding's +feelings +fees +fellow +fellow's +fellows +female +females +feminist +feminists +fence +fence's +fender +fender's +fenders +festival +festival's +fetch +fever +fever's +fiction +fiction's +fictional +fiddle +fiddle's +fiddled +fiddles +fiddling +fierce +fifteen +fifteen's +fifth +fifty +fifty's +fighter +fighter's +fighting +fights +figured +figuring +filmed +filming +films +filter +filter's +filtered +filtering +filters +filthy +finals +finance +finance's +finances +financially +findings +fined +finer +fines +finest +fining +fired +fires +firework +fireworks +firing +firing's +firms +fished +fishing +fishing's +fiver +fiver's +fixing's +fizzy +flagged +flagging +flags +flame +flame's +flames +flash's +flaw +flaw's +flawed +flawing +flaws +fleet +fleet's +flesh +flesh's +flexibility +flexibility's +flip +flipped +flipping +flips +flood +flood's +flooded +flooding +floods +floors +floppy +flour +flour's +flowed +flower +flower's +flowers +flowing +flows +fluctuation +fluctuations +fluent +fluffy +fluid +fluid's +flush +flushed +flushes +flushing +flute +flute's +foam +foam's +focus +focus's +fog +fog's +fold +folded +folder +folder's +folders +folding +folds +folk's +follower +followers +fond +fond's +font +font's +fonts +foods +fool +fool's +fooled +fooling +foolish +fools +football +football's +footnote +footnote's +footnotes +forbade +forbid +forbidden +forbidding +forbids +forcibly +forecast +forecasting +forecasts +foreigner +foreigners +foreseeable +forest +forest's +forests +forgave +forgive +forgiven +forgives +forgiving +fork +fork's +formally +formation +formation's +formats +formatted +formatting +formerly +formula +formula's +formulation +formulation's +fortnight +fortnight's +fortunate +forty +forty's +forum +forum's +forwarded +forwarding +forwarding's +forwards +fossil +fossil's +fought +foul +foundation +foundation's +foundations +founded +founding +founds +fountain +fountain's +fourteen +fourteen's +fractions +fragile +fragment +fragment's +fragments +frames +framework +framework's +frank +frankly +frantic +fraud +fraud's +freak +freak's +freaks +freed +freeing +frees +freeway +freeway's +freeways +freeze +freezes +freezing +frequencies +frequency +frequency's +friction +friction's +fried +friendship +friendship's +frighten +frightened +frightening +frightens +fringe +fringe's +frivolous +frog +frog's +frogs +frown +frowned +frowning +frowns +froze +frozen +fruit +fruit's +fruits +frustrate +frustrated +frustrates +frustrating +frustration +frustration's +frying +fudge +fudge's +fuel +fuel's +fulfilled +fulfilling +fuller +fuller's +fullest +fume +fumes +functional +functionality +functioned +functioning +fundamentalist +fundamentalist's +funded +funding +funeral +funeral's +funnier +funniest +fur +fur's +furniture +furniture's +furry +furthermore +fuse +fuse's +fusion +fusion's +fuss +fuss's +fussy +futile +fuzzy +galactic +galaxy +galaxy's +gang +gang's +gaps +garage +garage's +garble +garbled +garbles +garbling +gardens +gas's +gasoline's +gasp +gate +gate's +gates +gateway +gateway's +gathered +gathering +gathering's +gathers +gay +gear +gear's +geared +gearing +gears +gender +gender's +gene +gene's +generations +generator +generator's +generators +generic +generous +genes +genetic +genetically +genetics +genetics's +genius +genius's +genocide +genocide's +genre +genre's +gentle +gentleman +gentleman's +gentlemen +gently +genuinely +geographical +geography +geography's +geology +geology's +geometry +geometry's +gesture +gesture's +ghastly +ghost +ghost's +giant +giant's +gibberish +gibberish's +gift +gift's +gifts +gig +gig's +gin +gin's +girlfriend +girlfriend's +girls +gladly +glance +glasses +glean +gleaned +gleaning +gleans +globally +glorious +glory +glory's +glossy +glove +gloves +glow +glow's +glowed +glowing +glows +glue +glue's +gnome +gnome's +goal +goal's +goals +goat +goat's +god +god's +gods +gold +gold's +golden +goldfish +goldfish's +goldfishes +golf +golf's +goodbye +goodbye's +goodies +goodness +goodness's +goody +gorgeous +gospel +gospel's +gossip +gossip's +govern +governed +governing +governments +governs +gown +gown's +grab +grabbed +grabbing +grabs +grace +grace's +grade +grade's +grades +gradual +graduated +graduates +graduating +graduation +graduation's +graffiti +graffito +grain +grain's +grammar +grammar's +grammatical +grandfather +grandfather's +grandmother +grandmother's +graphical +graphs +grasp +grass +grass's +gratefully +gratuitous +gratuitously +gravitational +gravity +gravity's +greasy +greed +greed's +greedy +grid +grid's +grief +grief's +grim +grip +grip's +grips +groan +groan's +grossly +grouped +grouping +grouping's +guarded +guarding +guards +guest +guest's +guests +guidance +guidance's +guided +guideline +guidelines +guides +guiding +guilt +guilt's +guilty +guinea +guinea's +guitar +guitar's +gulf +gulf's +gullible +gum +gum's +guns +gut +gut's +guts +gutter +gutter's +guys +ha +hacked +hacker +hacker's +hackers +hacking +hacks +hail +hail's +haircut +haircut's +hairs +hairy +halls +halt +halt's +halted +halting +halts +halve +halves +halves's +ham +ham's +hammer +hammer's +handbook +handbook's +handful +handful's +handicap +handicap's +handler +handler's +hangover +hangover's +happier +happiest +happiness +happiness's +hardback +hardback's +harden +hardened +hardening +hardens +hardship +hardship's +hardy +harmony +harmony's +harsh +hash +hash's +hassle +hassle's +hasten +hasty +hated +hates +hating +hatred +hatred's +hats +havoc +havoc's +hay +hay's +hazard +hazard's +hazards +hazy +headache +headache's +headers +headline +headline's +headlines +heap +heap's +hearing's +heartily +hearts +heated +heating +heats +heaven +heaven's +heavens +heavier +heaviest +heel +heels +height +height's +heights +helicopter +helicopter's +helmet +helmet's +helpless +henceforth +herd +herd's +heresy +heresy's +heritage +heritage's +hero +hero's +heroes +heroic +heroin +heroin's +herring +herring's +herrings +hesitate +heterosexual +heterosexual's +hexadecimal +hey +hided +hideous +hideously +hiding's +hierarchical +hierarchy +hierarchy's +highlight +highlight's +highlighted +highlighting +highlights +highway +highway's +highways +hilarious +hills +hindsight +hindsight's +hinted +hinting +hip +hip's +hire +hired +hires +hiring +historian +historians +historic +historically +hitherto +ho +hobby +hobby's +hog +hog's +holder +holder's +holders +hollow +holy +homes +homosexual +homosexual's +homosexuality +homosexuality's +honestly +honesty +honesty's +honey +honey's +honorary +hook +hook's +hooked +hooking +hooks +hopeful +hopeless +hopelessly +horde +hordes +horizon +horizon's +horizontal +horizontally +horn +horn's +horrendous +horrendously +horribly +horrid +horrific +horrified +horrifies +horrify +horrifying +horror +horror's +hospitals +hostile +hosts +housed +household +household's +houses +housing +housing's +hugely +huh +hum +humane +humanity +humanity's +humans +humble +humbly +humorous +hungry +hunted +hunting +hunting's +hunts +hurt +hurting +hurts +hut +hut's +hydrogen +hydrogen's +hyphen +hyphen's +hypocrisy +hypocrisy's +hypocrite +hypocrite's +hypocritical +hypothesis +hypothesis's +hypothetical +hysterical +icon +icon's +icons +id +id's +idealistic +ideally +ideals +identically +identification +identification's +identified +identifier +identifier's +identifiers +identifies +identifying +ideological +ideology +ideology's +idiom +idiom's +idiosyncratic +idiot +idiot's +idiotic +idiots +idle +ignorance +ignorance's +ignorant +illegally +illiterate +illness +illness's +illogical +illusion +illusion's +illustrate +illustrated +illustrates +illustrating +illustration +illustration's +illustrations +imaginary +imaginative +imagined +imagines +imagining +imbalance +imbalance's +immature +immense +immensely +imminent +immoral +immortal +immune +impair +impaired +impairing +impairs +impend +impended +impending +impends +imperative +imperfect +imperial +impersonal +implausible +implementation +implementation's +implementations +implication's +implicit +implicitly +import +imported +importing +imports +impractical +impress +impressed +impresses +impressing +impressions +impressive +imprison +imprisoned +imprisoning +imprisons +improbable +impulse +impulse's +inaccessible +inaccuracies +inaccuracy +inaccurate +inadvertently +inane +inappropriate +incapable +incarnation +incarnation's +incentive +incentive's +incidence +incidence's +incidental +incidents +inclination +inclination's +inclusion +inclusion's +inclusive +incoherent +incoming +incompetence +incompetence's +incompetent +incomprehensible +inconsistencies +inconsistency +inconsistency's +inconvenienced +inconveniences +inconveniencing +inconvenient +incorporate +incorporated +incorporates +incorporating +incorrectly +increasingly +incredible +incredibly +increment +increment's +incur +incurred +incurring +incurs +indefensible +indefinite +indefinitely +indent +independence +independence's +indeterminate +indexed +indexes +indexing +indicated +indicating +indications +indicative +indicator +indicator's +indicators +indictment +indictment's +indirect +indirection +indirection's +indirectly +indistinguishable +induce +induced +induces +inducing +induction +induction's +indulge +indulged +indulges +indulging +industries +ineffective +inefficiency +inefficiency's +inefficient +inequality +inequality's +inertia +inertia's +inevitable +inexperienced +infallible +infamous +infant +infant's +infantile +infect +infected +infecting +infection +infection's +infects +infelicity +infelicity's +infer +inference +inference's +inferiority +inferiority's +infinitely +infinity +infinity's +inflation +inflation's +inflexible +inflict +influenced +influences +influencing +influential +informal +informally +informative +infrastructure +infrastructure's +infrequent +infringement +infringement's +ingenious +ingredient +ingredients +inhabit +inhabitant +inhabitants +inhabited +inhabiting +inhabits +inherent +inherently +inherit +inheritance +inheritance's +inherited +inheriting +inherits +inhibit +inhibited +inhibiting +inhibition +inhibition's +inhibits +initiate +initiated +initiates +initiating +initiative +initiative's +inject +injure +injured +injures +injuries +injuring +injury +injury's +injustice +injustice's +ink +ink's +innocence +innocence's +innovation +innovation's +innovative +insane +insect +insect's +insects +insecure +insensitive +insertion +insertion's +insidious +insight +insight's +insignificant +insistence +insistence's +insofar +inspect +inspected +inspecting +inspection +inspection's +inspects +inspiration +inspiration's +inspire +inspired +inspires +inspiring +installation +installation's +installations +instances +instinct +instinct's +institute +instruct +instructed +instructing +instructs +instrument +instrument's +instrumental +instruments +insufficient +insult +insulted +insulting +insults +intact +intake +intake's +integrate +integrated +integrates +integrating +integration +integration's +integrity +integrity's +intellect +intellect's +intellectual +intense +intensely +intensity +intensity's +intensive +intent +intent's +intentional +intentionally +intentions +inter +interacted +interacting +interaction +interaction's +interactions +interactive +interactively +interacts +intercourse +intercourse's +interestingly +interfaced +interfaces +interfacing +interfacing's +interfere +interfered +interference +interference's +interferes +interfering +interim +interior +interior's +intermediate +intermittent +internally +internals +interpretations +interpreter +interpreter's +interrogate +interrupt +interrupted +interrupting +interruption +interruption's +interruptions +interrupts +intersection +intersection's +intersections +interval's +intervene +intervened +intervenes +intervening +interview +interview's +interviewed +interviewing +interviews +intimate +intolerance +intolerance's +intrinsic +intrinsically +introductory +intuitive +invade +invaded +invades +invading +invalidate +invaluable +invasion +invasion's +invention +invention's +inventions +inventor +inventor's +inverse +invert +inverted +inverting +inverts +invest +investigated +investigates +investigating +investigation +investigation's +investigations +investment +investment's +invoke +invoked +invokes +invoking +involvement +involvement's +ion +ion's +irate +iron +iron's +ironic +irony +irony's +irrational +irrespective +irresponsible +irritation +irritation's +island +island's +islands +isolation +isolation's +jack +jack's +jacket +jacket's +jackets +jail +jail's +jam +jammed +jamming +jams +jargon +jargon's +jazz +jazz's +jealous +jeans +jellies +jelly +jerk +jest +jest's +jet +jet's +jointly +joints +joked +jokes +joking +jolly +journal +journal's +journalist +journalists +journals +journey +journey's +judged +judges +judging +juice +juice's +jumped +jumping +junction +junction's +jungle +jungle's +junior +jury +jury's +justice +justice's +justifiable +justifiably +juvenile +keeper +keeper's +ken +ken's +kernel +kernel's +kettle +kettle's +keyboards +keyed +keying +keystroke +keystroke's +keystrokes +keyword +keyword's +keywords +kick +kicked +kicking +kicks +kidded +kidding +kidding's +kidnap +kidnapped +kidnapping +kidnaps +kidney +kidney's +kids +killer +killer's +kindness +kindness's +kingdom +kingdom's +kings +kiss +kit +kit's +kitchen +kitchen's +kits +knee +knee's +knees +knife +knife's +knight +knight's +lab +labs +lad +lad's +ladder +ladder's +lag +lager +lager's +laid +lake +lake's +lamp +lamp's +landlord +landlord's +landscape +landscape's +lane +lane's +lark +lark's +laser +laser's +lasers +lasted +lasting +lately +laugh +laughed +laughing +laughing's +laughs +laughter +laughter's +launch +launched +launches +launching +lavatory +lavatory's +lawn +lawn's +lawyer +lawyer's +lawyers +layer +layer's +layers +laying +lays +laziness +laziness's +leaders +leadership +leadership's +leaf's +leaflet +leaflet's +leaflets +league +league's +leak +leak's +lean +leaned +leaning +leaning's +leans +leap +leather +leather's +lectured +lecturer +lecturer's +lecturers +lecturing +legend +legend's +legendary +legible +legislation +legislation's +legitimate +legitimately +leisure +leisure's +lemon +lemon's +lending +lends +lengths +lengthy +lenient +lens +lens's +lenses +lent +lesbian +lesbian's +lesson's +lest +lethal +liability +liability's +liaison +liaison's +libel +libel's +liberal +liberties +liberty +liberty's +librarian +librarian's +lid +lid's +lied's +lifestyle +lifted +lifting +lifts +lighted +lighter +lighter's +lightest +lighting +lighting's +lightly +lightning +lightning's +lightninged +lightnings +likelihood +likelihood's +liking's +limb +limbs +limitation +limitation's +limitations +lined +linguistic +lining +lining's +linkage +linkage's +lion +lion's +lip +lips +liquid +liquid's +liquor +lisp +lisp's +listened +listener +listener's +listening +listens +listings +lit +literal +literary +literate +litter +litter's +lively +liver +liver's +livest +loader +loader's +loading's +loans +lobby +lobby's +locally +locals +locate +located +locates +locating +lodge +lodge's +logically +logo +logo's +lonely +loophole +loophole's +loops +loosely +lord +lord's +lords +lorries +losses +loud +louder +loudest +lousy +loved +lovely +lover +lover's +lovers +loves +loving +lowered +lowering +lowers +loyal +luckily +ludicrous +ludicrously +luggage +luggage's +lump +lump's +lumps +lunatic +lunchtime +lunchtime's +lung +lung's +lungs +lurk +lurked +lurking +lurks +lust +lust's +luxury +luxury's +lyric +lyrics +machinery +machinery's +macintosh's +madness +madness's +magazine +magazine's +magazines +magical +magnificent +mailbox +mailbox's +mailed +mailing +mails +mainframe +mainframes +mains +mains's +mainstream +mainstream's +maintenance +maintenance's +maize +maize's +maker +maker's +makers +male +males +malfunction +malicious +management +management's +managers +mandate +mandate's +mandatory +mangle +mangled +mangles +mangling +mania +mania's +manifestation +manifestation's +manifestly +manifesto +manifesto's +manipulate +manipulated +manipulates +manipulating +mankind +mankind's +manned +manning +manpower +manpower's +mans +manually +manufacture +manufactured +manufacturer +manufacturer's +manufacturers +manufactures +manufacturing +mapped +mapping +mapping's +maps +margin +margin's +marginal +marginally +margins +marital +marker +marker's +markers +marketed +marketing +marketing's +markets +marking's +married +marries +marrying +mask +mask's +masses +massively +masters +matched +matching +mate +mate's +mathematically +mathematician +mathematician's +mathematicians +matrices +matrix +matrix's +mature +mayor +mayor's +maze +maze's +meal +meal's +meals +meantime +meantime's +meanwhile +measurement +measurement's +measurements +meat +meat's +mechanical +mechanisms +medicine +medicine's +medieval +megabyte +megabytes +melody +melody's +melt +memorable +memories +mend +mended +mending +mends +mental +mentality +mentality's +mentally +menu +menu's +menus +mercury +mercury's +mercy +mercy's +merge +merged +merges +merging +merit's +merry +messed +messes +messing +metaphor +metaphor's +metric +metro +metro's +metros +mice +mice's +microcomputer +microcomputers +microprocessor +microprocessor's +microwave +microwave's +midday +midday's +mighty +migrate +migrated +migrates +migrating +migration +migration's +mild +mildly +mileage +mileage's +milk +milk's +mill +mill's +mimic +mindless +mined +mines +minimalist +minimalist's +mining +mining's +minister +minister's +ministers +minorities +mint +mint's +minus +miracle +miracle's +miracles +miraculous +mirror +mirror's +mirrors +miscellaneous +misdirect +misdirected +misdirecting +misdirects +miserable +miserably +misery +misery's +misfortune +misfortune's +misguide +misguided +misguides +misguiding +misinterpret +misinterpreted +misinterpreting +misinterprets +misplace +misplaced +misplaces +misplacing +misprint +misprint's +misread +misreading +misreads +misrepresent +misrepresented +misrepresenting +misrepresents +missile +missile's +missiles +mission +mission's +mist +mistakenly +mists +misunderstanding's +mixture +mixture's +mnemonic +moan +moan's +moaned +moaning +moans +mob +mob's +mobile +mock +moderate +moderately +moderation +moderation's +modes +modest +modification +modification's +modifications +module +module's +modules +mole +mole's +molecular +molecule +molecules +momentarily +moments +momentum +momentum's +monarch +monarch's +monitored +monitoring +monitors +monkey +monkey's +monkeys +monochrome +monochrome's +monopoly +monopoly's +monster +monster's +monsters +monthly +mood +mood's +moon +moon's +moons +morality +morality's +morally +morals +moreover +moron +moron's +morons +mortal +mortality +mortality's +mortals +mothers +motions +motivate +motivated +motivates +motivating +motivation +motivation's +motive +motive's +motives +motor +motor's +motors +motorway +motorway's +motorways +motto +motto's +mount +mountain +mountain's +mountains +mounted +mounting +mounting's +mounts +mouse +mouse's +movies +muck +muck's +mucked +mucking +mucks +mud +mud's +muddle +muddled +muddles +muddling +mug +mug's +mugs +multiples +multiplication +multiplication's +multiplied +multiplies +multiply +multiplying +mum +mum's +mumble +mummy +mummy's +mundane +murder +murder's +murdered +murderer +murderer's +murdering +murders +muscle +muscle's +muscles +museum +museum's +museums +musical +musician +musician's +musicians +mutter +muttered +muttering +mutters +mutual +mutually +mysteries +mysteriously +mystery +mystery's +mystic +mystic's +myth +myth's +mythical +mythology +mythology's +myths +nail +nail's +nailed +nailing +nails +naked +nameless +narrative +narrative's +narrow +narrower +narrowest +nastier +nastiest +nationally +nations +native +natives +nay +nay's +neat +neatly +needle +needle's +needles +needless +needlessly +negate +neglect +neglected +neglecting +neglects +negligible +negotiable +negotiate +negotiated +negotiates +negotiating +negotiation +negotiation's +negotiations +nerve +nerve's +nerves +nest +nest's +nested +nesting +nests +nets +networked +networking +neural +neutral +newcomer +newcomer's +newcomers +newer +newest +newly +newsletter +newsletter's +newsletters +newspaper +newspaper's +newspapers +nicely +nick +nick's +nicked +nicking +nickname +nickname's +nicknames +nicks +nightmare +nightmare's +nights +nil +nil's +noble +node +node's +nodes +noises +nominal +nominally +nominate +nominated +nominates +nominating +nonetheless +noon +noon's +norm +norm's +normality +normality's +northern +nose +nose's +noses +nostalgia +nostalgia's +notable +notably +notation +notation's +noticeable +noticeably +notification +notification's +notified +notifies +notifying +notion +notion's +notions +notorious +notwithstanding +noun +noun's +nouns +novels +novelty +novelty's +novice +novice's +novices +nuclear +nuisance +nuisance's +null +numbered +numbering +numeral +numerals +numeric +nun +nuns +nurse +nurse's +nurses +nut +nut's +nuts +oar +oar's +obeyed +obeying +obeys +objectionable +objective +obligation +obligation's +obligatory +oblige +obliged +obliges +obliging +obnoxious +obscene +obscured +obscures +obscuring +obscurity +obscurity's +observations +observer +observer's +observers +obsess +obsessed +obsesses +obsessing +obsession +obsession's +obsolete +obstruct +obstructed +obstructing +obstructs +obtainable +occupation +occupation's +occurrence +occurrence's +occurrences +ocean +ocean's +oddly +offend +offended +offender +offender's +offenders +offending +offends +offerings +offhand +officers +officially +officials +offset +offset's +offsets +offsetting +offspring +offspring's +omission +omission's +omissions +oneself +ongoing +onion +onion's +onus +onus's +onwards +openly +opera +opera's +operas +operational +opponent +opponent's +opponents +oppress +oppressed +oppresses +oppressing +oppression +oppression's +opt +opted +optic +optical +optimal +optimistic +optimum +optimum's +opting +optionally +opts +opus +opuses +oral +orange +orange's +orbit +orbit's +orbital +orbital's +orchestra +orchestra's +orchestral +organ +organ's +organic +organs +orient +oriental +orientate +orientated +orientates +orientating +orientation +orientation's +oriented +orienting +orients +originals +originate +originated +originates +originating +originator +originator's +origins +orthodox +outcome +outcome's +outcomes +outcry +outcry's +outdated +outgoing +outline +outline's +outlined +outlines +outlining +outlook +outlook's +outputs +outrage +outrage's +outraged +outrageous +outrages +outraging +outright +outset +outset's +outstanding +outweigh +outweighs +overcame +overcome +overcomes +overcoming +overdraft +overdraft's +overdue +overflow +overhead +overheads +overlap +overload +overloaded +overloading +overloads +overlong +overlook +overlooked +overlooking +overlooks +overly +overnight +overprice +overpriced +overprices +overpricing +overridden +override +overrides +overriding +overrode +overseas +overtime +overtime's +overtone +overtones +overview +overview's +overwhelm +overwhelmed +overwhelming +overwhelms +overwriting +overwritten +owned +ownership +ownership's +owning +owns +oxygen +oxygen's +ozone +ozone's +pace +pace's +pacifier +pacifier's +packaged +packaging +packaging's +packed +packets +packing +packing's +packs +pad +pad's +padded +padding +padding's +pads +paged +paging +painfully +painless +pains +paint +paint's +painted +painting +painting's +paintings +paints +palace +palace's +pale +pan +panel +panel's +panels +panic +panic's +pant +pants +paperback +paperback's +par +par's +parade +parade's +paradise +paradise's +paradox +paradox's +paragraphs +parallels +parameter +parameter's +parameters +paranoia +paranoia's +paranoid +paraphrase +paraphrase's +pardon +parentheses +parenthesis +parents +parity +parity's +parked +parking +parking's +parks +parliament +parliament's +parochial +parody +parody's +parrot +parrot's +parse +parsed +parses +parsing +participant +participants +participate +participated +participates +participating +particle +particle's +particles +partition +partition's +partitioned +partitioning +partitions +partner +partner's +partners +passage +passage's +passages +passenger +passenger's +passengers +passion +passion's +passionate +passive +passport +passport's +password +password's +passwords +paste +paste's +pat +patched +patches +patching +patent +patent's +pathetic +paths +patience +patience's +patients +paused +pauses +pausing +pavement +pavement's +payment +payment's +payments +peaceful +peaks +peanut +peanuts +peasant +peasants +pedal +pedal's +pedant +pedant's +pedantic +pedantry +pedantry's +pedants +pedestrian +pedestrian's +pedestrians +peer +peer's +peers +penalties +penalty +penalty's +pence +pence's +pencil +pencil's +pended +pending +pends +penguin +penguin's +pennies +penny +penny's +pens +peoples +perceive +perceived +perceives +perceiving +percent +percent's +percentage +percentage's +percents +perception +perception's +perfection +perfection's +performances +periodic +periodically +periods +peripheral +peripherals +permissible +perpetual +persecute +persecuted +persecutes +persecuting +persist +persistent +personalities +personality +personality's +personnel +personnel's +perspective +perspective's +persuasion +persuasion's +perverse +pet +pet's +petrol's +petty +pharmacies +pharmacy +pharmacy's +phased +phases +phasing +phenomena +phenomena's +phenomenons +philosopher +philosopher's +philosophers +philosophical +philosophies +phoenix +phoenix's +phoned +phones +phoning +photo +photo's +photocopy +photocopy's +photograph +photograph's +photographic +photographs +photos +phrased +phrasing +phrasing's +physic +physically +physicist +physicist's +physicists +physics +physiology +physiology's +piano +piano's +pie +pie's +pig +pig's +pigeon +pigeon's +pigs +piles +pill +pill's +pills +pilot +pilot's +pin +pin's +pinch +pinched +pinches +pinching +pink +pink's +pins +pints +pipeline +pipeline's +pipes +pit +pit's +pitch +pitfall +pitfalls +pity +pity's +pizza +pizza's +pizzas +plague +plague's +plagued +plagues +plaguing +plainly +planes +planetary +planets +planted +planting +plants +plaster +plaster's +plastered +plastering +plasters +plate +plate's +plates +platform +platform's +plausible +player +player's +players +playground +playground's +pleasantly +pleasure +pleasure's +plotted +plotter +plotter's +plotting +ploy +ploy's +plugged +plugging +plugs +plural +pockets +poems +poetic +poetry +poetry's +poets +pointer +pointer's +pointers +poison +poison's +poisoned +poisoning +poisoning's +poisons +poke +polar +pole +pole's +policeman +policeman's +polish +polished +polishes +polishing +polite +politeness +politeness's +politically +politician +politician's +politicians +politics +politics's +polls +pollution +pollution's +polynomial +pompous +poorer +poorest +poorly +pope +pope's +popped +popping +pops +populace +populace's +popularity +popularity's +populate +populated +populates +populating +populations +pork +pork's +pornography +pornography's +portability +portable +ported +porter +porter's +porters +porting +portion +portion's +portions +portray +portrayed +portraying +portrays +ports +pose +posed +poses +posing +positioned +positioning +positively +possess +possessed +possesses +possessing +possession +possession's +postage +postage's +postal +postcard +postcard's +poster +poster's +posters +postpone +postponed +postpones +postponing +postscript +postscript's +postulate +pot +pot's +potato +potato's +potatoes +pour +poured +pouring +pours +poverty +poverty's +powder +powder's +powered +powering +practicable +practicals +pragmatic +praise +praise's +pray +prayed +prayer +prayer's +prayers +praying +prays +preach +preached +preaches +preaching +precaution +precaution's +precautions +precede +preceded +precedence +precedence's +precedent +precedent's +precedes +preceding +precious +precision +precision's +predecessor +predecessor's +predecessors +predict +predictable +predicted +predicting +prediction +prediction's +predictions +predicts +predominantly +preface +preface's +preferences +prefix +prefix's +prefixed +prefixes +prefixing +pregnancy +pregnancy's +pregnant +prejudice +prejudice's +prejudiced +prejudices +prejudicing +preliminary +premature +prematurely +premise +premises +premium +premium's +prerequisite +prescribe +prescribed +prescribes +prescribing +prescription +prescription's +presentation +presentation's +presently +preserved +preserves +preserving +pressures +presumed +presumes +presuming +pretend +pretended +pretending +pretends +pretentious +prevail +prevalent +prevention +prevention's +preview +preview's +previewer +priced +pricing +pride +pride's +priest +priest's +priests +primarily +primes +primitives +prince +prince's +principal +principally +printouts +priorities +priority +priority's +prison +prison's +prisoner +prisoners +privacy +privacy's +privately +privilege +privilege's +privileged +privileges +privileging +pro +probabilities +probability +probability's +probable +procedures +proceed +proceeded +proceeding +proceeding's +proceedings +proceeds +proclaim +producer +producer's +producers +productive +productivity +productivity's +profession +profession's +professionals +professor +professor's +profile +profile's +profiles +profit +profit's +profitable +profits +profound +programmable +progressed +progresses +progressing +prohibit +prohibited +prohibiting +prohibits +projected +projecting +projection +projection's +proliferation +proliferation's +prolong +prolonged +prolonging +prolongs +prominent +promote +promoted +promotes +promoting +promotion +promotion's +prompted +prompting +prompts +pronoun +pronoun's +pronounce +pronounced +pronounces +pronouncing +pronunciation +pronunciation's +proofs +propaganda +propaganda's +prophet +prophet's +proportional +proportions +proposals +proposition +proposition's +proprietary +prose +prose's +prosecute +prosecuted +prosecutes +prosecuting +prosecution +prosecution's +prospective +prospects +prostitute +prostitutes +protein +protein's +protocol +protocol's +protocols +prototype +prototype's +proud +provision +provision's +provisional +provisions +provocative +provoke +provoked +provokes +provoking +proximity +proximity's +pseudo +psychological +psychologist +psychologists +psychology +psychology's +pub +pub's +publications +publisher +publisher's +publishers +publishing's +pudding +pudding's +pulp +pulp's +pulse +pulses +pump +pump's +pumped +pumping +pumping's +pumps +pun +pun's +punch +punched +punches +punching +punish +punished +punishes +punishing +punishment +punishment's +puns +punt +punt's +punts +pupil +pupils +purchased +purchases +purchasing +purge +purity +purity's +purple +purple's +pursue +pursued +pursues +pursuing +pursuit +pursuit's +puzzle +puzzled +puzzles +puzzling +python +python's +qualification +qualification's +qualifications +qualifier +qualifier's +qualifiers +qualities +quantum +quantum's +quarters +queen +queen's +queens +queries +query +query's +quest +quest's +questionable +questioned +questioning +questionnaire +questionnaire's +queued +queues +quibble +quieter +quieter's +quietest +quiz +quiz's +quota +quota's +quotas +quotation +quotation's +quotations +rabbit +rabbit's +rabbits +rabid +raced +races +racial +racing +racism +racist +racist's +rack +rack's +racket +racket's +racks +radar +radar's +radiation +radiation's +radical +radically +radios +radius +radius's +rag +rag's +rage +rage's +raid +raids +rail +rail's +railroad +railroad's +rails +railway +railway's +rainbow +rainbow's +rained +raining +rains +ram +ram's +rampant +rang +ranged +ranges +ranging +rank +rank's +ranks +rant +ranted +ranting +rants +rape +rape's +rarer +rarest +rash +rat +rat's +rated +rating +rating's +ratio +ratio's +rational +rationale +rationale's +rationally +ratios +rats +rattle +rattled +rattles +rattling +rave +raved +raves +raving +ray +ray's +razor +razor's +reacted +reacting +reactionary +reactions +reactor +reactor's +reacts +readership +readership's +readings +realistic +realm +realms +rear +rear's +rearrange +rearranged +rearranges +rearranging +reasoned +reasoning +reasoning's +reassure +reassured +reassures +reassuring +rebuild +rebuilding +rebuilds +rebuilt +recalled +recalling +recalls +receipt +receipt's +receiver +receiver's +recipe +recipe's +recipes +recipient +recipient's +recipients +reckless +reckon +reckoned +reckoning +reckons +reclaim +recollection +recollection's +recommendations +reconcile +reconsider +recorder +recorder's +recordings +recovery +recovery's +recreational +recruit +recruited +recruiting +recruitment +recruitment's +recruits +rectangle +rectangle's +rectangular +rectified +rectifies +rectify +rectifying +recursion +recursion's +recursive +recycle +recycled +recycles +recycling +redefine +redefined +redefines +redefining +redirect +reductions +redundancy +redundancy's +referenced +referencing +referendum +referendum's +refine +refined +refines +refining +reflex +reflex's +reform +reformat +reformed +reforming +reforms +refrain +refresh +refreshed +refreshes +refreshing +refund +refusal +refusal's +refute +regain +regime +regime's +regional +regions +registration +registration's +regrets +regrettably +regretted +regretting +regulation's +reign +reign's +reinstate +reinstated +reinstates +reinstating +reiterate +rejection +rejection's +relations +relationships +relatives +relativity +relativity's +relax +relaxed +relaxes +relaxing +relay +relay's +reliability +reliability's +reliably +relied +relief +relief's +relies +relieve +relieved +relieves +relieving +religions +relocation +relocation's +reluctance +reluctance's +reluctantly +relying +remainder +remainder's +remarkable +remarkably +remarked +remarking +remedy +remedy's +reminder +reminiscent +rename +renamed +renames +renaming +rend +render +rendered +rendering +rendering's +renders +rending +rendition +rendition's +rends +renew +renewed +renewing +renews +rent +rent's +repaired +repairing +repairs +repeatable +repent +repertoire +repertoire's +repetition +repetition's +repetitive +rephrase +replacements +reporter +reporter's +representations +representatives +reproduced +reproduces +reproducing +reproduction +reproduction's +repulsive +reputation +reputation's +requisite +reread +rereading +rereads +rescue +researcher +researchers +resemblance +resemblance's +resemble +resembled +resembles +resembling +resent +reservation +reservations +reset +resets +resetting +reside +residence +residence's +residents +resides +resign +resignation +resignation's +resigned +resigning +resigns +resist +resistance +resistance's +resolve +resolved +resolves +resolving +resorted +resorting +resorts +respectable +respected +respecting +respective +responded +responding +responds +responsibilities +restarted +restarting +restarts +restaurant +restaurant's +restaurants +rested +resting +restrain +restrained +restraining +restrains +restriction +restriction's +restrictions +restrictive +rests +resume +resumed +resumes +resuming +resurrection +resurrection's +retail +retail's +retained +retaining +retains +retire +retired +retirement +retirement's +retires +retiring +retract +retrieval +retrieval's +retrieve +retrieved +retrieves +retrieving +reuse +revelation +revelation's +revenge +revenge's +revenue +revenue's +reversed +reverses +reversing +revert +reviewed +reviewing +reviews +revise +revised +revises +revising +revision +revision's +revolt +revolted +revolting +revolts +revolution +revolution's +revolutionary +revolutionary's +reward +reward's +rewards +rewrites +rewriting +rewritten +rewrote +rhetorical +rhyme +rhyme's +rhythm +rhythm's +ribbon +ribbon's +rice +rice's +rich +richer +richest +ridden +rides +ridiculously +riding +riding's +rightly +rigid +rigorous +ringed +ringing +rings +riot +riot's +rip +ripped +ripping +rips +risen +rises +rising +rising's +risked +risking +risks +risky +ritual +ritual's +rituals +rival +rival's +rivals +rivers +roads +robot +robot's +robots +robust +rock +rock's +rocket +rocket's +rocks +rod +rod's +rode +roles +rolled +rolling +rolls +roman +romance +romance's +romantic +roof +roof's +roots +rope +rope's +rose +rose's +rot +rotate +rotated +rotates +rotating +rotation +rotation's +rotten +roundabout +roundabout's +rounded +rounding +rounds +rout +routed +routes +routinely +routines +routing +routing's +routs +rows +royal +royalties +rub +rude +ruin +ruin's +ruined +ruining +ruins +ruled +ruler +ruler's +rulers +ruling +ruling's +rung +rural +rushed +rushes +rushing +rushing's +rusty +sabotage +sabotage's +sack +sack's +sacked +sacking +sacks +sacred +sacrifice +sacrifice's +sacrificed +sacrifices +sacrificing +sadden +saddened +saddening +saddens +safeguard +safeguard's +safeguards +saga +saga's +sail +sail's +sailed +sailing +sailing's +sails +salaries +salary +salary's +salesman +salesman's +salt +salt's +salvation +salvation's +sampled +samples +sampling +sampling's +sand +sand's +sandwich +sandwich's +sandwiches +sane +sang +sanity +sanity's +sank +sarcasm +sarcasm's +sarcastic +satellite +satellite's +satellites +satire +satire's +satisfaction +satisfaction's +satisfactorily +satisfactory +sauce +sauce's +savings +scaled +scales +scaling +scandal +scandal's +scanned +scanner +scanner's +scanning +scans +scarce +scarcely +scare +scared +scares +scarf +scarf's +scaring +scarlet +scarlet's +scatter +scattered +scattering +scatters +scenario +scenario's +scenarios +scenery +scenery's +scenes +schedule +schedule's +scheduled +scheduler +schedules +scheduling +schemes +scholar +scholars +scientifically +scientist +scientist's +scientists +scope +scope's +scored +scored's +scoring +scotch +scotch's +scrapped +scrapping +scraps +scratched +scratches +scratching +scream +screamed +screaming +screams +screw +screw's +screwed +screwing +screws +scripts +scroll +scroll's +scrolled +scrolling +scrolls +scum +scum's +sea +sea's +seal +seal's +sealed +sealing +seals +seat +seat's +seats +seconded +seconding +secretaries +secretly +secrets +sect +sect's +sector +sector's +sects +secular +seed +seed's +seemingly +segment +segment's +segments +seldom +selective +selectively +selfish +semantic +semantics +semantics's +seminars +sender +sender's +sensation +sensation's +senses +sensitivity +sensitivity's +sentenced +sentencing +sentient +sentiment +sentiment's +sentimental +sentiments +separated +separates +separating +separation +separation's +separator +separator's +separators +sequel +sequel's +sequential +seriousness +seriousness's +sermon +sermon's +servant +servant's +servants +servers +serving's +settings +seventh +severity +severity's +sexes +sexist +sexist's +sexual +sexuality +sexuality's +sexually +sexy +shade +shade's +shades +shadow +shadow's +shake +shaken +shakes +shaking +shaking's +shaky +shallow +shaped +shapes +shaping +shareholder +shareholders +sharply +shed +shed's +shedding +sheds +sheep +sheep's +sheer +sheets +shells +shelter +shelter's +shelve +shelves +shelves's +shifted +shifting +shifts +shine +shined +shines +shining +shiny +shipped +shipping +shipping's +ships +shirt +shirt's +shock +shocked +shocking +shocks +shoe +shoe's +shoes +shone +shook +shooting +shoots +shorten +shortened +shortening +shortens +shorthand +shorthand's +shorts +shot +shot's +shots +shoulder +shoulder's +shoulders +shout +shout's +shouted +shouting +shouts +shove +shower +shower's +showers +shutdown +shutdown's +shy +sic +sick +sicken +sickened +sickening +sickens +sided +sideways +siding +sigh +sighted +sighting +sights +sigma +sigma's +signature +signature's +signatures +silence +silence's +silent +silicon +silicon's +sillier +silliest +silver +silver's +similarities +similarity +similarity's +simplicity +simplicity's +simplified +simplifies +simplify +simplifying +simplistic +simulate +simulated +simulates +simulating +simulation +simulation's +sin +sin's +sincere +sine +sine's +sinful +sing +singer +singer's +singers +singing +singles +sings +singular +singularly +sinister +sink +sinking +sinking's +sinks +sins +sir +sir's +sister +sister's +situate +situated +situates +situating +sixteen +sixteen's +sixth +sixties +sixty +sized +sizing +skeleton +skeleton's +sketch +sketch's +sketches +skill's +skilled +skin +skin's +skip +skipped +skipping +skips +skirt +skirt's +skull +skull's +sky +sky's +slag +slag's +slang +slang's +slash +slave +slave's +slaves +sleeping +sleeping's +sleeps +slept +slice +slice's +sliced +slices +slicing +slid +slide +slides +sliding +slighter +slightest +slim +slipped +slippery +slipping +slips +slogan +slogan's +slope +sloppy +slot +slot's +slots +slowed +slowing +slows +smallish +smart +smash +smashed +smashes +smashing +smell +smells +smelly +smiled +smiles +smiling +smith +smith's +smoke +smoke's +smoked +smoker +smokers +smokes +smoking +smoking's +smoothly +smug +snack +snack's +snag +snag's +snail +snail's +sneak +sneaked +sneaking +sneaks +sneaky +sniff +snobbery +snobbery's +snow +snow's +soap +soap's +sober +socialism +socialism's +socialist +socialist's +socially +societies +sock +socket +socket's +sockets +socks +sod +sod's +soil +soil's +solar +soldier +soldier's +soldiers +sole +soles +solicitor +solicitor's +solicitors +solo +solo's +song +song's +songs +sons +sordid +sore +soul +soul's +souls +soundtrack +soundtrack's +soup +soup's +spaced +spacing +spacing's +span +span's +spares +spatial +specialist +specialist's +species +specification +specification's +specifications +specimen +specimen's +spectacular +spectrum +spectrum's +speculate +speculation +speculation's +sped +speeches +speeding +speeds +spellings +sphere +sphere's +spies +spigot +spike +spike's +spill +spin +spiral +spirits +spiritual +spit +spits +spitted +spitting +splendid +splits's +spoil +spoiling +spoils +spokesman +spokesman's +sponsor +sponsor's +sponsored +sponsoring +sponsors +spontaneous +spontaneously +spoof +spoof's +spool +spool's +sport +sport's +sports +spotting's +spout +sprang +spray +spray's +springing +springs +sprung +spur +spur's +spurious +spy +spy's +squad +squad's +squared +squares +squaring +squash +squashed +squashes +squashing +squeeze +squeezed +squeezes +squeezing +stability +stability's +stack +stack's +stacks +stagger +staggered +staggering +staggers +stair +staircase +staircase's +stairs +stake +stake's +stale +stall +stall's +stamp +stamped +stamping +stamps +stance +stance's +standpoint +standpoint's +star +star's +stare +stared +stares +staring +stark +starred +starring +stars +starter +starters +startle +startled +startles +startling +starve +starved +starves +starving +static +stationary +statistic's +steadily +steady +stealing +stealing's +steals +steam +steam's +steel +steel's +steep +steer +steered +steering +steers +stem +stems +stepped +stepping +steps +stereo +stereotype +stereotype's +stereotypes +sterile +sterling +sterling's +sticky +stiff +stimulate +stimulated +stimulates +stimulating +stimulation +stimulation's +stir +stirred +stirring +stirs +stocks +stole +stolen +stomach +stomach's +storm +storm's +storms +strain +strains +strangely +stranger +stranger's +strangest +strategic +strategies +straw +straw's +stray +streams +streets +strengthen +stress +stress's +stressed +stresses +stressing +stretch +stretched +stretches +stretching +stringent +strip +stripped +stripping +strips +strive +stroke +stroke's +stronger +strongest +structural +structured +structuring +struggle +struggled +struggles +struggling +studio +studio's +stuffed +stuffing +stuffs +stumble +stumbled +stumbles +stumbling +stun +stunned +stunning +stuns +stunt +stupidity +stupidity's +styles +subjected +subjecting +subjective +submission +submission's +subroutine +subroutine's +subroutines +subscribe +subscription +subscription's +subsequently +subsidiary +substance +substance's +substances +substantially +substituted +substitutes +substituting +substitution +substitution's +subtleties +subtlety +subtlety's +subtly +subway +subway's +subways +succeeded +succeeding +succeeds +succession +succession's +successive +successor +successor's +sue +sued +sues +sufferer +sufferers +suffix +suffix's +suicidal +suicide +suicide's +suing +suitability +suite +suite's +summaries +summed +summing +sums +sundry +sung +sunk +sunlight +sunlight's +sunny +sunrise +sunrise's +sunshine +sunshine's +super +superb +superficial +superficially +superfluous +superiority +superiority's +supermarket +supermarket's +supernatural +supervise +supervised +supervises +supervising +supervision +supervision's +supervisions +supervisors +supplement +supplement's +supplementary +supplier +supplier's +suppliers +supporter +supporter's +supporters +suppress +suppressed +suppresses +suppressing +suppression +suppression's +supreme +surfaces +surgery +surgery's +surname +surname's +surplus +surplus's +surprisingly +surround +surrounded +surrounding +surrounding's +surroundings +surrounds +surveys +survival +survival's +susceptible +suspension +suspension's +suspicious +suspiciously +sustain +sustained +sustaining +sustains +swallow +swallowed +swallowing +swallows +swam +swamp +swamped +swamping +swamps +swap +swapped +swapping +swaps +swear +swearing +swears +sweat +sweat's +sweating +sweats +sweep +sweeping +sweeps +sweet +swept +swim +swimming +swimming's +swims +swing +sword +sword's +swore +sworn +swum +symbolic +symmetric +symmetry +symmetry's +sympathetic +sympathies +sympathy +sympathy's +symphonies +symphony +symphony's +symptom +symptom's +symptoms +syndicate +syndicate's +syndrome +syndrome's +synonym +synonym's +synonymous +synonyms +syntactic +syntactically +synthesis +synthesis's +systematic +tab +tab's +tabs +tack +tack's +tacked +tacking +tackle +tackle's +tackled +tackles +tackling +tacks +tactic +tactical +tactics +tactless +tag +tag's +tail +tail's +tailor +tailored +tailoring +tailors +tails +taker +takers +tale +tale's +talent +talent's +talented +talented's +talents +tales +tall +tame +tangent +tangent's +tank's +tap +targets +tasted +tasteless +tastes +tasting +taxation +taxation's +taxes +taxi +taxi's +taxpayer +taxpayers +teachers +teams +teapot +teapot's +tear +tear's +teared +tearing +tears +technically +technological +teenage +teenager +teenagers +telephones +telescope +telescope's +temper +temper's +temperatures +temple +temple's +tempt +temptation +temptation's +tempted +tempting +tempts +tended +tendencies +tender +tending +tennis +tennis's +tens +tense +tension +tension's +tentative +tentatively +tenth +termed +terminally +terminate +terminated +terminates +terminating +termination +termination's +terminator +terminator's +terming +terrible +terrified +terrifies +terrify +terrifying +territory +territory's +terror +terror's +terrorism +terrorism's +terrorist +terrorist's +terrorists +terse +textbook +textbook's +textbooks +texts +textual +thanked +thankful +thankfully +thanking +thee +theft +theft's +theirs +theme +theme's +themes +theological +theology +theology's +theorem +theorem's +theorems +theoretically +theories +therapy +therapy's +thereabouts +thereafter +therein +thereof +theses +thesis +thesis's +thick +thickness +thickness's +thief +thieve +thieves +thirst +thirst's +thirty +thirty's +thorough +thoroughfare +thoroughfare's +thoroughfares +thou +thous +thread +thread's +threaten +threatened +threatening +threatens +threats +threshold +threshold's +throat +throat's +throats +throughput +throughput's +thrust +thrusting +thrusts +thumb +thumb's +thy +tick +tick's +ticket's +tidied +tidies +tidy +tidying +tidying's +tiger +tiger's +tightly +tile +tiles +timer +timer's +timescale +timetable +timetable's +tin's +tins +tiny +tip +tips +tiresome +toad +toad's +toast +toast's +tobacco +tobacco's +toe +toe's +toes +toggle +toggle's +toilet +toilet's +toilets +tokens +tolerance +tolerance's +tolerant +tolerate +tolerated +tolerates +tolerating +toll +tomato +tomatoes +tome +tome's +ton +ton's +tone +tone's +tones +tongue +tongue's +tons +tool +tool's +tools +topical +tops +tore +torn +torture +toss +tough +tour +tour's +tourist +tourist's +tourists +tower +tower's +towers +towns +toy +toy's +toys +traced +traces +tracing +tracing's +tracked +tracking +trade +trade's +traded +trades +trading +tradition +tradition's +traditionally +traditions +tragedy +tragedy's +tragic +trail +trailed +trailing +trails +transaction +transaction's +transactions +transcript +transcript's +transform +transformation +transformation's +transformed +transforming +transforms +transient +transit +transit's +transition +transition's +translations +translator +translator's +transmission +transmission's +transmissions +transmit +transmits +transmitted +transmitter +transmitter's +transmitters +transmitting +transparent +transported +transporting +transports +trashcan +trashcan's +travels +tray +tray's +tread +treasure +treasure's +treaty +treaty's +trek +tremendous +tremendously +trend +trend's +trends +trendy +trials +triangle +triangle's +triangles +tribe +tribe's +tribes +tricks +tricky +trifle +trifle's +trigger +trigger's +triggered +triggering +triggers +trilogy +trilogy's +trinity +trinity's +triple +tripos +tripos's +trips +triumph +triumph's +trivia +trivially +trolley +trolley's +troop +troops +troubles +trouser +trousers +trucks +trumpet +trumpet's +truncate +truncated +truncates +truncating +trunks +trusty +trusty's +truths +tube +tube's +tubes +tuned +tunes +tuning +tuning's +tunnel +tunnel's +tunnels +turnround +turntable +turntable's +tutor +tutor's +tutorial +tutorial's +twentieth +twin +twins +twist +twisted +twisting +twists +typeset +typesets +typesetting +typesetting's +typewriter +typewriter's +typically +ugh +umbrella +umbrella's +unaffected +unambiguous +unattended +unavailable +unavoidable +unbalanced +unbearable +unbelievable +unbelievably +unbiased +uncertainty +uncertainty's +unchanged +uncle +uncle's +uncomfortable +uncommon +unconnected +unconscious +unconvincing +undefined +underestimate +undergo +undergoes +undergoing +undergone +underground +underground's +undergrounds +underlain +underlay +underlie +underlies +underline +underlined +underlines +underlining +underlying +understandable +undertake +undertaken +undertakes +undertaking +undertook +underwent +undesirable +undid +undo +undocumented +undoes +undoing +undone +undoubtedly +unduly +uneasy +unemployed +unemployment +unemployment's +unexpected +unexpectedly +unexplained +unfair +unfamiliar +unfinished +unfounded +unfriendly +unhealthy +unhelpful +unified +unifies +uniformly +unify +unifying +unimportant +uninteresting +union +union's +unions +uniquely +united +unites +uniting +unity +unity's +universally +universe +universe's +unjustified +unload +unlock +unlocked +unlocking +unlocks +unlucky +unnatural +unobtainable +unofficial +unpopular +unpredictable +unread +unreadable +unrealistic +unrelated +unreliable +unsafe +unsatisfactory +unseen +unset +unsolicited +unsound +unspecified +unstable +unsuccessful +unsupported +unsure +unsuspecting +untidy +unto +untrue +unusable +unused +unusually +unwelcome +unwilling +unwise +unworkable +upbringing +upbringing's +upgrade +upgraded +upgrades +upgrading +upright +ups +upsetting's +upside +upside's +upstairs +upward +urban +urge +urged +urgency +urgency's +urgent +urgently +urges +urging +usable +usefully +usefulness +usefulness's +utilities +utter +vacancies +vacancy +vacuum +vacuum's +vain +valley +valley's +valued +valuing +valve +valve's +valves +vandalism +vandalism's +vanish +vanished +vanishes +vanishing +vans +variance +variance's +variant +variants +variations +varieties +vat +vat's +vectors +vegetable +vegetable's +vegetables +vegetarian +vegetarian's +vehicle +vehicle's +vehicles +vein +vein's +velocity +velocity's +vend +vended +vending +vendor +vendor's +vends +venture +venue +venue's +venues +verb +verb's +verbal +verbally +verbatim +verbose +verbs +verdict +verdict's +verification +verified +verifies +verify +verifying +versatile +verse +verse's +verses +versus +vertical +vertically +vessel +vessel's +vet +vet's +viable +vicar +vicar's +vicinity +vicinity's +vicious +victim +victim's +victims +victory +victory's +viewed +viewer +viewer's +viewing +viewing's +viewpoint +viewpoint's +viewpoints +vigorously +vile +village +village's +villages +vintage +vintage's +vinyl +vinyl's +violate +violation +violence +violence's +violent +violently +violin +violin's +virgin +virgin's +virtual +virtues +virus +virus's +viruses +visited +visiting +visitor +visitor's +visitors +visits +visual +visually +vocabulary +vocabulary's +vocal +voices +void +voltage +voltage's +volumes +voluntarily +voluntary +volunteer +volunteer's +volunteered +volunteering +volunteers +vomit +voted +voter +voters +voting +vouch +vowel +vowel's +vulnerable +wade +waded +wades +wading +waffle +waffle's +wage +wage's +wages +wake +wake's +waked +wakes +waking +wallet +wallet's +wander +wandered +wandering +wanders +ward +ward's +warehouse +warehouse's +warmed +warming +warms +warnings +warp +warped +warping +warps +warrant +warrant's +warranty +warranty's +wars +wartime +wartime's +wary +washed +washes +washing +washing's +wasteful +waters +wave +waved +waves +waving +weak +weakness +weakness's +weaknesses +wealth +wealth's +wealthy +weapons +weary +weasel +weasel's +weasels +wed +wedded +wedding +wedding's +weds +wee +weekday +weekday's +weekends +weekly +weigh +welfare +welfare's +wet +wets +wetting +whale +whale's +whales +whence +whereupon +whichever +whim +whim's +whistle +whistles +whites +wholeheartedly +wholly +whoop +whoops +wicked +width +width's +wildly +willingly +winded +winding +winding's +windowing +winds +wines +wing +wing's +wings +winner +winner's +winners +wipe +wiped +wipes +wiping +wired +wires +wiring +wiring's +wisdom +wisdom's +wiser +wisest +wit +wit's +witch +witch's +withdrawal +withdrawal's +withdrawing +withdrawn +withdraws +withdrew +witness +witness's +witnessed +witnesses +witnessing +witty +wive +wives +wives's +wizard +wizard's +woke +woken +wolf +wolf's +wombat +wombat's +wonderfully +wondrous +wont +wont's +wood +wood's +woods +workable +workings +workload +workload's +workshop +workshop's +workstation +workstations +worlds +worldwide +worm +worms +worship +worthless +wound +wound's +wow +wrap +wrapped +wrapper +wrappers +wrapping +wrapping's +wraps +wrath +wrath's +wreck +wrecked +wrecker +wrecker's +wrecking +wrecks +wren +wren's +wretched +wrist +wrist's +writers +writings +wrongly +wrongs +yard +yard's +yards +yawn +yearly +yeti +yeti's +yield +yields +younger +youngest +yourselves +youth +youth's +zeros +zone +zone's +zones +zoom diff --git a/cosmic rage/spell/english-words.35 b/cosmic rage/spell/english-words.35 new file mode 100644 index 0000000..8e0fb8b --- /dev/null +++ b/cosmic rage/spell/english-words.35 @@ -0,0 +1,34432 @@ +aback +abacus +abacus's +abacuses +abandonment +abandonment's +abate +abated +abates +abating +abbey +abbey's +abbeys +abbot +abbot's +abbots +abdicate +abdicated +abdicates +abdicating +abdication +abdication's +abdications +abdomen +abdomen's +abdomens +abdominal +abduct +abducted +abducting +abducts +aberration +aberration's +aberrations +abet +abets +abetted +abetting +abhor +abhorred +abhorrence +abhorrence's +abhorrent +abhorring +abhors +abides +abiding +abject +abjected +abjecting +abjects +ablaze +abler +ables +ablest +ably +abnormalities +abnormality +abnormality's +aboard +abode +abode's +aboded +abodes +aboding +abominable +abomination +abomination's +aboriginal +aborigine +aborigine's +aborigines +abortions +abortive +abound +abounded +abounding +abounds +abouts +aboveboard +abrasive +abrasive's +abrasives +abreast +abridge +abridged +abridges +abridging +abrupt +abrupter +abruptest +abruptly +abscess +abscess's +abscessed +abscesses +abscessing +abscond +absconded +absconding +absconds +absences +absented +absentee +absentee's +absentees +absenting +absents +absoluter +absolutes +absolutest +absolve +absolved +absolves +absolving +absorbent +absorbents +absorption +absorption's +abstain +abstained +abstaining +abstains +abstention +abstention's +abstentions +abstinence +abstinence's +abstracted +abstracter +abstractest +abstracting +abstractions +abstracts +abstruse +absurder +absurdest +absurdities +absurdity +absurdity's +absurdly +abundance +abundance's +abundances +abundant +abundantly +abuser +abusers +abyss +abyss's +abysses +academically +academies +academy +academy's +accede +acceded +accedes +acceding +accelerated +accelerates +accelerating +acceleration +acceleration's +accelerations +accelerator +accelerator's +accelerators +accented +accenting +accentuate +accentuated +accentuates +accentuating +acceptability +acceptability's +acceptably +acceptances +accessibility +accessibility's +accessories +accessory +accessory's +accidentals +acclaim +acclaimed +acclaiming +acclaims +acclimate +acclimated +acclimates +acclimating +acclimatize +acclimatized +acclimatizes +acclimatizing +accolade +accolade's +accoladed +accolades +accolading +accommodated +accommodates +accommodating +accommodations +accompaniment +accompaniment's +accompaniments +accompanist +accompanist's +accompanists +accomplice +accomplice's +accomplices +accomplishment +accomplishment's +accomplishments +accordion +accordion's +accordions +accost +accosted +accosting +accosts +accountability +accountability's +accountable +accountancy +accountancy's +accountant's +accredit +accredited +accrediting +accredits +accrue +accrued +accrues +accruing +accumulation +accumulation's +accumulations +accuser +accuser's +accusers +aced +aces +ache +ached +aches +achievable +aching +acidity +acidity's +acids +acing +acne +acne's +acorns +acoustics +acoustics's +acquaint +acquaintances +acquainted +acquainting +acquaints +acquiesce +acquiesced +acquiescence +acquiescence's +acquiesces +acquiescing +acquisitions +acquit +acquits +acquittal +acquittal's +acquittals +acquitted +acquitting +acre +acre's +acreage +acreage's +acreages +acres +acrid +acrider +acridest +acrimonious +acrimony +acrimony's +acrobat +acrobat's +acrobatic +acrobatics +acrobatics's +acrobats +acrylic +acrylics +actioned +actioning +actives +activist +activist's +activists +actress +actress's +actresses +actualities +actuality +actuality's +actuary +actuary's +acumen +acumen's +acupuncture +acupuncture's +acutely +acuter +acutes +acutest +ad +ad's +adage +adage's +adages +adamant +adaptable +adaptations +adaptive +addendum +addendum's +addiction +addiction's +addictions +additive +additives +addressee +addressee's +addressees +adept +adepter +adeptest +adepts +adherence +adherence's +adherent +adherent's +adherents +adhesion +adhesion's +adhesive +adhesives +adjectives +adjoin +adjoined +adjoining +adjoins +adjourn +adjourned +adjourning +adjournment +adjournment's +adjournments +adjourns +adjunct +adjunct's +adjuncts +adjustable +administrations +administrator +administrator's +administrators +admirably +admiral +admiral's +admirals +admired +admirer +admirer's +admirers +admires +admiring +admissible +admissions +admittance +admittance's +admonish +admonished +admonishes +admonishing +admonition +admonition's +admonitions +ado +ado's +adobe +adobe's +adobes +adolescence +adolescence's +adolescences +adolescent +adolescents +adoptions +adorable +adoration +adoration's +adore +adored +adores +adoring +adorn +adorned +adorning +adornment +adornment's +adornments +adorns +adrift +adroit +adroiter +adroitest +adroitly +ads +adulation +adulation's +adulterate +adulterated +adulterates +adulterating +adulteration +adulteration's +adulteries +adultery +adultery's +adulthood +adulthood's +advancement +advancement's +advancements +advantaged +advantaging +adventured +adventurer +adventurer's +adventurers +adventuring +adverb +adverb's +adverbial +adverbial's +adverbials +adverbs +adversaries +adversary +adversary's +adverser +adversest +adversities +adversity +adversity's +advertiser +advertisers +advisories +aerials +aerodynamic +aerodynamics +aerodynamics's +aerosol +aerosol's +aerosols +aerospace +aerospace's +afar +affable +affabler +affablest +affably +affectation +affectation's +affectations +affectionate +affectionately +affectioned +affectioning +affections +affidavit +affidavit's +affidavits +affiliate +affiliated +affiliates +affiliating +affiliation +affiliation's +affiliations +affinities +affinity +affinity's +affirm +affirmation +affirmation's +affirmations +affirmative +affirmatives +affirmed +affirming +affirms +affix +affixed +affixes +affixing +afflict +afflicted +afflicting +affliction +affliction's +afflictions +afflicts +affluence +affluence's +affluent +affordable +afforded +affording +affords +affront +affront's +affronted +affronting +affronts +afield +aflame +afloat +afoot +aforesaid +afresh +aftereffect +aftereffect's +aftereffects +afterlife +afterlife's +afterlives +aftermath +aftermath's +aftermaths +afters +afterthought +afterthought's +afterthoughts +agencies +agendas +aggravate +aggravated +aggravates +aggravating +aggravation +aggravation's +aggravations +aggregate +aggregated +aggregates +aggregating +aggression +aggression's +aggressively +aggressiveness +aggressor +aggressor's +aggressors +aghast +agile +agiler +agilest +agility +agility's +agitate +agitated +agitates +agitating +agitation +agitation's +agitations +agitator +agitator's +agitators +aglow +agnostic +agnostic's +agnosticism +agnosticism's +agnostics +agonies +agreeable +agreeably +agriculture +agriculture's +aground +ah +ahoy +ahoys +aide +aide's +aides +ail +ailed +ailing +ailment +ailment's +ailments +ails +aimless +aimlessly +airborne +aired +airfield +airfield's +airfields +airier +airiest +airing +airing's +airline +airline's +airliner +airliner's +airliners +airlines +airmail +airmailed +airmailing +airmails +airports +airs +airstrip +airstrip's +airstrips +airtight +airy +aisle +aisle's +aisled +aisles +aisling +ajar +alarmingly +alarmist +alarmist's +alarmists +alases +albino +albino's +albinos +alcoholics +alcoholism +alcoholism's +alcohols +alcove +alcove's +alcoves +ale +ale's +alerted +alerter +alertest +alerting +alerts +ales +alga +algae +aliased +aliasing +alibi +alibi's +alibied +alibiing +alibis +alienate +alienated +alienates +alienating +alienation +alienation's +aliened +aliening +alight +alighted +alighting +alights +alignments +alimony +alimony's +alkali +alkali's +alkalies +alkaline +allay +allayed +allaying +allays +allegation's +allegiance +allegiance's +allegiances +allegorical +allegories +allegory +allegory's +allergies +allergy +allergy's +alleviated +alleviates +alleviating +alley +alley's +alleys +alliances +allied +alligator +alligator's +alligators +allot +allotment +allotment's +allotments +allots +allotted +allotting +alloy +alloy's +alloyed +alloying +alloys +allude +alluded +alludes +alluding +allure +allured +allures +alluring +allusion +allusion's +allusions +allying +almanac +almanac's +almanacs +almighty +almond +almond's +almonds +alms +aloft +aloof +alphabeted +alphabetically +alphabeting +alphabets +alphanumeric +altar +altar's +altars +alterable +alternated +alternately +alternates +alternating +alternation +alternation's +alternator +alternator's +altitude +altitude's +altitudes +alto +alto's +altos +altruism +altruism's +altruistic +amalgamate +amalgamated +amalgamates +amalgamating +amalgamation +amalgamation's +amalgamations +amass +amassed +amasses +amassing +amateurish +amateurs +amazement +amazement's +ambassadors +ambidextrous +ambience's +ambiguously +ambition +ambition's +ambitions +ambitiously +ambivalence +ambivalence's +ambivalent +amble +ambled +ambles +ambling +ambulance +ambulance's +ambulances +ambush +ambush's +ambushed +ambushes +ambushing +ameba's +amen +amenable +amendments +amends's +amened +amening +amenities +amenity +amenity's +amens +amethyst +amethyst's +amethysts +amiable +amiably +amicable +amicably +amid +amids +amidst +amiss +ammonia +ammonia's +ammunition +ammunition's +amnesia +amnesia's +amnestied +amnesties +amnesty +amnesty's +amnestying +amoeba +amoeba's +amoebas +amok +amok's +amoral +amorous +amorphous +amounted +amounting +ampere +ampere's +amperes +ampersand +ampersand's +ampersands +amphetamine +amphetamine's +amphetamines +amphibian +amphibian's +amphibians +amphibious +ampler +amplest +amplification +amplification's +amplifications +amplified +amplifiers +amplifies +amplify +amplifying +amplitude +amplitude's +amply +amps +amputate +amputated +amputates +amputating +amputation +amputation's +amputations +amuck's +amulet +amulet's +amulets +amusements +amusingly +anachronism +anachronism's +anachronisms +anal +analgesic +analgesics +analogies +analysts +analytic +analytical +analytics +anarchic +anarchism +anarchism's +anarchist +anarchist's +anarchists +anathema +anathema's +anatomical +anatomies +ancestor's +ancestored +ancestoring +ancestral +ancestries +ancestry +ancestry's +anchor +anchor's +anchorage +anchorage's +anchorages +anchored +anchoring +anchors +anchovies +anchovy +anchovy's +ancienter +ancientest +ancients +android +android's +androids +ands +anecdote's +anew +angelic +angered +angering +angers +angled +angler +angler's +anglers +angling +angrier +angriest +angrily +angst +angst's +anguished +anguishes +anguishing +angular +animate +animated +animates +animating +animation +animation's +animations +animosities +animosity +animosity's +ankle +ankle's +ankled +ankles +ankling +annals +annex +annexation +annexation's +annexations +annexe +annexed +annexes +annexing +annihilate +annihilated +annihilates +annihilating +annihilation +annihilation's +anniversaries +annotate +annotated +annotates +annotating +annotation +annotation's +annotations +announcer +announcer's +announcers +annoyances +annoyingly +annuals +annuities +annuity +annuity's +annul +annulled +annulling +annulment +annulment's +annulments +annuls +anoint +anointed +anointing +anoints +anomalous +anomaly's +anon +anonymity +anonymity's +anonymously +answerable +ant +ant's +antagonism +antagonism's +antagonisms +antagonist +antagonist's +antagonistic +antagonists +ante +anteater +anteater's +anteaters +anted +anteing +antelope +antelope's +antelopes +antenna +antenna's +antennae +antennas +antes +anthem +anthem's +anthems +anthill +anthills +anthologies +anthrax +anthrax's +anthropological +anthropologist +anthropologist's +anthropologists +anthropology +anthropology's +antibiotic +antibiotic's +antibiotics +antibodies +antibody +antibody's +antic +anticipations +anticlimax +anticlimax's +anticlimaxes +antics +antidotes +antifreeze +antifreeze's +anting +antipathies +antipathy +antipathy's +antiquate +antiquated +antiquates +antiquating +antiqued +antiques +antiquing +antiquities +antiquity +antiquity's +antiseptic +antiseptics +antitheses +antithesis +antithesis's +antler +antler's +antlers +antonym +antonym's +antonyms +ants +anus +anus's +anuses +anvil +anvil's +anvils +anxieties +anxiety +anxiety's +anxiously +anybodies +anythings +anyways +anywheres +aorta +aorta's +aortas +apartheid +apartheid's +apartment +apartment's +apartments +ape +ape's +aped +aperture +aperture's +apertures +apes +apex +apex's +apexes +aphorism +aphorism's +aphorisms +apiece +aping +aplomb +aplomb's +apocryphal +apologetic +apologetically +apologetics +apostle +apostle's +apostles +apostrophes +apparel +apparel's +apparels +apparition +apparition's +apparitions +appease +appeased +appeasement +appeasement's +appeasements +appeases +appeasing +appendage +appendage's +appendages +appendices +appendicitis +appendicitis's +appendixes +appetite +appetite's +appetites +applaud +applauded +applauding +applauds +apples +appliance +appliance's +appliances +applicability +applicability's +applicator +applicator's +applicators +appointee +appointee's +appointees +apposite +appraisals +appraise +appraised +appraises +appraising +appreciable +appreciations +appreciative +apprehend +apprehended +apprehending +apprehends +apprehension +apprehension's +apprehensions +apprehensive +apprentice +apprentice's +apprenticed +apprentices +apprenticeship +apprenticeship's +apprenticeships +apprenticing +approachable +appropriated +appropriates +appropriating +appropriation +appropriation's +appropriations +approvals +approximated +approximates +approximating +approximations +apricot +apricot's +apricots +apron +apron's +aprons +apter +aptest +aptitude +aptitude's +aptitudes +aptly +aquamarine +aquamarine's +aquamarines +aquarium +aquarium's +aquariums +aquatic +aquatics +aqueduct +aqueduct's +aqueducts +arable +arbiter +arbiter's +arbiters +arbitrate +arbitrated +arbitrates +arbitrating +arbitration +arbitration's +arbitrator +arbitrator's +arbitrators +arcades +arced +archaeological +archaeologist +archaeologist's +archaeologists +archbishop +archbishop's +archbishops +arched +archer +archer's +archers +archery +archery's +arches +archest +archetypal +arching +archipelago +archipelago's +archipelagos +architect +architect's +architects +architectural +architectures +archway +archway's +archways +arcing +arcs +ardent +ardently +arduous +arduously +arenas +ares +argumentative +aria +aria's +arias +arid +arider +aridest +aristocracies +aristocracy +aristocracy's +aristocrat +aristocrat's +aristocratic +aristocrats +ark +ark's +arks +armadillo +armadillo's +armadillos +armament +armament's +armaments +armchair +armchair's +armchairs +armies +armistice +armistice's +armistices +armpit +armpit's +armpits +aroma +aroma's +aromas +aromatic +aromatics +arouse +aroused +arouses +arousing +arraign +arraigned +arraigning +arraigns +arrayed +arraying +arrears +arrivals +arrogantly +arsenal +arsenal's +arsenals +arsenic +arsenic's +arson +arson's +arterial +arteries +artery +artery's +artful +arthritic +arthritics +arthritis +arthritis's +artichoke +artichoke's +artichokes +articulate +articulated +articulately +articulates +articulating +articulation +articulation's +articulations +artifact +artifact's +artifacts +artifice +artifice's +artifices +artillery +artillery's +artisan +artisan's +artisans +artistically +artistry +artistry's +artwork +artwork's +asbestos +asbestos's +ascension +ascension's +ascensions +ascent +ascent's +ascents +ascertain +ascertained +ascertaining +ascertains +ascetic +ascetic's +ascetics +ascribe +ascribed +ascribes +ascribing +asexual +ash's +ashed +ashen +ashing +ashore +ashtray +ashtray's +ashtrays +asides +askance +askew +asparagus +asparagus's +aspen +aspen's +aspens +aspersion +aspersion's +aspersions +asphalt +asphalt's +asphalted +asphalting +asphalts +asphyxiate +asphyxiated +asphyxiates +asphyxiating +asphyxiation +asphyxiation's +asphyxiations +aspirant +aspirant's +aspirants +aspiration +aspiration's +aspirations +aspire +aspired +aspires +aspirin +aspirin's +aspiring +aspirins +assail +assailant +assailant's +assailants +assailed +assailing +assails +assassin +assassin's +assassinate +assassinated +assassinates +assassinating +assassination +assassination's +assassinations +assassins +assaulted +assaulter +assaulting +assaults +assemblers +assemblies +assent +assent's +assented +assenting +assents +assertions +assertive +assessments +assessor +assessor's +assessors +asset's +assimilate +assimilated +assimilates +assimilating +assimilation +assimilation's +assistants +associative +assortment +assortment's +assortments +assurance +assurance's +assurances +assureds +asterisked +asterisking +asteroid +asteroid's +asteroids +asthma +asthma's +astonish +astonished +astonishes +astonishing +astonishingly +astonishment +astonishment's +astound +astounded +astounding +astounds +astray +astride +astringent +astringents +astrological +astrology +astrology's +astronaut +astronaut's +astronauts +astronomer's +astronomical +astute +astutely +astuter +astutest +asylum +asylum's +asylums +asymmetry +asymmetry's +asynchronously +ates +atheistic +athlete +athlete's +athletes +athletic +athletics +athletics's +atlantes +atlases +atmospheres +atmospherics +atomics +atone +atoned +atonement +atonement's +atones +atoning +atrocious +atrociously +atrocity's +attachments +attach +attacker +attacker's +attained +attaining +attainment +attainment's +attainments +attains +attendances +attendants +attentive +attentively +attest +attested +attesting +attests +attic +attic's +attics +attire +attired +attires +attiring +attractions +attractiveness +attractiveness's +attributable +attribution +attribution's +attune +attuned +attunes +attuning +auburn +auburn's +auction +auction's +auctioned +auctioneer +auctioneer's +auctioneers +auctioning +auctions +audacious +audacity +audacity's +audibles +audibly +audios +audit +audit's +audited +auditing +audition +audition's +auditioned +auditioning +auditions +auditor +auditor's +auditorium +auditorium's +auditoriums +auditors +auditory +audits +augment +augmented +augmenting +augments +august +auguster +augustest +augusts +aunts +aura +aura's +aural +auras +auspicious +austere +austerer +austerest +austerities +austerity +austerity's +authentically +authenticate +authenticated +authenticates +authenticating +authenticity +authenticity's +authored +authoring +authoritarian +authoritative +authoritatively +authorship +authorship's +auto +auto's +autobiographical +autobiographies +autocracies +autocracy +autocracy's +autocrat +autocrat's +autocratic +autocrats +autoed +autograph +autograph's +autographed +autographing +autographs +autoing +automatics +automation +automation's +automobiled +automobiling +automotive +autonomous +autonomy +autonomy's +autopsied +autopsies +autopsy +autopsy's +autopsying +autos +autumnal +autumns +auxiliaries +auxiliary +avail +availed +availing +avails +avalanche +avalanche's +avalanches +avarice +avarice's +avaricious +avenge +avenged +avenges +avenging +avenue +avenue's +avenues +averaged +averages +averaging +averse +aversion +aversion's +aversions +avert +averted +averting +averts +aviation +aviation's +aviator +aviator's +aviators +avid +avider +avidest +avocado +avocado's +avocados +avoidable +avoidance +avoidance's +avow +avowal +avowal's +avowals +avowed +avowing +avows +awaken +awakened +awakening +awakens +awakes +awaking +awarer +awarest +aways +awe +awe's +awed +awes +awesome +awfuller +awfullest +awhile +awing +awkwarder +awkwardest +awkwardly +awkwardness +awkwardness's +awning +awning's +awnings +awoke +awoken +awry +axed +axing +axiom's +axiomatic +axiomatics +axises +axle +axle's +axles +aye +aye's +ayes +azalea +azalea's +azaleas +azure +azure's +azures +babble +babbled +babbles +babbling +babe +babe's +babes +babied +babier +babiest +baboon +baboon's +baboons +babying +babyish +bachelor +bachelor's +bachelors +backbones +backer +backer's +backers +backfire +backfired +backfires +backfiring +backgammon +backgammon's +backhand +backhand's +backhanded +backhanding +backhands +backings +backlash +backlash's +backlashes +backlogged +backlogging +backlogs +backpack +backpack's +backpacked +backpacking +backpacks +backside +backside's +backslash +backstage +backtrack +backtracked +backtracking +backtracks +backwoods +bacon +bacon's +bacterial +bacterias +badder +baddest +bade +badger +badger's +badgered +badgering +badgers +badges +badminton +badminton's +badness +badness's +bagel +bagel's +bagels +bagged +baggie +baggier +baggies +baggiest +bagging +baggy +bail +bail's +bailed +bailing +bails +bait +bait's +baited +baiting +baits +baker +baker's +bakeries +bakers +bakery +bakery's +balconies +balcony +balcony's +bald +balded +balder +baldest +balding +baldness +baldness's +balds +bale +bale's +baled +bales +baling +balk +balked +balking +balks +ballad +ballad's +ballads +ballast +ballast's +ballasted +ballasting +ballasts +balled +ballerina +ballerina's +ballerinas +ballets +balling +ballistics +ballistics's +balloon +balloon's +ballooned +ballooning +balloons +balloted +balloting +ballots +ballroom +ballroom's +ballrooms +balm +balm's +balmier +balmiest +balms +balmy +baloney +baloney's +bamboo +bamboo's +bamboos +bamboozle +bamboozled +bamboozles +bamboozling +banaler +banalest +bandage +bandage's +bandaged +bandages +bandaging +bandanna +bandanna's +bandannas +banded +bandied +bandier +bandies +bandiest +banding +bandit +bandit's +bandits +bandstand +bandstand's +bandstands +bandwagons +bandy +bandying +banged +banging +bangs +bani +banish +banished +banishes +banishing +banister +banister's +banisters +banjo +banjo's +banjos +banked +banker +banker's +bankers +banking +banking's +banknote +banknotes +bankruptcies +bankruptcy +bankruptcy's +bankrupted +bankrupting +bankrupts +bannered +bannering +banners +banquet +banquet's +banqueted +banqueting +banquets +banter +bantered +bantering +banters +baptism +baptism's +baptisms +barb +barb's +barbarian +barbarian's +barbarians +barbaric +barbarous +barbecue +barbecue's +barbecued +barbecues +barbecuing +barbed +barber +barber's +barbered +barbering +barbers +barbing +barbiturate +barbiturate's +barbiturates +barbs +bard +bard's +bards +bareback +bared +barefoot +barer +bares +barest +bargained +bargainer +bargaining +bargains +barge +barge's +barged +barges +barging +baring +baritone +baritone's +baritones +bark's +barley +barley's +barman +barman's +barn +barn's +barnacle +barnacle's +barnacles +barns +barnyard +barnyard's +barnyards +barometer +barometer's +barometers +baron +baron's +barons +barrage +barrage's +barraged +barrages +barraging +barrels +barren +barrener +barrenest +barrens +barrette +barrette's +barrettes +barricade +barricade's +barricaded +barricades +barricading +barrings +bartender +bartender's +bartenders +barter +bartered +bartering +barters +baseball +baseball's +baseballs +baseline +baseline's +basements +baser +basest +bashful +basil +basil's +basin +basin's +basins +bask +basked +basketball +basketball's +basketballs +baskets +basking +basks +bassoon +bassoon's +bassoons +baste +basted +bastes +basting +batched +batches +batching +bathe +bathed +bathes +bathing +bathrooms +bathtub +bathtub's +bathtubs +baton +baton's +batons +bats +batsman +batsman's +battalion +battalion's +battalions +batted +batter +battered +battering +batters +batting +batting's +battled +battlefield +battlefield's +battlefields +battles +battleship +battleship's +battleships +battling +bawdier +bawdiest +bawdy +bawl +bawled +bawling +bawls +bayed +baying +bayonet +bayonet's +bayoneted +bayoneting +bayonets +bayou +bayou's +bayous +bays +bazaar +bazaar's +bazaars +beached +beaches +beaching +beacon +beacon's +beacons +bead +bead's +beaded +beadier +beadiest +beading +beads +beady +beagle +beagle's +beagled +beagles +beagling +beak +beak's +beaked +beaker +beaker's +beakers +beaks +beamed +beaming +beams +beaned +beaning +bearable +bearer +bearer's +bearers +bearings +beater +beater's +beaters +beautician +beautician's +beauticians +beauties +beautified +beautifies +beautifuler +beautifulest +beautify +beautifying +beaver +beaver's +beavered +beavering +beavers +beckon +beckoned +beckoning +beckons +becomings +bedbug +bedbug's +bedbugs +bedclothes +bedded +bedder +bedder's +bedding +bedding's +bedlam +bedlam's +bedlams +bedridden +bedrock +bedrock's +bedrocks +bedrooms +bedside +bedside's +bedsides +bedspread +bedspread's +bedspreads +bedtime +bedtime's +bedtimes +bee +bee's +beech +beech's +beeches +beefed +beefier +beefiest +beefing +beefs +beefy +beehive +beehive's +beehives +beeper +bees +beeswax +beeswax's +beet +beet's +beetle +beetle's +beetled +beetles +beetling +beets +beeves +befall +befallen +befalling +befalls +befell +befit +befits +befitted +befitting +befriend +befriended +befriending +befriends +beggar +beggar's +beggared +beggaring +beggars +begged +begging +beginnings +begrudge +begrudged +begrudges +begrudging +begs +beguile +beguiled +beguiles +beguiling +behalves +behead +beheaded +beheading +beheads +beheld +behinds +behold +beholder +beholder's +beholding +beholds +beige +beige's +belated +belatedly +belch +belched +belches +belching +belfries +belfry +belfry's +belie +belied +belies +belittle +belittled +belittles +belittling +bellboy +bellboy's +bellboys +belled +bellhop +bellhop's +bellhops +bellied +bellies +belligerent +belligerents +belling +bellow +bellowed +bellowing +bellows +bellows's +belly +belly's +bellying +belongings +beloveds +belows +belted +belting +belts +belying +bemoan +bemoaned +bemoaning +bemoans +bemuse +bemused +bemuses +bemusing +benched +benches +benching +bender +bender's +benediction +benediction's +benedictions +benefactor +benefactor's +benefactors +beneficiaries +beneficiary +beneficiary's +benefited +benefiting +benevolence +benevolence's +benevolences +benevolent +benighted +benign +bents +bequeath +bequeathed +bequeathing +bequeaths +bequest +bequest's +bequests +bereave +bereaved +bereavement +bereavement's +bereavements +bereaves +bereaving +bereft +beret +beret's +berets +berried +berries +berry +berry's +berrying +berserk +berth +berth's +berthed +berthing +berths +beseech +beseeches +beseeching +beset +besets +besetting +besiege +besieged +besieges +besieging +besought +bested +bestial +bestiality +bestiality's +besting +bestow +bestowed +bestowing +bestows +bests +betcha +betray +betrayal +betrayal's +betrayals +betrayed +betraying +betrays +betrothal +betrothal's +betrothals +bettered +bettering +betterment +betterment's +betters +bettor +bettor's +bettors +beverage +beverage's +beverages +bewared +bewares +bewaring +bewilder +bewildered +bewildering +bewilderment +bewilderment's +bewilders +bewitch +bewitched +bewitches +bewitching +beyonds +bib +bib's +bibliographic +bibliographies +bibliography +bibliography's +bibs +bicentennial +bicentennials +bicker +bickered +bickering +bickering's +bickers +bicycled +bicycling +bidden +bidding's +bide +bides +biding +biennial +biennials +bifocals +bigamist +bigamist's +bigamists +bigamous +bigamy +bigamy's +bigots +bike +bike's +biked +bikes +biking +bikini +bikini's +bikinis +bilateral +bile +bile's +bilingual +bilinguals +billboard +billboard's +billboards +billed +billfolds +billiards +billing +billow +billow's +billowed +billowing +billows +binaries +binder +binder's +binders +bindings +bingo +bingo's +binned +binning +binomial +binomial's +bins +biochemical +biodegradable +biographer +biographer's +biographers +biographical +biographies +biologically +bipartisan +biped +biped's +bipeds +biplane +biplane's +biplanes +birch +birch's +birched +birches +birching +birdcage +birdcage's +birdcages +birded +birding +birthdays +birthed +birthing +birthmark +birthmark's +birthmarks +birthplace +birthplace's +birthplaces +births +biscuit's +bisect +bisected +bisecting +bisects +bisexual +bisexuals +bishops +bison +bison's +bitch +bitch's +bitched +bitches +bitching +bitings +bitterer +bitterest +bitterly +bitterness +bitterness's +bittersweet +bittersweet's +bittersweets +bizarres +blab +blabbed +blabbing +blabs +blackberries +blackberry +blackberry's +blackberrying +blackbird +blackbird's +blackbirds +blackboards +blacked +blacken +blackened +blackening +blackens +blacker +blackest +blackhead +blackhead's +blackheads +blacking +blackjack +blackjack's +blackjacked +blackjacking +blackjacks +blacklist +blacklist's +blacklisted +blacklisting +blacklists +blackmailed +blackmailer +blackmailer's +blackmailers +blackmailing +blackmails +blackout +blackout's +blackouts +blacksmith +blacksmith's +blacksmiths +blacktop +blacktop's +blacktopped +blacktopping +blacktops +bladder +bladder's +bladders +bladed +blading +blameless +blamer +blanch +blanched +blanches +blanching +blancmange +blancmange's +bland +blander +blandest +blanked +blanker +blankest +blanketed +blanketing +blankets +blanking +blankly +blare +blared +blares +blaring +blaspheme +blasphemed +blasphemes +blasphemies +blaspheming +blasphemous +blasphemy +blasphemy's +blaster +blaster's +blas +blaze +blaze's +blazed +blazer +blazer's +blazers +blazes +blazing +bleach +bleached +bleaches +bleaching +bleak +bleaker +bleakest +blearier +bleariest +bleary +bleat +bleated +bleating +bleats +bled +bleed +bleeding +bleeds +blemish +blemish's +blemished +blemishes +blemishing +blend +blended +blending +blends +blesseder +blessedest +blessing's +blessings +blight +blight's +blighted +blighting +blights +blimp +blimp's +blimps +blinded +blinder +blindest +blindfold +blindfolded +blindfolding +blindfolds +blinding +blinding's +blindingly +blindness +blindness's +blinds +blinked +blinker +blinkered +blinkering +blinkers +blinking +blinks +blip +blip's +blips +blissed +blisses +blissful +blissfully +blissing +blister +blister's +blistered +blistering +blisters +blithe +blithely +blither +blithest +blitz +blitz's +blitzed +blitzes +blitzing +blizzard +blizzard's +blizzards +blobbed +blobbing +blobs +bloc +bloc's +blockade +blockade's +blockaded +blockades +blockading +blockage +blockage's +blockbuster +blockbuster's +blockbusters +blockhead +blockhead's +blockheads +blocs +blond +blonde's +blonder +blondest +blonds +blooded +bloodhound +bloodhound's +bloodhounds +bloodied +bloodier +bloodies +bloodiest +blooding +bloods +bloodshed +bloodshed's +bloodshot +bloodstream +bloodstream's +bloodthirstier +bloodthirstiest +bloodthirsty +bloodying +bloom +bloom's +bloomed +blooming +blooms +blossom +blossom's +blossomed +blossoming +blossoms +blot +blot's +blotch +blotch's +blotched +blotches +blotching +blots +blotted +blotter +blotter's +blotters +blotting +blouse +blouse's +bloused +blouses +blousing +blowout +blowout's +blowouts +blowtorch +blowtorch's +blowtorches +blubber +blubbered +blubbering +blubbers +bludgeon +bludgeon's +bludgeoned +bludgeoning +bludgeons +bluebell +bluebell's +bluebells +blueberries +blueberry +blueberry's +bluebird +bluebird's +bluebirds +blued +bluegrass +bluegrass's +blueprint +blueprint's +blueprinted +blueprinting +blueprints +bluer +bluest +bluff +bluffed +bluffer +bluffest +bluffing +bluffs +bluing +blunder +blunder's +blundered +blundering +blunders +blunt +blunted +blunter +bluntest +blunting +bluntly +bluntness +bluntness's +blunts +blur +blurred +blurring +blurs +blurt +blurted +blurting +blurts +blush +blushed +blushes +blushing +bluster +blustered +blustering +blusters +boa +boa's +boar +boar's +boarded +boarder +boarder's +boarders +boarding +boarding's +boardwalk +boardwalk's +boardwalks +boars +boas +boast +boasted +boastful +boastfully +boasting +boasts +boated +boating +bobbed +bobbin +bobbin's +bobbing +bobbins +bobcat +bobcat's +bobcats +bobsled +bobsled's +bobsledded +bobsledding +bobsleds +bode +boded +bodes +bodice +bodice's +bodices +bodily +boding +bodyguard +bodyguard's +bodyguards +bodywork +bodywork's +boggled +boggling +boiler +boiler's +boilers +boisterous +bolder +boldest +boldly +boldness +boldness's +bolds +bologna +bologna's +bolster +bolstered +bolstering +bolsters +bolted +bolting +bolts +bombard +bombarded +bombarding +bombardment +bombardment's +bombardments +bombards +bomber +bomber's +bombers +bombings +bondage +bondage's +bonded +bonding +bonds +boned +bonfire +bonfire's +bonfires +bonier +boniest +boning +bonnet +bonnet's +bonnets +bonuses +bony +boo +booby +booby's +booed +booing +bookcase +bookcase's +bookcases +bookend +bookended +bookending +bookends +bookings +bookkeeper +bookkeeper's +bookkeepers +bookkeeping +bookkeeping's +booklets +bookmark +bookmark's +bookmarked +bookmarking +bookmarks +bookshelf +bookshelf's +bookworm +bookworm's +bookworms +boomed +boomerang +boomerang's +boomeranged +boomeranging +boomerangs +booming +booms +boon +boon's +boons +boor +boor's +boorish +boors +boos +boosted +booster +booster's +boosters +boosting +boosts +booted +bootee +bootee's +bootees +booth +booth's +booths +bootie's +booties +booting +bootleg +bootlegged +bootlegging +bootlegs +bootstrap +bootstrap's +booty +booty's +booze +booze's +bop +bordered +bordering +borderlines +borders +boringly +borough +borough's +boroughs +bosom +bosom's +bosoms +bossed +bosser +bosses +bossier +bossiest +bossing +bossy +botanical +botanist +botanist's +botanists +botany +botany's +botch +botched +botches +botching +bothersome +bottled +bottleneck +bottleneck's +bottlenecks +bottling +bottomed +bottoming +bottomless +bottoms +bough +bough's +boughs +boulder +boulder's +bouldered +bouldering +boulders +boulevard +boulevard's +boulevards +bounced +bounces +bouncing +bounded +bounding +boundless +bounties +bountiful +bounty +bounty's +bouquet +bouquet's +bouquets +bourbon +bourbon's +bourgeois +bourgeois's +bourgeoisie +bourgeoisie's +boutique +boutique's +boutiques +bouts +bovine +bovines +bowed +bowel +bowel's +bowels +bowing +bowing's +bowled +bowlegged +bowler +bowler's +bowling +bowling's +bowls +bows +boxcar +boxcar's +boxcars +boxed +boxer +boxer's +boxers +boxing +boxing's +boycott +boycotted +boycotting +boycotts +boyfriend +boyfriend's +boyfriends +boyhood +boyhood's +boyhoods +boyish +bra +bra's +brace +brace's +braced +bracelet +bracelet's +bracelets +braces +bracing +bracketing's +brackish +brag +braggart +braggart's +braggarts +bragged +bragging +brags +braid +braided +braiding +braids +brained +brainier +brainiest +braining +brainless +brainstorm +brainstorm's +brainstormed +brainstorming +brainstorms +brainwash +brainwashed +brainwashes +brainwashing +brainwashing's +brainy +braise +braised +braises +braising +braked +braking +bran +bran's +branched +branching +branching's +brandied +brandies +brandish +brandished +brandishes +brandishing +brandy +brandy's +brandying +bras +brash +brasher +brashest +brassed +brasses +brassier +brassiere +brassiere's +brassieres +brassiest +brassing +brassy +brat +brat's +brats +bravado +bravado's +braved +bravely +braver +bravery +bravery's +braves +bravest +braving +bravo +bravos +brawl +brawl's +brawled +brawling +brawls +brawn +brawn's +brawnier +brawniest +brawny +bray +brayed +braying +brays +brazen +brazened +brazening +brazens +brazier +brazier's +braziers +breached +breaches +breaching +breaded +breading +breads +breadth +breadth's +breadths +breadwinner +breadwinner's +breadwinners +breakable +breakables +breakdowns +breakfasted +breakfasting +breakfasts +breakneck +breakpoints +breakthrough +breakthrough's +breakthroughs +breakwater +breakwater's +breakwaters +breast +breast's +breasted +breasting +breasts +breather +breather's +breathers +breathless +breaths +breathtaking +breded +bredes +breding +breeder +breeder's +breeders +breezed +breezes +breezier +breeziest +breezing +breezy +brevity +brevity's +brew +brewed +breweries +brewery +brewery's +brewing +brewing's +brews +bribe +bribed +bribery +bribery's +bribes +bribing +bricked +bricking +bricklayer +bricklayer's +bricklayers +bridal +bridals +bride +bride's +bridegroom +bridegroom's +bridegrooms +brides +bridesmaid +bridesmaid's +bridesmaids +bridged +bridging +bridle +bridle's +bridled +bridles +bridling +briefcase +briefcase's +briefcases +briefed +briefer +briefest +briefing +briefing's +briefs +brigades +brighten +brightened +brightening +brightens +brights +brilliance +brilliance's +brilliants +brim +brim's +brimmed +brimming +brims +brimstone +brimstone's +brine +brine's +brinier +briniest +brink +brink's +brinks +briny +brisk +brisked +brisker +briskest +brisking +briskly +brisks +bristle +bristle's +bristled +bristles +bristling +britches +brittle +brittler +brittlest +broach +broached +broaches +broaching +broaden +broadened +broadening +broadens +broader +broadest +broads +broadside +broadside's +broadsided +broadsides +broadsiding +brocade +brocade's +brocaded +brocades +brocading +broccoli +broccoli's +brochure +brochure's +brochures +broil +broiled +broiler +broiler's +broilers +broiling +broils +broker +broker's +brokered +brokering +brokers +bronchitis +bronchitis's +bronco +bronco's +broncos +bronze +bronze's +bronzed +bronzes +bronzing +brooch +brooch's +brooches +brood +brood's +brooded +brooding +broods +brook +brook's +brooked +brooking +brooks +broom +broom's +brooms +broth +broth's +brothered +brotherhood +brotherhood's +brotherhoods +brothering +brotherly +broths +brow +brow's +browbeat +browbeaten +browbeating +browbeats +browned +browner +brownest +brownie +brownie's +brownier +brownies +browniest +browning +browning's +browns +brows +bruise +bruised +bruises +bruising +brunch +brunch's +brunched +brunches +brunching +brunette +brunette's +brunettes +brunt +brunt's +brunted +brunting +brunts +brushed +brushes +brushing +brusque +brusquer +brusquest +brutalities +brutality +brutality's +brutally +brute +brute's +brutes +brutish +bubbled +bubbles +bubblier +bubbliest +bubbling +bubbly +bucked +bucketed +bucketing +buckets +bucking +buckle +buckle's +buckled +buckles +buckling +bud +bud's +budded +buddies +budding +buddy +buddy's +budge +budged +budges +budgeted +budgeting +budgets +budging +buds +buff +buff's +buffalo +buffalo's +buffaloed +buffaloes +buffaloing +buffed +buffet +buffet's +buffeted +buffeting +buffets +buffing +buffoon +buffoon's +buffoons +buffs +bugged +buggier +buggies +buggiest +bugging +buggy +buggy's +bugle +bugle's +bugled +bugler +bugler's +buglers +bugles +bugling +builder +builder's +builders +bulbed +bulbing +bulbous +bulge +bulge's +bulged +bulges +bulging +bulked +bulkier +bulkiest +bulking +bulks +bulky +bulldog +bulldog's +bulldogged +bulldogging +bulldogs +bulldoze +bulldozed +bulldozer +bulldozer's +bulldozers +bulldozes +bulldozing +bulled +bullet's +bulletined +bulletining +bulletins +bullfight +bullfight's +bullfighter +bullfighter's +bullfighters +bullfights +bullfrog +bullfrog's +bullfrogs +bullied +bullied's +bullier +bullies +bulliest +bulling +bullion +bullion's +bulls +bully +bully's +bullying +bullying's +bum +bum's +bumblebee +bumblebee's +bumblebees +bummed +bummer +bummest +bumming +bumped +bumper +bumper's +bumpers +bumpier +bumpiest +bumping +bumps +bumpy +bums +bun +bun's +bunched +bunches +bunching +bundled +bundles +bundling +bung +bung's +bungalow +bungalow's +bungalows +bungle +bungled +bungler +bungler's +bunglers +bungles +bungling +bunion +bunion's +bunions +bunk +bunk's +bunked +bunker +bunker's +bunkers +bunking +bunks +bunnies +bunny +bunny's +buns +buoy +buoy's +buoyancy +buoyancy's +buoyant +buoyed +buoying +buoys +burble +burbled +burbles +burbling +burdened +burdening +burdens +burdensome +bureau +bureau's +bureaucracies +bureaucrat +bureaucrat's +bureaucratic +bureaucrats +bureaus +burger +burgers +burglar +burglar's +burglaries +burglars +burglary +burglary's +burgle +burial +burial's +burials +burlap +burlap's +burlier +burliest +burly +burner +burner's +burners +burnish +burnished +burnishes +burnishing +burp +burp's +burped +burping +burps +burr +burr's +burred +burring +burro +burro's +burros +burrow +burrow's +burrowed +burrowing +burrows +burrs +bursar +bursar's +bused +bushed +bushel +bushel's +bushels +bushes +bushier +bushiest +bushing +bushy +busied +busier +busies +busiest +busily +businessman +businessman's +businessmen +businesswoman +businesswoman's +businesswomen +busing +bussed +busted +busting +bustle +bustled +bustles +bustling +busts +busybodies +busybody +busybody's +busying +butcher +butcher's +butchered +butcheries +butchering +butchers +butchery +butchery's +butler +butler's +butlered +butlering +butlers +buts +butt +butt's +butte +butte's +butted +buttercup +buttercup's +buttercups +buttered +butterflied +butterflies +butterfly +butterfly's +butterflying +buttering +buttermilk +buttermilk's +butters +butterscotch +butterscotch's +buttery +buttes +butting +buttock +buttocks +buttoned +buttonhole +buttonhole's +buttonholed +buttonholes +buttonholing +buttoning +buttress +buttress's +buttressed +buttresses +buttressing +butts +buxom +buxomer +buxomest +buyer's +buzz +buzz's +buzzard +buzzard's +buzzards +buzzed +buzzer +buzzer's +buzzers +buzzes +buzzing +byes +bygone +bygones +bypassed +bypasses +bypassing +bystander +bystander's +bystanders +byway +byway's +byways +cab +cab's +cabaret +cabaret's +cabarets +cabbages +cabbed +cabbing +cabin +cabin's +cabinets +cabins +caboose +caboose's +cabooses +cabs +cacao +cacao's +cacaos +cache +cache's +cached +caches +caching +cackle +cackled +cackles +cackling +cacti +cactus +cactus's +cad +cad's +caddied +caddies +cadence +cadence's +cadences +cadet +cadet's +cadets +cafeteria +cafeteria's +cafeterias +cafs +caged +cages +cagey +cagier +cagiest +caging +cajole +cajoled +cajoles +cajoling +caked +caking +calamities +calamity +calamity's +calcium +calcium's +calculators +calculi +calendared +calendaring +calendars +calf +calf's +calibrate +calibrated +calibrates +calibrating +calibration +calibration's +calibrations +calico +calico's +calicoes +callable +callers +calligraphy +calligraphy's +callings +callous +calloused +callouses +callousing +callow +callus +callus's +callused +calluses +callusing +calmed +calmer +calmest +calming +calmly +calmness +calmness's +calms +calorie +calorie's +calories +calve +calves +calves's +camaraderie +camaraderie's +camel +camel's +camels +cameo +cameo's +cameoed +cameoing +cameos +camerae +camouflage +camouflage's +camouflaged +camouflages +camouflaging +campaigner +campaigners +camped +camper +camper's +campers +campest +camping +campused +campuses +campusing +canal +canal's +canals +canaries +canary +canary's +cancellation +cancellation's +cancellations +cancers +candid +candidacies +candidacy +candidacy's +candider +candidest +candidly +candied +candies +candle +candle's +candled +candles +candlestick +candlestick's +candlesticks +candling +candy +candy's +candying +cane +cane's +caned +canes +canine +canines +caning +canister +canister's +canistered +canistering +canisters +canker +canker's +cankered +cankering +cankers +canned +canneries +cannery +cannery's +cannibal +cannibal's +cannibalism +cannibalism's +cannibals +cannier +canniest +canning +cannon +cannon's +cannoned +cannoning +cannons +canny +canoe +canoe's +canoed +canoes +canon +canon's +canons +canopied +canopies +canopy +canopy's +canopying +cantaloupe +cantaloupe's +cantaloupes +cantankerous +canteen +canteen's +canteens +canter +canter's +cantered +cantering +canters +canvas +canvas's +canvased +canvases +canvasing +canvass +canvassed +canvasser +canvassers +canvasses +canvassing +canyon +canyon's +canyons +capabler +capablest +capably +capacitance +capacitance's +capacities +capacitor +capacitor's +capacitors +cape +cape's +caped +caper +caper's +capered +capering +capers +capes +capillaries +capillary +capitalists +capitulate +capitulated +capitulates +capitulating +capped +capping +caprice +caprice's +caprices +capricious +capriciously +capsize +capsized +capsizes +capsizing +capsule +capsule's +capsuled +capsules +capsuling +captained +captaining +captains +caption +caption's +captioned +captioning +captions +captivate +captivated +captivates +captivating +captive +captive's +captives +captivities +captivity +captivity's +captor +captor's +captors +caramel +caramel's +caramels +carat +carat's +carats +caravan +caravan's +caravans +carbohydrate +carbohydrate's +carbohydrates +carbons +carburetor +carburetor's +carburetors +carcass +carcass's +carcasses +carcinogenic +carded +cardiac +cardigan +cardigan's +cardigans +cardinal +cardinal's +cardinals +carding +careered +careering +carefree +carefuller +carefullest +carefulness +carefulness's +carelessly +carelessness +carelessness's +caress +caress's +caressed +caresses +caressing +caretaker +caretaker's +caretakers +cargo +cargo's +cargoes +caribou +caribou's +caribous +caricature +caricature's +caricatured +caricatures +caricaturing +carnage +carnage's +carnal +carnation +carnation's +carnations +carnival +carnival's +carnivals +carnivore +carnivore's +carnivores +carnivorous +carol +carol's +carols +carouse +caroused +carouses +carousing +carp +carp's +carped +carpenter +carpenter's +carpentered +carpentering +carpenters +carpentry +carpentry's +carpeted +carpeting +carpets +carping +carps +carriages +carriageway +carriageway's +carriers +carrion +carrion's +cart +cart's +carted +cartel +cartel's +cartels +cartilage +cartilage's +cartilages +carting +cartographer +cartographer's +cartographers +cartography +cartography's +carton +carton's +cartons +cartooned +cartooning +cartoonist +cartoonist's +cartoonists +carts +cartwheel +cartwheel's +cartwheeled +cartwheeling +cartwheels +carve +carved +carves +carving +carving's +cascade +cascade's +cascaded +cascades +cascading +cashed +cashes +cashew +cashew's +cashews +cashier +cashier's +cashiered +cashiering +cashiers +cashing +cashmere +cashmere's +casings +casino +casino's +casinos +cask +cask's +casket +casket's +caskets +casks +casserole +casserole's +casseroled +casseroles +casseroling +castaway +castaway's +castaways +caste +caste's +casted +caster +caster's +casters +castes +castigate +castigated +castigates +castigating +castings +castled +castles +castling +castoff +castoffs +castrate +castrated +castrates +castrating +casually +casuals +casualties +casualty +casualty's +cataclysm +cataclysm's +cataclysmic +cataclysms +catapult +catapult's +catapulted +catapulting +catapults +cataract +cataract's +cataracts +catastrophe +catastrophe's +catastrophes +catcall +catcall's +catcalled +catcalling +catcalls +catchier +catchiest +catchings +catchment +catchment's +catchy +catechism +catechism's +catechisms +categorical +caterer +caterer's +caterers +caterpillar +caterpillar's +caterpillars +catfish +catfish's +catfishes +cathedrals +catholics +catnap +catnap's +catnapped +catnapping +catnaps +catnip +catnip's +catsup's +catwalk +catwalk's +catwalks +caucus +caucus's +caucused +caucuses +caucusing +cauliflower +cauliflower's +cauliflowers +caulk +caulked +caulking +caulks +causeway +causeway's +causeways +caustic +caustics +cautioned +cautioning +cautions +cautious +cautiously +cavalier +cavaliers +cavalries +cavalry +cavalry's +caveats +caved +cavern +cavern's +caverns +caves +caviar +caviar's +caving +caving's +cavities +cavity +cavity's +cavort +cavorted +cavorting +cavorts +caw +caw's +cawed +cawing +caws +ceasefire +ceaseless +ceaselessly +cedar +cedar's +cedars +cede +ceded +cedes +ceding +ceilings +celebrations +celebrities +celebrity +celebrity's +celery +celery's +celestial +celibacy +celibacy's +celibate +celibate's +celibates +cellar +cellar's +cellars +celled +celling +cellist +cellist's +cellists +cello +cello's +cellophane +cellophane's +cellos +cellulars +cellulose +cellulose's +cement +cement's +cemented +cementing +cements +cemeteries +cemetery +cemetery's +censure +censure's +censured +censures +censuring +census +census's +censused +censuses +censusing +centennial +centennials +centipede +centipede's +centipedes +centraler +centralest +centrals +centrifuge +centrifuge's +cents +ceramic +ceramic's +cereal +cereal's +cereals +cerebral +ceremonial +ceremonials +ceremonies +ceremonious +certainer +certainest +certainties +certificated +certificates +certificating +certified +certifies +certify +certifying +cervical +cessation +cessation's +cessations +chafe +chafed +chafes +chaff +chaff's +chaffed +chaffing +chaffs +chafing +chagrin +chagrin's +chagrined +chagrining +chagrins +chained +chaining +chainsaw +chaired +chairing +chairmen +chairperson +chairpersons +chalet +chalet's +chalets +chalice +chalice's +chalices +chalked +chalkier +chalkiest +chalking +chalks +chalky +challenger +challenger's +challengers +chambers +chameleon +chameleon's +chameleons +champ +champagnes +champed +champing +championed +championing +champions +championship +championship's +championships +champs +chanced +chancellors +chancing +chandelier +chandelier's +chandeliers +changeable +chant +chant's +chanted +chanting +chants +chapels +chaperon +chaperon's +chaperoned +chaperoning +chaperons +chaplain +chaplain's +chaplains +chapped +chapping +characteristically +charcoal +charcoal's +charcoals +chargeable +charger +charger's +chariot +chariot's +chariots +charisma +charisma's +charismatic +charismatics +charitably +charlatan +charlatan's +charlatans +charminger +charmingest +charred +charring +charted +chartered +chartering +charters +charting +chasm +chasm's +chasms +chassis +chassis's +chaste +chasten +chastened +chastening +chastens +chaster +chastest +chastise +chastised +chastisement +chastisement's +chastisements +chastises +chastising +chastity +chastity's +chatter +chatterbox +chatterbox's +chatterboxes +chattered +chattering +chatters +chattier +chattiest +chatty +chauffeur +chauffeur's +chauffeured +chauffeuring +chauffeurs +chauvinist +chauvinist's +chauvinists +cheapen +cheapened +cheapening +cheapens +cheapness +cheapness's +checkout +checkpoint +checkpoint's +checkup +checkup's +checkups +cheeked +cheeking +cheeks +cheep +cheep's +cheeped +cheeping +cheeps +cheered +cheerfuller +cheerfullest +cheerfully +cheerfulness +cheerfulness's +cheerier +cheeriest +cheering +cheery +cheesecloth +cheesecloth's +cheesed +cheeses +cheesing +cheetah +cheetah's +cheetahs +chef +chef's +cheffed +cheffing +chefs +chemically +cherish +cherished +cherishes +cherishing +cherries +cherry +cherry's +cherub +cherub's +cherubim +cherubs +chestnuts +chests +chewier +chewiest +chewy +chi +chi's +chic +chicer +chicest +chick +chick's +chickened +chickening +chicks +chide +chided +chides +chiding +chiefer +chiefest +chiefly +chiefs +chieftain +chieftain's +chieftains +childbirth +childbirth's +childbirths +childed +childes +childhoods +childing +childlike +chili +chili's +chilies +chill +chill's +chilled +chiller +chiller's +chillest +chillier +chillies +chilliest +chilling +chills +chilly +chime +chime's +chimed +chimes +chiming +chimney +chimney's +chimneys +chimp +chimp's +chimpanzee +chimpanzee's +chimpanzees +chimps +chin +china +china's +chink +chink's +chinked +chinking +chinks +chinned +chinning +chins +chintz +chintz's +chipmunk +chipmunk's +chipmunks +chipped +chipper +chippers +chipping +chiropractor +chiropractor's +chiropractors +chirp +chirped +chirping +chirps +chisel +chisel's +chiseled +chiseling +chisels +chivalrous +chivalry +chivalry's +chlorine +chlorine's +chloroform +chloroform's +chloroformed +chloroforming +chloroforms +chlorophyll +chlorophyll's +chocolates +choicer +choicest +choirs +choke +choked +chokes +choking +cholera +cholera's +cholesterol +cholesterol's +choosier +choosiest +choosy +chopper +chopper's +choppered +choppering +choppers +choppier +choppiest +choppy +chorals +chords +chore +chore's +chored +choreographer +choreographer's +choreographers +choreography +choreography's +chores +choring +chortle +chortled +chortles +chortling +chorused +choruses +chorusing +chow +chow's +chowder +chowder's +chowdered +chowdering +chowders +chowed +chowing +chows +christen +christened +christening +christening's +christenings +christens +chrome +chrome's +chromed +chromes +chroming +chromium +chromium's +chromosome +chromosome's +chromosomes +chronic +chronically +chronicle +chronicle's +chronicled +chronicles +chronicling +chronics +chronological +chronologically +chronologies +chronology +chronology's +chrysanthemum +chrysanthemum's +chrysanthemums +chubbier +chubbiest +chubby +chuckle +chuckled +chuckles +chuckling +chug +chug's +chugged +chugging +chugs +chum +chum's +chummed +chummier +chummies +chummiest +chumming +chummy +chums +chunkier +chunkiest +chunky +churn +churn's +churned +churning +churning's +churns +chute +chute's +chutes +ciders +cigar +cigar's +cigarettes +cigars +cinch +cinch's +cinched +cinches +cinching +cinder +cinder's +cindered +cindering +cinders +cinemas +cinnamon +cinnamon's +cipher +cipher's +ciphered +ciphering +ciphers +circled +circling +circuited +circuiting +circuitous +circulars +circulations +circulatory +circumcise +circumcised +circumcises +circumcising +circumcision +circumcision's +circumcisions +circumference +circumference's +circumferences +circumflex +circumflex's +circumstanced +circumstancing +circumstantial +circumstantials +circumvent +circumvented +circumventing +circumvention +circumvention's +circumvents +circus +circus's +circuses +cistern +cistern's +cisterns +citation +citation's +citations +citizenship +citizenship's +citric +citrus +citrus's +citruses +civic +civics +civics's +civilians +civilities +civility +civility's +clack +clacked +clacking +clacks +clad +clairvoyance +clairvoyance's +clairvoyant +clairvoyants +clam +clam's +clamber +clambered +clambering +clambers +clammed +clammier +clammiest +clamming +clammy +clamp +clamp's +clamped +clamping +clamps +clams +clan +clan's +clandestine +clang +clanged +clanging +clangs +clank +clank's +clanked +clanking +clanks +clans +clap +clapped +clapper +clapper's +clappered +clappering +clappers +clapping +claps +claptrap +claptrap's +claret +claret's +clarifications +clarinet +clarinet's +clarinets +clashed +clashing +clasp +clasp's +clasped +clasping +clasps +classifications +classmate +classmate's +classmates +classroom +classroom's +classrooms +classy +clatter +clattered +clattering +clatters +claustrophobia +claustrophobia's +claw +claw's +clawed +clawing +claws +clay +clay's +cleanlier +cleanliest +cleanliness +cleanliness's +cleanse +cleansed +cleanser +cleanser's +cleansers +cleanses +cleansing +clearances +clearings +clearness +clearness's +cleat +cleat's +cleats +cleavage +cleavage's +cleavages +cleave +cleaved +cleaver +cleaver's +cleavers +cleaves +cleaving +clef +clef's +clefs +cleft +clefted +clefting +clefts +clemency +clemency's +clench +clenched +clenches +clenching +clergies +clergy +clergy's +clergyman +clergyman's +clergymen +cleric +cleric's +clerical +clerics +clerk +clerk's +clerked +clerking +clerks +cleverly +cleverness +cleverness's +clichs +clicked +clicking +clicks +clientle +clientle's +clientles +cliffs +climactic +climates +climax +climax's +climaxed +climaxes +climaxing +climber +climber's +climbers +clime +climes +clinch +clinched +clinches +clinching +cling +clinging +clings +clinically +clinics +clink +clinked +clinking +clinks +clipboard +clipboard's +clipboards +clippings +cliques +clitoris +clitoris's +cloak +cloak's +cloaked +cloaking +cloaks +clocked +clocking +clockwise +clockwork +clockwork's +clockworks +clod +clod's +clodded +clodding +clods +clogged +clogging +clogs +cloister +cloister's +cloistered +cloistering +cloisters +closeness +closeness's +closeted +closeting +closets +closures +clot +clot's +clothespin +clothespin's +clothespins +cloths +clots +clotted +clotting +cloudburst +cloudburst's +cloudbursts +clouded +cloudier +cloudiest +clouding +cloudy +clout +clout's +clouted +clouting +clouts +clove +clove's +cloven +clover +clover's +clovers +cloves +clown +clown's +clowned +clowning +clowns +clubbed +clubbing +clubhouse +clubhouse's +clubhouses +cluck +cluck's +clucked +clucking +clucks +clued +clueless +cluing +clump +clump's +clumped +clumping +clumps +clumsier +clumsiest +clumsily +clumsiness +clumsiness's +clung +clustered +clustering +clutch +clutched +clutches +clutching +clutter +cluttered +cluttering +clutters +coached +coaches +coaching +coagulate +coagulated +coagulates +coagulating +coagulation +coagulation's +coaled +coalesce +coalesced +coalesces +coalescing +coaling +coalition +coalition's +coalitions +coals +coarsely +coarsen +coarsened +coarseness +coarseness's +coarsening +coarsens +coarser +coarsest +coastal +coasted +coaster +coaster's +coasters +coasting +coastline +coastline's +coastlines +coasts +coated +coater +coating +coating's +coattest +coax +coaxed +coaxes +coaxing +cob +cob's +cobalt +cobalt's +cobbed +cobbing +cobble +cobble's +cobbler's +cobra +cobra's +cobras +cobs +cobweb +cobweb's +cobwebs +cocaine +cocaine's +cock +cock's +cocked +cockeyed +cockier +cockiest +cocking +cockpit +cockpit's +cockpits +cockroach +cockroach's +cockroaches +cocks +cocktail +cocktail's +cocktails +cocky +cocoa +cocoa's +cocoas +coconut +coconut's +coconuts +cocoon +cocoon's +cocooned +cocooning +cocoons +cod +cod's +codded +codding +cods +coefficient +coefficient's +coefficients +coerce +coerced +coerces +coercing +coercion +coercion's +coexist +coexisted +coexistence +coexistence's +coexisting +coexists +coffees +coffer +coffer's +coffers +coffin +coffin's +coffined +coffining +coffins +cog +cog's +cogency +cogency's +cogent +cognac +cognac's +cognacs +cognitive +cogs +coherence +coherence's +coherently +coil +coiled +coiling +coils +coinage +coinage's +coinages +coincided +coincidences +coincidental +coincidentally +coincides +coinciding +coked +cokes +coking +colander +colander's +colanders +colder +coldest +coldly +coldness +coldness's +colds +colic +colic's +collaborate +collaborated +collaborates +collaborating +collaborations +collaborative +collaborator +collaborator's +collaborators +collage +collage's +collages +collapsible +collarbone +collarbone's +collarbones +collared +collaring +collars +collateral +collateral's +collation +collation's +colleagued +colleaguing +collectively +collectives +collector +collector's +collectors +collegiate +collide +collided +collides +colliding +collie +collie's +collied +collies +collision +collision's +collisions +colloquial +colloquialism +colloquialism's +colloquialisms +colloquials +collusion +collusion's +collying +colonel +colonel's +colonels +colonial +colonials +colonies +colons +colossal +colt +colt's +colts +coma +coma's +comae +comas +comb +comb's +combatant +combatant's +combatants +combated +combating +combats +combed +combing +combs +combustible +combustibles +combustion +combustion's +comeback +comeback's +comedian +comedian's +comedians +comedies +comelier +comeliest +comely +comestible +comestibles +comet +comet's +comets +comforted +comforting +comforts +comical +comings +commandant +commandant's +commandants +commanded +commandeer +commandeered +commandeering +commandeers +commander +commander's +commanders +commanding +commandment's +commando +commando's +commandos +commemorate +commemorated +commemorates +commemorating +commemoration +commemoration's +commemorations +commenced +commencement +commencement's +commencements +commences +commencing +commend +commendable +commendation +commendation's +commendations +commended +commending +commends +commentaries +commentator's +commerce +commerce's +commerced +commerces +commercialism +commercialism's +commercials +commercing +commiserate +commiserated +commiserates +commiserating +commiseration +commiseration's +commiserations +commissioner +commissioner's +commissioners +commodities +commodore +commodore's +commodores +commoner +commoner's +commonest +commonplace +commonplaces +commonwealth +commonwealth's +commonwealths +commotion +commotion's +commotions +commune +communed +communes +communicable +communicative +communicator +communicator's +communing +communion +communion's +communions +communique +communiques +commutative +commute +commuted +commuter +commuter's +commuters +commutes +commuting +compacted +compacter +compactest +compacting +compaction +compaction's +compacts +companions +companionship +companionship's +comparatives +compartment +compartment's +compartments +compass +compass's +compassed +compasses +compassing +compassionate +compatibles +compatriot +compatriot's +compatriots +compensated +compensates +compensating +compensations +competences +competently +competitions +competitor's +compilations +complacency +complacency's +complemented +complementing +complements +completer +completest +complexer +complexes +complexest +complexion +complexion's +complexioned +complexions +complexities +compliance +compliance's +compliant +complication's +complied +complies +complimentary +complimented +complimenting +compliments +complying +composites +compositions +compost +compost's +composted +composting +composts +composure +composure's +compounded +compounding +compounds +comprehended +comprehending +comprehends +comprehensions +comprehensively +comprehensives +compromised +compromises +compromising +compulsions +compulsive +compulsories +compunction +compunction's +compunctions +computations +comrade +comrade's +comrades +comradeship +comradeship's +concatenation +concatenation's +concatenations +concave +concealment +concealment's +conceded +concedes +conceding +conceit +conceit's +conceited +conceits +concentrations +concentric +conceptions +conceptually +concerted +concerting +concertos +concession +concession's +concessions +conciliate +conciliated +conciliates +conciliating +conciliation +conciliation's +concisely +conciseness +conciseness's +conciser +concisest +conclusive +conclusively +concoct +concocted +concocting +concoction +concoction's +concoctions +concocts +concord +concord's +concordance +concordance's +concourse +concourse's +concourses +concreted +concretes +concreting +concurred +concurrence +concurrence's +concurrences +concurrency +concurrent +concurring +concurs +concussion +concussion's +concussions +condemnations +condensation +condensation's +condensations +condescend +condescended +condescending +condescends +condiment +condiment's +condiments +conditionally +conditionals +condolence +condolence's +condolences +condominium +condominium's +condominiums +condoms +condoned +condones +condoning +condor +condor's +condors +conducive +conductors +cone +cone's +cones +confection +confection's +confections +confederacies +confederacy +confederacy's +confederate +confederate's +confederated +confederates +confederating +confederation +confederation's +confederations +confer +conferred +conferrer +conferring +confers +confessed +confesses +confessing +confession +confession's +confessions +confetti +confetti's +confidant +confidant's +confidants +confide +confided +confidences +confidentially +confidently +confides +confiding +configurable +confinement +confinement's +confinements +confirmations +confiscate +confiscated +confiscates +confiscating +confiscation +confiscation's +confiscations +conformed +conforming +conformity +conformity's +conforms +confound +confounded +confounding +confounds +confrontation +confrontation's +confrontations +congeal +congealed +congealing +congeals +congenial +conglomerate +conglomerate's +conglomerated +conglomerates +conglomerating +congratulated +congratulates +congratulating +congregate +congregated +congregates +congregating +congregation +congregation's +congregations +congress +congress's +congresses +congressman +congressman's +congressmen +congresswoman +congresswoman's +congresswomen +congruent +conical +conicals +conifer +conifer's +coniferous +conifers +conjectured +conjectures +conjecturing +conjugal +conjugate +conjugated +conjugates +conjugating +conjugation +conjugation's +conjugations +conjunctions +conjure +conjured +conjures +conjuring +connective +connectivity +connectivity's +connectors +conned +connexion +connexion's +conning +connoisseur +connoisseur's +connoisseurs +connotation's +connote +connoted +connotes +connoting +conquer +conquered +conquering +conqueror +conqueror's +conquerors +conquers +conquest +conquest's +conquests +cons +consciences +conscientious +consciouses +consciousnesses +consecrate +consecrated +consecrates +consecrating +consensuses +consequential +conservatism +conservatism's +conservatories +conservatory +conservatory's +conserve +conserved +conserves +conserving +considerings +consign +consigned +consigning +consignment +consignment's +consignments +consigns +consistencies +consolations +consoled +consoles +consolidate +consolidated +consolidates +consolidating +consolidation +consolidation's +consolidations +consoling +consomm +consonant +consonant's +consonants +consort +consorted +consorting +consortium +consortium's +consorts +conspicuously +conspiracies +conspirator +conspirator's +conspirators +conspire +conspired +conspires +conspiring +constancy +constancy's +constellation +constellation's +constellations +consternation +consternation's +constipation +constipation's +constituencies +constituted +constituting +constitutionally +constitutionals +constitutions +constraint's +constrict +constricted +constricting +constriction +constriction's +constrictions +constricts +construe +construed +construes +construing +consul +consul's +consular +consulars +consulate +consulate's +consulates +consuls +consultations +consumable +consumables +consumerism +consumerism's +consumers +consummate +consummated +consummates +consummating +contagion +contagion's +contagions +contagious +containers +contaminate +contaminated +contaminates +contaminating +contamination +contamination's +contemplation +contemplation's +contemplative +contemplatives +contemporaries +contemptible +contemptuous +contended +contender +contenders +contending +contends +contented +contenting +contentions +contentment +contentment's +contestant +contestant's +contestants +contested +contesting +contests +contextual +contiguous +continentals +continents +contingencies +contingency +contingency's +contingent +contingents +contort +contorted +contorting +contortion +contortion's +contortions +contorts +contoured +contouring +contours +contraband +contraband's +contraceptive +contraceptives +contraction +contraction's +contractions +contractor +contractor's +contractors +contractual +contradictions +contraption +contraption's +contraptions +contraries +contrasted +contrasting +contrasts +contravene +contravenes +contributory +contrite +controllable +controversies +convalesce +convalesced +convalescence +convalescence's +convalescences +convalescent +convalescents +convalesces +convalescing +convection +convection's +convene +convened +convenes +conveniences +convening +convent +convent's +convented +conventing +conventionally +convents +converge +converged +convergence +convergence's +converges +converging +conversant +conversational +conversed +converses +conversing +converters +convertible +convertibles +convex +convexed +convexes +convexing +conveyance +conveyance's +conveyances +conveyed +conveying +conveys +convoluted +convoy +convoy's +convoyed +convoying +convoys +convulse +convulsed +convulses +convulsing +convulsion +convulsion's +convulsions +convulsive +coo +cooed +cooing +cookbook +cookbook's +cookbooks +cooker +cooker's +cookie's +cooler +cooler's +coolers +coolest +coolly +coop +coop's +cooped +cooper +cooper's +cooperated +cooperates +cooperating +cooperative +cooperatives +cooping +coops +coordinated +coordinating +coordinator +coordinator's +coos +cop +cop's +copier +copier's +copiers +copious +copiously +copped +copperhead +copperhead's +copperheads +coppers +copping +cops +copulate +copulation +copulation's +copyrighted +copyrighting +copyrights +coral +coral's +corals +cord +cord's +corded +cordial +cordially +cordials +cording +cordless +cordon +cordon's +cordoned +cordoning +cordons +cords +corduroy +corduroy's +cored +cores +coring +cork +cork's +corked +corking +corks +corkscrew +corkscrew's +corkscrewed +corkscrewing +corkscrews +cornea +cornea's +corneas +corned +cornered +cornering +cornet +cornet's +cornets +cornflakes +cornier +corniest +corning +cornmeal +corns +cornstarch +cornstarch's +corny +corollary +corollary's +coronaries +coronary +coronation +coronation's +coronations +coroner +coroner's +coroners +corporal +corporals +corporations +corps +corps's +corpulent +corpus +corpus's +corpuscle +corpuscle's +corpuscles +corral +corral's +corralled +corralling +corrals +correcter +correctest +corrective +correctness +correctness's +corrector +corrector's +correlated +correlates +correlating +correlations +correspondences +correspondents +correspondingly +corridors +corroborate +corroborated +corroborates +corroborating +corroboration +corroboration's +corrode +corroded +corrodes +corroding +corrosion +corrosion's +corrosive +corrosives +corrupter +corruptest +corruptible +corruptions +corsage +corsage's +corsages +corset +corset's +corseted +corseting +corsets +cortex +cortex's +cosmetic +cosmetic's +cosmetics +cosmonaut +cosmonaut's +cosmonauts +cosmopolitan +cosmopolitan's +cosmopolitans +cosmos +cosmos's +cosmoses +costings +costlier +costliest +costume +costume's +costumed +costumes +costuming +cot +cot's +coting +cots +cottage +cottage's +cottaged +cottages +cottaging +cotted +cottoned +cottoning +cottons +cottontail +cottontail's +cottontails +cottonwood +cottonwood's +cottonwoods +couch +couch's +couched +couches +couching +cougar +cougar's +cougars +coughed +coughing +coughs +counsel's +countable +countdown +countdown's +countdowns +countenance +countenance's +countenanced +countenances +countenancing +counteract +counteracted +counteracting +counteracts +counterattack +counterattack's +counterattacked +counterattacking +counterattacks +counterbalance +counterbalance's +counterbalanced +counterbalances +counterbalancing +counterclockwise +countered +counterfeit +counterfeited +counterfeiting +counterfeits +countering +counterpart's +counters +countersign +countersigned +countersigning +countersigns +countess +countess's +countesses +counties +countryman +countryman's +countrymen +countrysides +coup +coup's +coupling's +coupon +coupon's +coupons +coups +courageous +courageously +couriered +couriering +couriers +coursed +courser +coursing +courted +courteous +courteously +courtesies +courthouse +courthouse's +courthouses +courting +courtroom +courtroom's +courtrooms +courtship +courtship's +courtships +courtyard +courtyard's +courtyards +cousins +cove +cove's +covenant +covenant's +covenanted +covenanting +covenants +covert +covertly +coverts +coves +covet +coveted +coveting +covetous +covets +coward +coward's +cowardice +cowardice's +cowardly +cowards +cowboy +cowboy's +cowboys +cowed +cower +cowered +cowering +cowers +cowgirl +cowgirl's +cowgirls +cowhide +cowhide's +cowhides +cowing +cox +cox's +coy +coyer +coyest +coyote +coyote's +coyotes +cozily +coziness +coziness's +crab +crab's +crabbed +crabbier +crabbiest +crabbing +crabby +crabs +cracker +cracker's +crackers +crackle +crackled +crackles +crackling +crackpot +crackpot's +crackpots +cradle +cradle's +cradled +cradles +cradling +crafted +craftier +craftiest +craftily +crafting +crafts +craftsman +craftsman's +craftsmen +crafty +crag +crag's +craggier +craggiest +craggy +crags +cram +crammed +cramming +cramp's +crams +cranberries +cranberry +cranberry's +crane +crane's +craned +cranes +craning +cranium +cranium's +craniums +crank +crank's +cranked +cranker +crankest +crankier +crankiest +cranking +cranks +cranky +crasser +crassest +crate +crate's +crated +crater +crater's +cratered +cratering +craters +crates +crating +crave +craved +craves +craving +craving's +cravings +crawfish's +crayfish +crayfish's +crayfishes +crayon +crayon's +crayoned +crayoning +crayons +craze +craze's +crazed +crazes +crazier +crazies +craziest +crazily +craziness +craziness's +crazing +creak +creaked +creakier +creakiest +creaking +creaks +creaky +creamed +creamier +creamiest +creaming +creams +creamy +crease +crease's +creased +creases +creasing +creations +creatively +creativity +creativity's +creators +credence +credence's +credential +credentials +creditable +credited +crediting +creditor +creditor's +creditors +credulous +creeds +creek +creek's +creeks +creepier +creepies +creepiest +creeping +creeps +creepy +cremate +cremated +cremates +cremating +cremation +cremation's +cremations +crepe +crepe's +crepes +crept +crescendo +crescendo's +crescendos +crescent +crescent's +crescents +crest +crest's +crested +crestfallen +cresting +crests +cretin +cretin's +cretinous +cretins +crevasse +crevasse's +crevasses +crevice +crevice's +crevices +crewed +crewing +crews +crib +crib's +cribbed +cribbing +cribs +crickets +crimed +criminally +criming +crimson +crimson's +crimsoned +crimsoning +crimsons +cringe +cringed +cringes +cringing +crinkle +crinkled +crinkles +crinkling +cripple +cripple's +crippled +cripples +crippling +crises +crisped +crisper +crispest +crisping +crisply +crispy +crisscross +crisscrossed +crisscrosses +crisscrossing +critic's +critically +critique +critique's +critiqued +critiques +critiquing +croak +croaked +croaking +croaks +crochet +crocheted +crocheting +crochets +crock +crock's +crockery +crockery's +crocks +crocodile +crocodile's +crocodiles +crocus +crocus's +crocuses +crofts +cronies +crony +crony's +crook +crook's +crooked +crookeder +crookedest +crooking +crooks +croon +crooned +crooning +croons +cropped +cropping +croquet +croquet's +crossbow +crossbow's +crossbows +crosser +crossest +crossings +crosswalk +crosswalk's +crosswalks +crosswords +crotch +crotch's +crotches +crouch +crouched +crouches +crouching +crow +crow's +crowbar +crowbar's +crowbars +crowed +crowing +crowned +crowning +crowns +crows +crucially +crucified +crucifies +crucifix +crucifix's +crucifixes +crucifixion +crucifixion's +crucifixions +crucify +crucifying +crudely +cruder +crudest +crudity +crudity's +crueler +cruelest +cruelly +cruels +cruelties +cruiser +cruiser's +cruisers +crumb +crumb's +crumbed +crumbing +crumble +crumbled +crumbles +crumblier +crumblies +crumbliest +crumbling +crumbly +crumbs +crummier +crummiest +crummy +crumple +crumpled +crumples +crumpling +crunchy +crusade +crusade's +crusaded +crusader +crusader's +crusaders +crusades +crusading +crust +crust's +crustacean +crustacean's +crustaceans +crusted +crustier +crusties +crustiest +crusting +crusts +crusty +crutch +crutch's +crutches +crux +crux's +cruxes +crybabies +crybaby +crybaby's +crypt +crypt's +crypts +cub +cub's +cubed +cubes +cubicle +cubicle's +cubicles +cubing +cubs +cuckoos +cucumber +cucumber's +cucumbers +cuddle +cuddled +cuddles +cuddling +cued +cues +cuff +cuff's +cuffed +cuffing +cuffs +cuing +cuisine +cuisine's +cuisines +culinary +cull +culled +culling +culls +culminate +culminated +culminates +culminating +culmination +culmination's +culminations +culpable +culprits +cultivate +cultivated +cultivates +cultivating +cultivation +cultivation's +cults +culturally +cultured +culturing +cunninger +cunningest +cunningly +cupboards +cupful +cupful's +cupfuls +cupped +cupping +cur +cur's +curable +curator +curator's +curators +curd +curd's +curdle +curdled +curdles +curdling +curds +curfew +curfew's +curfews +curio +curio's +curios +curiosities +curiouser +curiousest +curl +curled +curling +curling's +curls +currant +currant's +currants +currencies +currents +curricula +curried +curries +currying +cursed +curses +cursing +cursory +curt +curtail +curtailed +curtailing +curtails +curtained +curtaining +curter +curtest +curtsied +curtsies +curtsy +curtsy's +curtsying +curvature +curvature's +curvatures +curved +curved's +curving +cushion +cushion's +cushioned +cushioning +cushions +custards +custodian +custodian's +custodians +custody +custody's +cutback +cutback's +cutbacks +cuter +cutes +cutest +cuticle +cuticle's +cuticles +cutlery +cutlery's +cutlet +cutlet's +cutlets +cutter +cutter's +cutters +cutthroat +cutthroat's +cutthroats +cuttings +cyanide +cyanide's +cybernetics +cybernetics's +cyclic +cyclist's +cyclone +cyclone's +cyclones +cylinders +cylindrical +cymbal +cymbal's +cymbals +cynicism +cynicism's +cynics +cypress +cypress's +cypresses +cyst +cyst's +cysts +dab +dabbed +dabbing +dabble +dabbled +dabbles +dabbling +dabs +dachshund +dachshund's +dachshunds +dad +dad's +daddies +daddy +daddy's +dads +daemon +daemon's +daffodil +daffodil's +daffodils +dagger +dagger's +daggers +dailies +daintier +dainties +daintiest +daintily +dainty +dairies +dairy +dairy's +dais +dais's +daises +daisies +daisy +daisy's +dallied +dallies +dally +dallying +dam +dam's +dame +dame's +dames +dammed +damming +damneder +damnedest +damped +dampen +dampened +dampening +dampens +damper +dampest +damping +dampness +dampness's +damps +dams +damsel +damsel's +damsels +dancer +dancer's +dancers +dandelion +dandelion's +dandelions +dandier +dandies +dandiest +dandruff +dandruff's +dandy +dandy's +dangered +dangering +dangle +dangled +dangles +dangling +dank +danker +dankest +dapper +dapperer +dapperest +dappers +daredevil +daredevil's +daredevils +darken +darkened +darkening +darkens +darker +darkest +darklier +darkliest +darkly +darlings +darn +darned +darning +darns +dart +dart's +darted +darting +darts +dashboard +dashboard's +dashboards +dastardly +daub +daubed +daubing +daubs +daughters +daunt +daunted +daunting +dauntless +daunts +dawdle +dawdled +dawdles +dawdling +dawned +dawning +dawns +daybreak +daybreak's +daydream +daydream's +daydreamed +daydreaming +daydreams +daze +dazed +dazes +dazing +dazzle +dazzled +dazzles +dazzling +deacon +deacon's +deacons +deaden +deadened +deadening +deadens +deader +deadest +deadlier +deadliest +deadlined +deadlines +deadlining +deadlock +deadlock's +deadlocked +deadlocking +deadlocks +deafer +deafest +deafness +deafness's +dealings +dean +dean's +deaned +deaning +deans +dearer +dearest +dearly +dears +dearth +dearth's +dearths +deathbed +deathbed's +deathbeds +deaves +debase +debased +debasement +debasement's +debasements +debases +debasing +debaucheries +debauchery +debauchery's +debilitate +debilitated +debilitates +debilitating +debilities +debility +debility's +debit +debit's +debited +debiting +debits +debonair +debrief +debriefed +debriefing +debriefs +debris +debris's +debtor +debtor's +debtors +debts +debunk +debunked +debunking +debunks +debut +debut's +debuted +debuting +debuts +decadence +decadence's +decadent +decadents +decanter +decanter's +decanters +decapitate +decapitated +decapitates +decapitating +decayed +decaying +decays +decease +deceased +deceases +deceasing +deceit +deceit's +deceitful +deceitfully +deceits +deceive +deceived +deceives +deceiving +decencies +decency +decency's +decenter +decentest +decently +deception +deception's +deceptions +deceptive +decibel +decibel's +decibels +decidedly +deciduous +decimals +decimate +decimated +decimates +decimating +decipher +deciphered +deciphering +deciphers +decisive +decisively +decked +decking +decks +declension +declension's +decoder +decoder's +decompose +decomposed +decomposes +decomposing +decomposition +decomposition's +decorate +decorated +decorates +decorating +decoration +decoration's +decorations +decorative +decorator +decorator's +decorators +decorous +decorum +decorum's +decoy +decoy's +decoyed +decoying +decoys +decree +decree's +decreed +decreeing +decrees +decrepit +decried +decries +decry +decrying +dedication +dedication's +dedications +deduct +deducted +deducting +deductive +deducts +deeded +deeding +deepen +deepened +deepening +deepens +deeps +deer +deer's +deface +defaced +defaces +defacing +defamation +defamation's +defamatory +defame +defamed +defames +defaming +defaulted +defaulting +defeatist +defeatist's +defecate +defecated +defecates +defecating +defected +defecting +defectives +defendant +defendant's +defendants +defender +defender's +defenders +defensible +defer +deference +deference's +deferential +deferred +deferring +defers +defiance +defiance's +defiant +defiantly +deficiency's +deficient +deficit +deficit's +deficits +defied +defies +defile +defiled +defiles +defiling +definable +deflate +deflated +deflates +deflating +deflation +deflation's +deflect +deflected +deflecting +deflection +deflection's +deflections +deflects +deform +deformed +deforming +deformities +deformity +deformity's +deforms +defraud +defrauded +defrauding +defrauds +defrost +defrosted +defrosting +defrosts +deft +defter +deftest +deftly +defunct +defuncts +defying +degenerated +degenerates +degenerating +dehydrate +dehydrated +dehydrates +dehydrating +deified +deifies +deify +deifying +deign +deigned +deigning +deigns +deities +deject +dejected +dejecting +dejection +dejection's +dejects +delectable +delegate +delegate's +delegated +delegates +delegating +delegation +delegation's +delegations +deleterious +deletions +deli +deli's +deliberated +deliberates +deliberating +deliberation +deliberation's +deliberations +delicacies +delicacy +delicacy's +delicately +delicatessen +delicatessen's +delicatessens +deliciously +delimit +delimited +delimiter +delimiting +delimits +delinquencies +delinquency +delinquency's +delinquent +delinquent's +delinquents +delirious +deliriously +delirium +delirium's +deliriums +delis +deliverance +deliverance's +deliveries +deltas +delude +deluded +deludes +deluding +deluge +deluge's +deluged +deluges +deluging +delusions +deluxe +delve +delved +delves +delving +demagogue +demagogue's +demagogues +demean +demeaned +demeaning +demeans +dementia +dementia's +demerit +demerit's +demerited +demeriting +demerits +demised +demises +demising +democracies +democrat +democrat's +democrats +demolition +demolition's +demolitions +demon +demon's +demons +demonstrably +demonstrative +demonstratives +demonstrator +demonstrator's +demonstrators +demote +demoted +demotes +demoting +demotion +demotion's +demotions +demount +demure +demurely +demurer +demurest +den +den's +denial +denial's +denials +denigrate +denim +denim's +denims +denomination +denomination's +denominations +denominators +denoted +denoting +denounce +denounced +denounces +denouncing +dens +densely +denser +densest +densities +dent +dent's +dental +dented +denting +dentistry +dentistry's +dentists +dents +denunciation +denunciation's +denunciations +deodorant +deodorant's +deodorants +depart +departed +departing +departs +departures +dependable +dependencies +dependency +dependency's +depict +depicted +depicting +depiction +depiction's +depicts +deplete +depleted +depletes +depleting +deplorable +deplore +deplored +deplores +deploring +deport +deportation +deportation's +deportations +deported +deporting +deportment +deportment's +deports +depose +deposed +deposes +deposing +deposited +depositing +deposits +depot +depot's +depots +deprave +depraved +depraves +depraving +depravities +depravity +depravity's +deprecate +deprecated +deprecates +deprecating +depreciate +depreciated +depreciates +depreciating +depreciation +depreciation's +depressingly +depressions +deprivation +deprivation's +deprivations +deputies +derail +derailed +derailing +derailment +derailment's +derailments +derails +derelict +derelicts +deride +derided +derides +deriding +derision +derision's +derivation +derivation's +derivations +derivatives +derrick +derrick's +derricks +descendant +descendant's +descendants +descent +descent's +descents +describable +descriptor +descriptors +desecrate +desecrated +desecrates +desecrating +desecration +desecration's +desegregation +desegregation's +deserter +deserter's +deserters +designation +designation's +designations +desirability +desirability's +desirous +desist +desisted +desisting +desists +desks +desolate +desolated +desolates +desolating +desolation +desolation's +despaired +despairing +despairs +desperation +desperation's +despicable +despised +despises +despising +despondent +despot +despot's +despotic +despots +dessert +dessert's +desserts +destinations +destinies +destiny +destiny's +destitute +destitution +destitution's +destroyer +destroyer's +destroyers +detachable +detachment +detachment's +detachments +detain +detained +detaining +detains +detectives +detectors +detention +detention's +detentions +detergent +detergent's +detergents +deteriorate +deteriorated +deteriorates +deteriorating +deterioration +deterioration's +determinable +determinations +determinism +determinism's +deterministic +deterred +deterrents +deterring +deters +detest +detested +detesting +detests +dethrone +dethroned +dethrones +dethroning +detonate +detonated +detonates +detonating +detonation +detonation's +detonations +detonator +detonator's +detonators +detour +detour's +detoured +detouring +detours +detracted +detracting +detracts +detriment +detriment's +detrimental +detriments +devalue +devastation +devastation's +developer's +deviant +deviate +deviated +deviates +deviating +deviations +devils +devolution +devolution's +devolve +devolved +devolves +devolving +devotee +devotee's +devotees +devotion +devotion's +devotions +devour +devoured +devouring +devours +devout +devouter +devoutest +devoutly +dew +dew's +dexterity +dexterity's +dexterous +diabetes +diabetes's +diabetic +diabetics +diabolical +diagnose +diagnosed +diagnoses +diagnosing +diagonally +diagonals +diagrammed +diagramming +diameters +diametrically +diamond +diamond's +diamonds +diaper +diaper's +diapered +diapering +diapers +diaphragm +diaphragm's +diaphragms +diaries +diatribe +diatribe's +diced +dices +dicing +dictated +dictates +dictating +dictation +dictation's +dictations +dictatorial +dictators +dictatorships +diction +diction's +dieing +dieseled +dieseling +diesels +dietaries +dietary +dieted +dieting +diets +differentiated +differentiates +differentiating +differentiation +differentiation's +diffuse +diffused +diffuses +diffusing +diffusion +diffusion's +digested +digestible +digesting +digestion +digestion's +digestions +digestive +digests +digger +digitally +dignified +dignifies +dignify +dignifying +dignitaries +dignitary +dignitary's +dignities +digress +digressed +digresses +digressing +digression +digression's +digressions +dike +dike's +dikes +dilapidated +dilate +dilated +dilates +dilating +dilation +dilation's +dilemmas +diligence +diligence's +diligent +diligently +dill +dill's +dilled +dilling +dills +dilute +diluted +dilutes +diluting +dilution +dilution's +dime +dime's +dimer +dimes +diminish +diminished +diminishes +diminishing +diminutive +diminutives +dimly +dimmed +dimmer +dimmest +dimming +dimple +dimple's +dimpled +dimples +dimpling +dims +din +din's +diner's +diners +dinghies +dinghy +dinghy's +dingier +dingies +dingiest +dingy +dinned +dinnered +dinnering +dinners +dinning +dinosaur +dinosaur's +dinosaurs +dins +diocese +diocese's +dioceses +dioxide +dioxide's +diphtheria +diphtheria's +diphthong +diphthong's +diphthongs +diploma +diploma's +diplomacy +diplomacy's +diplomas +diplomat +diplomat's +diplomata +diplomatically +diplomatics +diplomats +dipped +dipping +dips +directer +directest +directness +directness's +direr +direst +dirge +dirge's +dirges +dirtied +dirtier +dirties +dirtiest +dirtying +disabilities +disability +disability's +disadvantaged +disadvantageous +disadvantaging +disagreeable +disagreeably +disagreements +disallow +disallowed +disallowing +disallows +disambiguate +disappearance +disappearance's +disappearances +disappointments +disapproval +disapproval's +disapprove +disapproved +disapproves +disapproving +disarm +disarmament +disarmament's +disarmed +disarming +disarms +disarray +disarray's +disarrayed +disarraying +disarrays +disavow +disavowed +disavowing +disavows +disband +disbanded +disbanding +disbands +disbelief +disbelief's +disbelieve +disbelieved +disbelieves +disbelieving +disburse +disbursed +disbursement +disbursement's +disbursements +disburses +disbursing +discern +discerned +discernible +discerning +discerns +discharged +discharges +discharging +disciple +disciple's +disciples +disciplinarian +disciplinarian's +disciplinarians +disciplined +disciplines +disciplining +disclaim +disclaimed +disclaiming +disclaims +disclose +disclosed +discloses +disclosing +disclosure +disclosure's +disclosures +discomfort +discomfort's +discomforted +discomforting +discomforts +disconcert +disconcerted +disconcerting +disconcerts +disconsolate +disconsolately +discontent +discontent's +discontented +discontenting +discontents +discontinuity +discontinuity's +discord +discord's +discordant +discorded +discording +discords +discos +discounted +discounting +discouragement +discouragement's +discouragements +discourse +discourse's +discoursed +discourses +discoursing +discourteous +discourtesies +discourtesy +discourtesy's +discredit +discredited +discrediting +discredits +discreet +discreeter +discreetest +discreetly +discrepancies +discretionary +discriminatory +discus +discus's +discuses +disdain +disdain's +disdained +disdainful +disdaining +disdains +diseased +disembark +disembarkation +disembarkation's +disembarked +disembarking +disembarks +disenchantment +disenchantment's +disengage +disengaged +disengages +disengaging +disentangle +disentangled +disentangles +disentangling +disfigure +disfigured +disfigures +disfiguring +disgrace +disgrace's +disgraced +disgraceful +disgraces +disgracing +disgruntle +disgruntled +disgruntles +disgruntling +disgustingly +dishearten +disheartened +disheartening +disheartens +dished +dishing +dishonestly +dishonesty +dishonesty's +dishwasher +dishwasher's +dishwashers +disillusion +disillusioned +disillusioning +disillusionment +disillusionment's +disillusions +disincentive +disincentive's +disinfect +disinfectant +disinfectant's +disinfectants +disinfected +disinfecting +disinfects +disingenuous +disinherit +disinherited +disinheriting +disinherits +disintegrate +disintegrated +disintegrates +disintegrating +disintegration +disintegration's +disinterested +disjoint +disjointed +disjointing +disjoints +disks +dislocate +dislocated +dislocates +dislocating +dislocation +dislocation's +dislocations +dislodge +dislodged +dislodges +dislodging +disloyal +disloyalty +disloyalty's +dismaler +dismalest +dismally +dismantle +dismantled +dismantles +dismantling +dismay +dismayed +dismaying +dismays +dismember +dismembered +dismembering +dismembers +dismissal +dismissal's +dismissals +dismissive +dismount +dismounted +dismounting +dismounts +disobedience +disobedience's +disobedient +disobey +disobeyed +disobeying +disobeys +disordered +disordering +disorderly +disorders +disown +disowned +disowning +disowns +disparage +disparaged +disparages +disparaging +disparate +disparities +disparity +disparity's +dispassionate +dispassionately +dispatch +dispatched +dispatches +dispatching +dispel +dispelled +dispelling +dispels +dispensaries +dispensary +dispensary's +dispensation +dispensation's +dispensations +dispense +dispensed +dispenser +dispenser's +dispensers +dispenses +dispensing +dispersal +dispersal's +disperse +dispersed +disperses +dispersing +dispersion +dispersion's +displace +displaced +displacement +displacement's +displacements +displaces +displacing +displease +displeased +displeases +displeasing +displeasure +displeasure's +disposables +disposals +dispositions +dispossess +dispossessed +dispossesses +dispossessing +disproportionate +disproportionated +disproportionates +disproportionating +disprove +disproved +disproves +disproving +disputed +disputes +disputing +disqualified +disqualifies +disqualify +disqualifying +disquiet +disquiet's +disquieted +disquieting +disquiets +disregarded +disregarding +disregards +disrepair +disrepair's +disreputable +disrepute +disrepute's +disrespect +disrespect's +disrespected +disrespectful +disrespecting +disrespects +disrupted +disrupting +disruptions +disruptive +disrupts +dissatisfaction +dissatisfaction's +dissatisfied +dissatisfies +dissatisfy +dissatisfying +dissect +dissected +dissecting +dissection +dissection's +dissections +dissects +disseminate +disseminated +disseminates +disseminating +dissemination +dissemination's +dissension +dissension's +dissensions +dissent +dissented +dissenter +dissenter's +dissenters +dissenting +dissents +dissertations +disservice +disservice's +disservices +dissident +dissidents +dissimilarities +dissimilarity +dissimilarity's +dissimilars +dissipate +dissipated +dissipates +dissipating +dissipation +dissipation's +dissociate +dissociated +dissociates +dissociating +dissociation +dissociation's +dissolute +dissolutes +dissolution +dissolution's +dissolve +dissolved +dissolves +dissolving +dissonance +dissonance's +dissonances +dissuade +dissuaded +dissuades +dissuading +distanced +distancing +distantly +distaste +distaste's +distastes +distend +distended +distending +distends +distill +distillation +distillation's +distillations +distilled +distiller +distiller's +distilleries +distillers +distillery +distillery's +distilling +distills +distincter +distinctest +distinctively +distinguishable +distorter +distorter's +distortions +distraction +distraction's +distractions +distraught +distressingly +distributions +distributor +distributor's +distributors +districts +distrust +distrusted +distrustful +distrusting +distrusts +disturbances +disuse +disuse's +disused +disuses +disusing +ditched +ditches +ditching +dither +dithered +dithering +dithers +ditties +dittoed +dittoing +dittos +ditty +ditty's +dived's +diver +diver's +diverge +diverged +divergence +divergence's +divergences +divergent +diverges +diverging +divers +diversified +diversifies +diversify +diversifying +diversion +diversion's +diversions +diversities +divest +divested +divesting +divests +dividend +dividend's +dividends +divined +diviner +divines +divinest +divining +divinities +divinity +divinity's +divisible +divisive +divisor +divisor's +divisors +divorced +divorces +divorcing +divorce +divorce's +divorces +divulge +divulged +divulges +divulging +dizzied +dizzier +dizzies +dizziest +dizziness +dizziness's +dizzy +dizzying +docile +dock +dock's +docked +docking +docks +doctorate +doctorate's +doctored +doctoring +doctrines +documentaries +dodged +dodges +dodging +dodo +dodo's +doe's +doer +doer's +doers +doest +dogged +doggedly +doggerel +doggerel's +dogging +doghouse +doghouse's +doghouses +dogmas +dogmatic +dogmatics +dogwood +dogwood's +dogwoods +doilies +doily +doily's +doldrums +doldrums's +doled +doleful +dolefuller +dolefullest +dolefully +doles +doling +doll +doll's +dolled +dollies +dolling +dolls +dolly +dolly's +dolphin +dolphin's +dolphins +domains +dome +dome's +domed +domes +domesticate +domesticated +domesticates +domesticating +domesticity +domesticity's +domestics +domicile +domicile's +domiciled +domiciles +domiciling +dominance +dominance's +dominants +domination +domination's +doming +dominion +dominion's +dominions +domino +domino's +dominoes +donkey +donkey's +donkeys +donor +donor's +donors +doodle +doodled +doodles +doodling +doored +dooring +doorman +doorman's +doormen +doorstep +doorstep's +doorstepped +doorstepping +doorsteps +doorway +doorway's +doorways +dope +dope's +doped +dopes +dopey +dopier +dopiest +doping +dormant +dormants +dormitories +dormitory +dormitory's +dorsal +dorsals +dos +dosed +dosing +dote +doted +dotes +doting +doubles's +doubly +doubted +doubtfully +doubting +dough +dough's +dour +dourer +dourest +douse +doused +douses +dousing +dove +dove's +doves +dowdier +dowdies +dowdiest +dowdy +downcast +downed +downfall +downfall's +downfalls +downgrade +downgraded +downgrades +downgrading +downhearted +downhills +downier +downiest +downing +downpour +downpour's +downpours +downs +downstream +downtown +downtown's +downward +downy +dowries +dowry +dowry's +doze +dozed +dozes +dozing +drab +drabber +drabbest +drabs +draconian +dragonflies +dragonfly +dragonfly's +dragons +drainage +drainage's +dramas +dramatics +dramatist +dramatist's +dramatists +drape +draped +draperies +drapery +drapery's +drapes +draping +drawbridge +drawbridge's +drawbridges +drawer +drawer's +drawers +drawl +drawled +drawling +drawls +dreadfully +dreamer +dreamer's +dreamers +dreamier +dreamiest +dreamy +drearier +drearies +dreariest +dredge +dredge's +dredged +dredges +dredging +dregs +drench +drenched +drenches +drenching +dresser +dresser's +dressers +dressier +dressiest +dressings +dressmaker +dressmaker's +dressmakers +dressy +dribble +dribbled +dribbles +dribbling +drier +driers +driest +drifted +drifting +drifts +driftwood +driftwood's +drilled +drilling +drills +drinkable +drinker +drinker's +drinkers +drivels +driveway +driveway's +driveways +drizzle +drizzle's +drizzled +drizzles +drizzling +droll +droller +drollest +drone +drone's +droned +drones +droning +drool +drooled +drooling +drools +droop +drooped +drooping +droops +dropout +dropout's +dropouts +droppings +dross +dross's +drought +drought's +droughts +droves +drowse +drowsed +drowses +drowsier +drowsiest +drowsiness +drowsiness's +drowsing +drowsy +drudge +drudge's +drudged +drudgery +drudgery's +drudges +drudging +drugged +drugging +druggist +druggist's +druggists +drugstore +drugstore's +drugstores +drummed +drummer +drummer's +drummers +drumming +drumstick +drumstick's +drumsticks +drunkard +drunkard's +drunkards +drunkenly +drunkenness +drunkenness's +drunker +drunkest +drunks +dryer +dryer's +dryers +dryly +dryness +dryness's +drys +dualism +dualism's +dub +dubbed +dubbing +dubiously +dubs +duchess +duchess's +duchesses +ducked +ducking +duckling +duckling's +duct +duct's +ducts +dud +dud's +dude +dude's +duded +dudes +duding +duds +duel +duel's +duels +dues +duet +duet's +duets +dugout +dugout's +dugouts +duke +duke's +duked +dukes +duking +dulled +duller +dullest +dulling +dullness +dullness's +dulls +dully +dumbbell +dumbbell's +dumbbells +dumbed +dumber +dumbest +dumbfound +dumbfounded +dumbfounding +dumbfounds +dumbing +dumbs +dummies +dumpier +dumpies +dumpiest +dumpling +dumpling's +dumpy +dunce +dunce's +dunces +dune +dune's +dunes +dung +dung's +dunged +dungeon +dungeon's +dungeoned +dungeoning +dungeons +dunging +dungs +dunk +dunked +dunking +dunks +dunno +dunno's +duo +duo's +dupe +dupe's +duped +dupes +duping +duplex +duplex's +duplexes +duplicity +duplicity's +durability +durability's +durable +duress +duress's +dusk +dusk's +duskier +duskiest +dusky +dusted +dustier +dustiest +dusting +dustmen +dustpan +dustpan's +dustpans +dusts +dutiful +dutifully +duvet +duvet's +dwarf +dwarf's +dwarfed +dwarfer +dwarfest +dwarfing +dwarfs +dwell +dweller +dweller's +dwellers +dwelling +dwelling's +dwellings +dwells +dwelt +dwindle +dwindled +dwindles +dwindling +dye +dye's +dyed +dyeing +dyes +dynamical +dynamite +dynamite's +dynamited +dynamites +dynamiting +dynamo +dynamo's +dynamos +dynasties +dynasty +dynasty's +dysentery +dysentery's +dyslexia +dyslexia's +dbutante +dbutante's +dbutantes +eagerer +eagerest +eagerness +eagerness's +eagles +earache +earache's +earaches +eardrum +eardrum's +eardrums +earl +earl's +earls +earmark +earmarked +earmarking +earmarks +earner +earner's +earners +earnest +earnestly +earnestness +earnestness's +earnests +earnings +earring +earring's +earrings +earshot +earshot's +earthed +earthier +earthiest +earthing +earthlier +earthliest +earthly +earthquake +earthquake's +earthquaked +earthquakes +earthquaking +earths +earthworm +earthworm's +earthworms +earthy +eased +easel +easel's +easels +eases +easies +easing +easterlies +easterly +eastward +easygoing +eave +eaves +eavesdrop +eavesdropped +eavesdropping +eavesdrops +ebb +ebbed +ebbing +ebbs +ebonies +ebony +ebony's +eccentricities +eccentricity +eccentricity's +eccentrics +ecclesiastical +eclectic +eclipse +eclipse's +eclipsed +eclipses +eclipsing +ecologically +ecologist +ecologist's +ecologists +economist +economist's +economists +ecosystem +ecosystem's +ecosystems +ecstasies +ecstasy +ecstasy's +ecstatic +ecumenical +eczema +eczema's +eddied +eddies +eddy +eddy's +eddying +edged +edger +edgewise +edgier +edgiest +edging +edgy +edible +edibles +edict +edict's +edicts +edifice +edifice's +edifices +editorials +editorship +editorship's +educations +educator +educator's +educators +eel +eel's +eels +eerie +eerier +eeriest +effected +effecting +effectual +effeminate +effervescent +efficients +effigies +effigy +effigy's +effortless +effortlessly +effusive +effusively +egalitarian +egged +egging +eggplant +eggplant's +eggplants +egocentric +egoism +egoism's +egotism +egotism's +egotist +egotist's +egotists +eigenvalue +eigenvalue's +eighteens +eighteenth +eighteenths +eighths +eighties +eightieth +eightieths +eights +eighty +eighty's +ejaculate +ejaculated +ejaculates +ejaculating +ejaculation +ejaculation's +ejaculations +eject +ejected +ejecting +ejection +ejection's +ejections +ejects +eke +eked +ekes +eking +elaborated +elaborately +elaborates +elaborating +elaboration +elaboration's +elaborations +elapse +elapsed +elapses +elapsing +elastic +elasticity +elasticity's +elastics +elation +elation's +elbow +elbow's +elbowed +elbowing +elbows +elder +elders +eldest +elective +electives +elector +elector's +electorates +electors +electrically +electrician +electrician's +electricians +electrified +electrifies +electrify +electrifying +electrocute +electrocuted +electrocutes +electrocuting +electrocution +electrocution's +electrocutions +electrode +electrode's +electrodes +electrolysis +electrolysis's +electromagnetic +electrons +electrostatic +elegance +elegance's +elegantly +elegies +elegy +elegy's +elemental +elevate +elevated +elevates +elevating +elevation +elevation's +elevations +elevator's +elevens +eleventh +elevenths +elf +elf's +elicit +elicited +eliciting +elicits +eligibility +eligibility's +elimination +elimination's +eliminations +elites +elitism +elitism's +elk +elk's +elks +ellipse +ellipse's +ellipses +ellipsis +elliptic +elliptical +elm +elm's +elms +elongate +elongated +elongates +elongating +elope +eloped +elopement +elopement's +elopements +elopes +eloping +eloquence +eloquence's +eloquent +eloquently +elucidate +elude +eluded +eludes +eluding +elusive +elves +elves's +email +email's +emailed +emailing +emails +emanate +emanated +emanates +emanating +emancipate +emancipated +emancipates +emancipating +emancipation +emancipation's +embalm +embalmed +embalming +embalms +embankment +embankment's +embankments +embargo +embargo's +embargoed +embargoes +embargoing +embark +embarked +embarking +embarks +embarrassments +embassies +embassy +embassy's +embellish +embellished +embellishes +embellishing +embellishment +embellishment's +embellishments +ember +ember's +embers +embezzle +embezzled +embezzlement +embezzlement's +embezzles +embezzling +embitter +embittered +embittering +embitters +emblem +emblem's +emblems +embodied +embodies +embodiment +embodiment's +embody +embodying +emboss +embossed +embosses +embossing +embrace +embraced +embraces +embracing +embroider +embroidered +embroideries +embroidering +embroiders +embroidery +embroidery's +embryo +embryo's +embryonic +embryos +emerald +emerald's +emeralds +emergence +emergence's +emergencies +emergent +emigrant +emigrant's +emigrants +emigrate +emigrated +emigrates +emigrating +emigration +emigration's +emigrations +eminence +eminence's +eminences +emir +emir's +emirs +emissaries +emissary +emissary's +emission +emission's +emissions +emits +emitted +emitting +emotive +empathy +empathy's +emperor +emperor's +emperors +emphases +emphatic +emphatically +emphysema +emphysema's +empires +employments +emporium +emporium's +emporiums +empower +empowered +empowering +empowers +empress +empress's +empresses +emptier +emptiest +emptiness +emptiness's +emulated +emulates +emulating +emulations +emulsion +emulsion's +emulsions +enact +enacted +enacting +enactment +enactment's +enactments +enacts +enamel +enamel's +enamels +encapsulate +encapsulated +encapsulates +encapsulating +encase +encased +encases +encasing +enchant +enchanted +enchanting +enchantment +enchantment's +enchantments +enchants +encircle +encircled +encircles +encircling +enclosure +enclosure's +enclosures +encompass +encompassed +encompasses +encompassing +encore +encored +encores +encoring +encouragements +encroach +encroached +encroaches +encroaching +encrypted +encryption +encryption's +encumber +encumbered +encumbering +encumbers +encumbrance +encumbrance's +encumbrances +encyclopedia +encyclopedia's +encyclopedias +endanger +endangered +endangering +endangers +endear +endeared +endearing +endearment +endearment's +endearments +endears +endemic +endemics +endive +endive's +endives +endorse +endorsed +endorsement +endorsement's +endorsements +endorses +endorsing +endow +endowed +endowing +endowment +endowment's +endowments +endows +endurance +endurance's +endure +endured +endures +enduring +endways +enema +enema's +enemas +energetic +energetically +energetics +energies +enforcement +enforcement's +engagement +engagement's +engagements +engender +engendered +engendering +engenders +engined +engining +engrave +engraved +engraver +engraver's +engravers +engraves +engraving +engraving's +engravings +engross +engrossed +engrosses +engrossing +engulf +engulfed +engulfing +engulfs +enhancements +enigma +enigma's +enigmas +enigmatic +enjoyments +enlargement +enlargement's +enlargements +enlist +enlisted +enlisting +enlistment +enlistment's +enlistments +enlists +enliven +enlivened +enlivening +enlivens +enmities +enmity +enmity's +enormities +enormity +enormity's +enrage +enraged +enrages +enraging +enrich +enriched +enriches +enriching +enrichment +enrichment's +enrolled +enrolling +ensemble +ensemble's +ensembles +enshrine +enshrined +enshrines +enshrining +ensign +ensign's +ensigns +enslave +enslaved +enslaves +enslaving +ensue +ensued +ensues +ensuing +entailed +entailing +entangle +entangled +entanglement +entanglement's +entanglements +entangles +entangling +enterprises +enterprising +entertainer +entertainer's +entertainers +entertainments +enthralled +enthralling +enthusiasms +enthusiast +enthusiast's +enthusiastically +enthusiasts +entice +enticed +enticement +enticement's +enticements +entices +enticing +entomologist +entomologists +entomology +entomology's +entrails +entranced +entrances +entrancing +entrant +entrant's +entrants +entrap +entrapped +entrapping +entraps +entreat +entreated +entreaties +entreating +entreats +entreaty +entreaty's +entrench +entrenched +entrenches +entrenching +entropy +entropy's +entrust +entrusted +entrusting +entrusts +entre +entres +entwine +entwined +entwines +entwining +enumerate +enumerated +enumerates +enumerating +enumeration +enumeration's +enunciate +enunciated +enunciates +enunciating +enunciation +enunciation's +envelop +enveloped +enveloping +envelops +enviable +envied +envies +envious +enviously +environmentally +environs +envoy +envoy's +envoys +envying +enzyme +enzyme's +enzymes +eon +eon's +eons +epaulet +epaulet's +epaulets +ephemeral +epics +epidemic +epidemics +epidermis +epidermis's +epidermises +epilepsy +epilepsy's +epileptic +epileptics +epilogue +epilogue's +epilogued +epilogues +epiloguing +epitaph +epitaph's +epitaphs +epithet +epithet's +epithets +epitome +epitome's +epitomes +epoch +epoch's +epochs +epsilon +epsilon's +equanimity +equanimity's +equated +equates +equating +equator +equator's +equatorial +equators +equestrian +equestrians +equilateral +equilaterals +equine +equines +equinox +equinox's +equinoxes +equitable +equities +equity +equity's +equivalence +equivalence's +equivalently +equivocal +eradicate +eradicated +eradicates +eradicating +eras +erasers +erasure +erasure's +erect +erected +erecting +erection +erection's +erections +erects +ergonomic +erode +eroded +erodes +eroding +erosion +erosion's +erotic +errand +errand's +errands +errant +errants +erratic +erratically +erratics +erred +erring +erroneously +errs +erstwhile +erudite +erupt +erupted +erupting +eruption +eruption's +eruptions +erupts +escalate +escalated +escalates +escalating +escalation +escalation's +escalator +escalator's +escalators +escapade +escapade's +escapades +escapism +escapism's +escort +escort's +escorted +escorting +escorts +especial +espionage +espionage's +essayed +essaying +essences +essentials +estates +esteem +esteemed +esteeming +esteems +estimations +estrangement +estrangement's +estrangements +etch +etched +etches +etching +etching's +etchings +eternally +eternities +ether +ether's +ethereal +ethic's +ethically +ethicals +ethnics +ethos +ethos's +etiquette +etiquette's +etymological +etymologies +eulogies +eulogy +eulogy's +euphemism +euphemism's +euphemisms +eureka +euthanasia +euthanasia's +evacuate +evacuated +evacuates +evacuating +evacuation +evacuation's +evacuations +evade +evaded +evades +evading +evaluations +evangelical +evangelicals +evangelism +evangelism's +evangelist +evangelist's +evangelistic +evangelists +evaporate +evaporated +evaporates +evaporating +evaporation +evaporation's +evasion +evasion's +evasions +evasive +eve +eve's +evener +evenest +evenness +evenness's +eventful +eventualities +eventuality +eventuality's +evergreen +evergreens +everlasting +everlastings +evermore +eves +evict +evicted +evicting +eviction +eviction's +evictions +evicts +evidenced +evidences +evidencing +evidents +evocative +evoke +evoked +evokes +evoking +ewe +ewe's +ewes +exacerbate +exacerbated +exacerbates +exacerbating +exacted +exacter +exactest +exacting +exacts +exaggeration +exaggeration's +exaggerations +exalt +exaltation +exaltation's +exalted +exalting +exalts +examinations +examiners +exampled +exampling +exasperate +exasperated +exasperates +exasperating +exasperation +exasperation's +excavate +excavated +excavates +excavating +excavation +excavation's +excavations +excel +excelled +excellence +excellence's +excellently +excelling +excels +excerpt +excerpt's +excerpted +excerpting +excerpts +excesses +excise +excise's +excised +excises +excising +excitable +excitements +exclaim +exclaimed +exclaiming +exclaims +exclamations +exclusives +excommunicate +excommunicated +excommunicates +excommunicating +excommunication +excommunication's +excommunications +excrement +excrement's +excrete +excreted +excretes +excreting +excruciating +excursion +excursion's +excursions +excusable +excused +excusing +executioner +executioner's +executioners +executions +executives +executor +executor's +executors +exemplary +exemplified +exemplifies +exemplify +exemplifying +exempted +exempting +exemption +exemption's +exemptions +exempts +exert +exerted +exerting +exertion +exertion's +exertions +exerts +exhale +exhaled +exhales +exhaling +exhaustion +exhaustion's +exhibited +exhibiting +exhibitions +exhibits +exhilarate +exhilarated +exhilarates +exhilarating +exhilaration +exhilaration's +exhort +exhortation +exhortation's +exhortations +exhorted +exhorting +exhorts +exhume +exhumed +exhumes +exhuming +exile +exile's +exiled +exiles +exiling +existences +existent +existential +existentially +exodus +exodus's +exoduses +exonerate +exonerated +exonerates +exonerating +exoneration +exoneration's +exorbitant +exotics +expandable +expanse +expanse's +expanses +expansions +expansive +expatriate +expatriated +expatriates +expatriating +expectancy +expectancy's +expectant +expediencies +expediency +expediency's +expedient +expedients +expedite +expedited +expedites +expediting +expeditions +expel +expelled +expelling +expels +expend +expendable +expendables +expended +expending +expenditures +expends +expertly +expiration +expiration's +expletive +expletive's +expletives +explicable +explicits +explorations +explorer +explorer's +explorers +explosives +exponent +exponent's +exponentially +exponents +exported +exporter +exporter's +exporters +exporting +exports +exposition +exposition's +expositions +exposures +expound +expounded +expounding +expounds +expressive +expressively +expressly +expulsion +expulsion's +expulsions +exquisite +extemporaneous +exterior +exterior's +exteriors +exterminate +exterminated +exterminates +exterminating +extermination +extermination's +exterminations +externals +extinct +extincted +extincting +extinctions +extincts +extinguish +extinguished +extinguisher +extinguisher's +extinguishers +extinguishes +extinguishing +extol +extolled +extolling +extols +extort +extorted +extorting +extortion +extortion's +extortionate +extorts +extractions +extracurricular +extracurriculars +extradite +extradited +extradites +extraditing +extradition +extradition's +extraditions +extraordinaries +extrapolate +extrapolated +extrapolates +extrapolating +extrapolation +extrapolation's +extrapolations +extraterrestrial +extraterrestrials +extravagance +extravagance's +extravagances +extravagant +extravagantly +extremer +extremest +extremists +extremities +extremity +extremity's +extricate +extricated +extricates +extricating +extrovert +extrovert's +extroverts +exuberance +exuberance's +exuberant +exude +exuded +exudes +exuding +exult +exultant +exultation +exultation's +exulted +exulting +exults +eyeball +eyeball's +eyeballed +eyeballing +eyeballs +eyebrow +eyebrow's +eyebrows +eyed +eyelash +eyelash's +eyelashes +eyelid +eyelid's +eyelids +eyesore +eyesore's +eyesores +eyewitness +eyewitness's +eyewitnesses +fable +fable's +fables +fabricate +fabricated +fabricates +fabricating +fabrication +fabrication's +fabrications +fabrics +fabulous +facade +facade's +facades +faceless +facet +facet's +faceted +faceting +facetious +facets +facial +facials +facile +facilitated +facilitates +facilitating +facsimile +facsimile's +facsimiled +facsimileing +facsimiles +faction +faction's +factions +factored +factorial +factorial's +factoring +fad +fad's +fade +faded +fades +fading +fading's +fads +failings +fainted +fainting +faintly +faints +fairies +fairs +faithed +faithfully +faithfulness +faithfulness's +faithfuls +faithing +faithless +faiths +faked +fakes +faking +falcon +falcon's +falconry +falconry's +falcons +fallacies +fallible +fallout +fallout's +falsehood +falsehood's +falsehoods +falsely +falser +falsest +falsetto +falsetto's +falsettos +falsification +falsification's +falsifications +falsified +falsifies +falsify +falsifying +falsities +falsity +falsity's +falter +faltered +faltering +falters +famed +familiars +famines +fanatic +fanatic's +fanatical +fanatics +fancied +fancier +fancies +fanciest +fanciful +fancying +fanfare +fanfare's +fanfares +fang +fang's +fangs +fanned +fanning +fantasied +fantastically +fantasying +faraway +farces +fared +fares +farewells +faring +farmed +farmer's +farming +farming's +farmland +farmland's +farms +fascination +fascination's +fascinations +fascism +fascism's +fascists +fashionably +fasted +fasten +fastened +fastener +fastener's +fasteners +fastening +fastening's +fastenings +fastens +fastidious +fasting +fasts +fatalistic +fatalities +fatality +fatality's +fatally +fated +fateful +fates +fathered +fatherhood +fatherhood's +fathering +fatherland +fatherland's +fatherlands +fatherly +fathom +fathom's +fathomed +fathoming +fathoms +fatigue +fatigue's +fatigued +fatigues +fatiguing +fating +fats +fatten +fattened +fattening +fattens +fatter +fattest +fattier +fatties +fattiest +fatty +faucet's +faucets +faulted +faultier +faultiest +faulting +faultless +fauna +fauna's +faunas +fawn +fawn's +fawned +fawning +fawns +faze +fazed +fazes +fazing +fearful +fearfuller +fearfullest +fearfully +fearless +fearlessly +fearsome +feast +feast's +feasted +feasting +feasts +feather +feather's +feathered +featherier +featheriest +feathering +feathers +feathery +feats +feces +federalism +federalism's +federalist +federalist's +federalists +federals +federation +federation's +federations +feds +feebler +feeblest +feeder +feeder's +feeders +feeler +feeler's +feelers +feign +feigned +feigning +feigns +feint +feint's +feinted +feinting +feints +feline +felines +felled +feller +fellest +felling +fellowship +fellowship's +fellowships +fells +felon +felon's +felonies +felons +felony +felony's +felted +felting +felts +feminine +feminines +femininity +femininity's +feminism +feminism's +feminist's +fen +fen's +fenced +fences +fencing +fencing's +fend +fended +fending +fends +ferment +ferment's +fermentation +fermentation's +fermented +fermenting +ferments +fern +fern's +ferns +ferocious +ferociously +ferocity +ferocity's +ferret +ferret's +ferreted +ferreting +ferrets +ferried +ferries +ferry +ferry's +ferrying +fertile +fertility +fertility's +fervent +fervently +fester +festered +festering +festers +festivals +festive +festivities +festivity +festivity's +festoon +festoon's +festooned +festooning +festoons +fetched +fetches +fetching +feted +fetid +feting +fetish +fetish's +fetishes +fetter +fetter's +fettered +fettering +fetters +feud +feud's +feudal +feudalism +feudalism's +feuded +feuding +feuds +feverish +feverishly +fevers +fez +fez's +fezzes +fianc +fianc's +fiance +fiances +fiancs +fiasco +fiasco's +fiascoes +fib +fib's +fibbed +fibber +fibber's +fibbers +fibbing +fibs +fiche +fiche's +fickle +fickler +ficklest +fictions +fictitious +fiddler +fiddler's +fiddlers +fiddly +fidelity +fidelity's +fidget +fidgeted +fidgeting +fidgets +fidgety +fielded +fielding +fiend +fiend's +fiendish +fiendishly +fiends +fiercely +fierceness +fierceness's +fiercer +fiercest +fierier +fieriest +fiery +fiesta +fiesta's +fiestas +fifteens +fifteenth +fifteenths +fifths +fifties +fiftieth +fiftieths +fig +fig's +figged +figging +fighters +figment +figment's +figments +figs +figurative +figuratively +figurehead +figurehead's +figureheads +filament +filament's +filaments +filch +filched +filches +filching +filler +filler's +fillet +fillet's +filleted +filleting +fillets +fillies +filly +filly's +filmier +filmiest +filming's +filmy +filth +filth's +filthier +filthiest +fin +fin's +finale +finale's +finales +finalist +finalist's +finalists +finality +finality's +financed +financier +financier's +financiers +financing +finch +finch's +finches +finely +finesse +finesse's +finessed +finesses +finessing +fingered +fingering +fingernail +fingernail's +fingernails +fingerprint +fingerprint's +fingerprinted +fingerprinting +fingerprints +fingertip +fingertip's +fingertips +finickier +finickiest +finicky +finner +fins +fir +fir's +firearm +firearm's +firearms +firecracker +firecracker's +firecrackers +firefighter +firefighters +fireflies +firefly +firefly's +fireman +fireman's +firemen +fireplace +fireplace's +fireplaces +fireproof +fireproofed +fireproofing +fireproofs +fireside +fireside's +firesides +firewood +firewood's +firework's +firmed +firmer +firmest +firming +firmness +firmness's +firmware +firmware's +firring +firs +firsthand +firsts +fiscals +fisher +fisher's +fisheries +fisherman +fisherman's +fishermen +fishery +fishery's +fishier +fishiest +fishy +fission +fission's +fissure +fissure's +fissures +fist +fist's +fists +fitful +fitness +fitness's +fitter +fittest +fittings +fives +fixable +fixation +fixation's +fixations +fixture +fixture's +fixtures +fizz +fizzed +fizzes +fizzing +fizzle +fizzled +fizzles +fizzling +flabbier +flabbiest +flabby +flagpole +flagpole's +flagpoles +flagrant +flagrantly +flagship +flagship's +flagships +flagstone +flagstone's +flagstones +flail +flail's +flailed +flailing +flails +flair +flair's +flairs +flak +flak's +flake +flake's +flaked +flakes +flakier +flakiest +flaking +flaky +flamboyance +flamboyance's +flamboyant +flamboyantly +flamed +flaming +flamingo +flamingo's +flamingos +flammable +flammables +flank +flank's +flanked +flanking +flanks +flannel +flannel's +flannels +flap +flapjack +flapjack's +flapjacks +flapped +flapping +flaps +flare +flared +flares +flaring +flashback +flashback's +flashbacks +flasher +flashest +flashier +flashiest +flashlight +flashlight's +flashlights +flashy +flask +flask's +flasks +flat's +flatly +flatness +flatness's +flats +flatted +flatten +flattened +flattening +flattens +flatter +flattered +flatterer +flatterer's +flatterers +flattering +flatters +flattery +flattery's +flattest +flatting +flaunt +flaunted +flaunting +flaunts +flawless +flawlessly +flea +flea's +fleas +fleck +fleck's +flecked +flecking +flecks +fled +fledged +fledgling +fledgling's +fledglings +flee +fleece +fleece's +fleeced +fleeces +fleecier +fleeciest +fleecing +fleecy +fleeing +flees +fleeted +fleeter +fleetest +fleeting +fleets +fleshed +fleshes +fleshier +fleshiest +fleshing +fleshy +flex +flex's +flexed +flexes +flexibly +flexing +flick +flicked +flicker +flickered +flickering +flickers +flicking +flicks +flier +flier's +fliers +fliest +flightier +flightiest +flightless +flights +flighty +flimsier +flimsiest +flimsiness +flimsiness's +flimsy +flinch +flinched +flinches +flinching +fling +flinging +flings +flint +flint's +flints +flippant +flipper +flipper's +flippers +flippest +flirt +flirtation +flirtation's +flirtations +flirtatious +flirted +flirting +flirts +flit +flits +flitted +flitting +flock +flock's +flocked +flocking +flocks +flog +flogged +flogging +flogging's +flogs +flooder +floodlight +floodlight's +floodlighted +floodlighting +floodlights +floored +flooring +flooring's +flop +flopped +floppier +floppies +floppiest +flopping +flops +flora +flora's +floral +floras +florid +florist +florist's +florists +floss +floss's +flossed +flosses +flossing +flotilla +flotilla's +flotillas +flounce +flounced +flounces +flouncing +flounder +floundered +floundering +flounders +floured +flouring +flourish +flourished +flourishes +flourishing +flours +flout +flouted +flouting +flouts +flowered +flowerier +floweriest +flowering +flowery +flu +flu's +fluctuate +fluctuated +fluctuates +fluctuating +fluctuation's +flue +flue's +fluency +fluency's +fluently +fluents +flues +fluff +fluff's +fluffed +fluffier +fluffiest +fluffing +fluffs +fluids +fluke +fluke's +fluked +flukes +fluking +flung +flunk +flunked +flunkies +flunking +flunks +flunky +flunky's +fluorescent +flurried +flurries +flurry +flurry's +flurrying +flusher +flushest +fluster +flustered +flustering +flusters +fluted +flutes +fluting +flutist +flutist's +flutists +flutter +fluttered +fluttering +flutters +flux +flux's +fluxed +fluxes +fluxing +flyer's +flyover +flyover's +flyovers +foal +foal's +foaled +foaling +foals +foamed +foamier +foamiest +foaming +foams +foamy +focal +foci's +focused +focuses +focusing +fodder +fodder's +fodders +foe +foe's +foes +fogged +foggier +foggiest +fogging +foggy +foghorn +foghorn's +foghorns +fogs +foible +foible's +foibles +foil +foiled +foiling +foils +foist +foisted +foisting +foists +foliage +foliage's +folklore +folklore's +folksier +folksiest +folksy +follies +follower's +followings +folly +folly's +foment +fomented +fomenting +foments +fonded +fonder +fondest +fonding +fondle +fondled +fondles +fondling +fondly +fondness +fondness's +fonds +foodstuff +foodstuff's +foodstuffs +foolhardier +foolhardiest +foolhardy +foolisher +foolishest +foolishly +foolishness +foolishness's +foolproof +footage +footage's +footballs +footed +foothill +foothill's +foothills +foothold +foothold's +footholds +footing +footing's +footings +footlights +footnoted +footnoting +footpath +footpath's +footpaths +footprint +footprint's +footprints +foots +footstep +footstep's +footsteps +footstool +footstool's +footstools +footwear +footwear's +footwork +footwork's +forage +forage's +foraged +forages +foraging +foray +foray's +forayed +foraying +forays +forbear +forbearance +forbearance's +forbearing +forbears +forbiddings +forbore +forborne +forceful +forcefully +forceps +forceps's +forcible +ford +ford's +forded +fording +fords +fore +forearm +forearm's +forearmed +forearming +forearms +forebode +foreboded +forebodes +foreboding +foreboding's +forebodings +forefather +forefather's +forefathers +forefinger +forefinger's +forefingers +forefront +forefront's +forefronts +foregoing +foregoings +foregone +foreground +foreground's +foregrounded +foregrounding +foregrounds +forehead +forehead's +foreheads +foreigner's +foreleg +foreleg's +forelegs +foreman +foreman's +foremen +foremost +forensic +forensics +foreplay +foreplay's +forerunner +forerunner's +forerunners +fores +foresaw +foresee +foreseeing +foreseen +foresees +foreshadow +foreshadowed +foreshadowing +foreshadows +foresight +foresight's +foreskin +foreskin's +foreskins +forestall +forestalled +forestalling +forestalls +forested +foresting +forestry +forestry's +foretaste +foretaste's +foretasted +foretastes +foretasting +foretell +foretelling +foretells +forethought +forethought's +foretold +forewarn +forewarned +forewarning +forewarns +forewent +foreword +foreword's +forewords +forfeit +forfeit's +forfeited +forfeiting +forfeits +forge +forge's +forged +forger +forger's +forgeries +forgers +forgery +forgery's +forges +forgetful +forgetfulness +forgetfulness's +forging +forgiveness +forgiveness's +forgo +forgoes +forgoing +forgone +forked +forking +forks +forlorn +forlorner +forlornest +formalities +formality +formality's +formals +formations +formative +formidable +formless +formulate +formulated +formulates +formulating +formulations +fornication +fornication's +forsake +forsaken +forsakes +forsaking +forsook +forswear +forswearing +forswears +forswore +forsworn +fort +fort's +forte +forte's +fortes +forthright +forthwith +forties +fortieth +fortieths +fortification +fortification's +fortifications +fortified +fortifies +fortify +fortifying +fortitude +fortitude's +fortnightly +fortress +fortress's +fortressed +fortresses +fortressing +forts +fortuitous +fortunes +forums +forwarder +forwardest +forwent +fossils +foster +fostered +fostering +fosters +fouled +fouler +foulest +fouling +fouls +founder +founder's +foundered +foundering +founders +foundling +foundling's +foundries +foundry +foundry's +fount +fount's +fountained +fountaining +fountains +founts +fours +fourteens +fourteenth +fourteenths +fourths +fowl +fowl's +fowled +fowling +fowls +fox +fox's +foxed +foxes +foxier +foxiest +foxing +foxy +foyer +foyer's +foyers +fracas +fracas's +fracases +fractal +fractional +fracture +fracture's +fractured +fractures +fracturing +fragility +fragility's +fragmentary +fragmentation +fragmentation's +fragmented +fragmenting +fragrance +fragrance's +fragrances +fragrant +frail +frailer +frailest +frailties +frailty +frailty's +framed +frameworks +framing +franc +franc's +franchise +franchise's +franchised +franchises +franchising +francs +franked +franker +frankest +frankfurter +frankfurter's +frankfurters +franking +franks +frantically +fraternal +fraternities +fraternity +fraternity's +frauds +fraudulent +fraudulently +fraught +fraughted +fraughting +fraughts +fray +fray's +frayed +fraying +frays +freaked +freaking +freckle +freckle's +freckled +freckles +freckling +freedoms +freehand +freelance +freelance's +freer +freest +freezer +freezer's +freezers +freight +freight's +freighted +freighter +freighter's +freighters +freighting +freights +frenzied +frenzies +frenzy +frenzy's +frequented +frequenter +frequentest +frequenting +frequents +freshen +freshened +freshening +freshens +fresher +fresher's +freshest +freshly +freshman +freshman's +freshmen +freshness +freshness's +freshwater +freshwater's +fret +fretful +fretfully +frets +fretted +fretting +friar +friar's +friars +friendlier +friendlies +friendliest +friendliness +friendliness's +friendships +frieze +frieze's +friezed +friezes +friezing +frigate +frigate's +frigates +fright +fright's +frighted +frighteningly +frightful +frightfully +frighting +frights +frigid +frigidity +frigidity's +frill +frill's +frillier +frillies +frilliest +frills +frilly +fringed +fringes +fringing +frisk +frisked +friskier +friskiest +frisking +frisks +frisky +fritter +frittered +frittering +fritters +frivolities +frivolity +frivolity's +frizzier +frizziest +frizzy +fro +frock +frock's +frocks +frolic +frolic's +frolicked +frolicking +frolics +frond +frond's +fronds +frontage +frontage's +frontages +frontal +fronted +frontier +frontier's +frontiers +fronting +fronts +frost +frost's +frostbit +frostbite +frostbite's +frostbites +frostbiting +frostbitten +frosted +frostier +frostiest +frosting +frosting's +frosts +frosty +froth +froth's +frothed +frothier +frothiest +frothing +froths +frothy +frugal +frugality +frugality's +frugally +fruited +fruitful +fruitfuller +fruitfullest +fruitier +fruitiest +fruiting +fruition +fruition's +fruitless +fruitlessly +fruity +frustrations +fudged +fudges +fudging +fuels +fugitive +fugitive's +fugitives +fulcrum +fulcrum's +fulcrums +fulled +fulling +fullness +fullness's +fulls +fumble +fumbled +fumbles +fumbling +fumed +fumigate +fumigated +fumigates +fumigating +fumigation +fumigation's +fuming +functionally +fundamentalism +fundamentalism's +fundamentalists +fundamentals +funerals +fungi +fungi's +fungicide +fungicide's +fungicides +fungus +fungus's +funnel +funnel's +funnels +funner +funnest +funnies +funnily +furies +furious +furiously +furl +furled +furling +furlong +furlong's +furlongs +furlough +furlough's +furloughed +furloughing +furloughs +furls +furnace +furnace's +furnaces +furnish +furnished +furnishes +furnishing +furnishings +furor +furor's +furors +furred +furrier +furriest +furring +furrow +furrow's +furrowed +furrowing +furrows +furs +furthered +furthering +furthers +furtive +furtively +furtiveness +furtiveness's +fury +fury's +fused +fuselage +fuselage's +fuselages +fuses +fusing +fussed +fusses +fussier +fussiest +fussing +futility +futility's +futures +futuristic +fuzz +fuzz's +fuzzed +fuzzes +fuzzier +fuzziest +fuzzing +fte +fte's +ftes +gab +gabbed +gabbing +gable +gable's +gabled +gables +gabling +gabs +gadget +gadget's +gadgets +gag +gagged +gagging +gags +gaiety +gaiety's +gaily +gainful +gait +gait's +gaits +gal +gal's +gala +gala's +galas +galaxies +gale +gale's +gales +gall +gall's +gallant +gallantry +gallantry's +gallants +galled +galleried +galleries +gallery +gallery's +gallerying +galley +galley's +galleys +galling +gallivant +gallivanted +gallivanting +gallivants +gallon +gallon's +gallons +gallop +galloped +galloping +gallops +gallows +gallows's +galls +galore +galores +gals +gambit +gambit's +gambits +gamble +gambled +gambler +gambler's +gamblers +gambles +gambling +gamed +gamer +gamest +gaming +gaming's +gamma +gamma's +gamut +gamut's +gamuts +gander +gander's +ganders +ganged +ganging +gangling +gangplank +gangplank's +gangplanks +gangrene +gangrene's +gangrened +gangrenes +gangrening +gangs +gangster +gangster's +gangsters +gangway +gangway's +gangways +gaol +gaol's +gape +gaped +gapes +gaping +garaged +garages +garaging +garb +garb's +garbed +garbing +garbs +gardened +gardener +gardener's +gardeners +gardenia +gardenia's +gardenias +gardening +gargle +gargled +gargles +gargling +gargoyle +gargoyle's +gargoyles +garish +garland +garland's +garlanded +garlanding +garlands +garlic +garlic's +garlicked +garlicking +garlics +garment +garment's +garments +garnet +garnet's +garnets +garnish +garnished +garnishes +garnishing +garret +garret's +garrets +garrison +garrison's +garrisoned +garrisoning +garrisons +garrulous +garter +garter's +garters +gaseous +gases +gash +gashed +gashes +gashing +gasket +gasket's +gaskets +gasped +gasping +gasps +gassed +gassing +gastric +gated +gateways +gatherings +gating +gaudier +gaudiest +gaudy +gaunt +gaunted +gaunter +gauntest +gaunting +gauntlet +gauntlet's +gauntlets +gaunts +gauze +gauze's +gavel +gavel's +gavels +gawk +gawk's +gawked +gawkier +gawkies +gawkiest +gawking +gawks +gawky +gayer +gayest +gays +gaze +gazed +gazelle +gazelle's +gazelles +gazes +gazette +gazette's +gazetted +gazettes +gazetting +gazing +gearing's +gee +geed +geeing +gees +geese +geese's +gel +gel's +gelatin +gelatin's +geld +gelded +gelding +gelding's +geldings +gelds +gem +gem's +gems +genders +genealogical +genealogies +genealogy +genealogy's +genera +genera's +generality +generality's +generals +generics +generosities +generosity +generosity's +generously +geneses +genesis +genesis's +geneticist +geneticist's +geneticists +genial +genially +genie +genie's +genies +genii +genital +genitals +geniuses +genres +gent +gent's +gentile +gentiles +gentility +gentility's +gentled +gentleness +gentleness's +gentler +gentles +gentlest +gentling +gentries +gentry +gentry's +gents +genuineness +genuineness's +genus +geographic +geographically +geographies +geological +geologies +geologist +geologists +geometric +geometries +geranium +geranium's +geraniums +gerbil +gerbil's +gerbils +germ +germ's +germicide +germicide's +germicides +germinate +germinated +germinates +germinating +germination +germination's +germs +gestation +gestation's +gesticulate +gesticulated +gesticulates +gesticulating +gestured +gestures +gesturing +getaway +getaway's +getaways +geyser +geyser's +geysers +ghastlier +ghastliest +ghetto +ghetto's +ghettos +ghosted +ghosting +ghostlier +ghostliest +ghostly +ghosts +ghoul +ghoul's +ghouls +giants +gibber +gibbered +gibbering +gibbers +gibe +gibed +gibes +gibing +giddier +giddiest +giddiness +giddiness's +giddy +gifted +gifting +gigantic +gigged +gigging +giggle +giggled +giggles +giggling +gigs +gild +gilded +gilding +gilds +gill +gill's +gills +gilt +gilts +gimme +gimmick +gimmick's +gimmicks +ginger +ginger's +gingerbread +gingerbread's +gingerly +gingham +gingham's +ginned +ginning +gins +giraffe +giraffe's +giraffes +girder +girder's +girders +girdle +girdle's +girdled +girdles +girdling +girlfriends +girlhood +girlhood's +girlhoods +girlish +girth +girth's +girths +gist +gist's +givens +gizzard +gizzard's +gizzards +glacial +glacier +glacier's +glaciers +gladden +gladdened +gladdening +gladdens +gladder +gladdest +glade +glade's +glades +gladiator +gladiator's +gladiators +gladlier +gladliest +glads +glamorous +glanced +glances +glancing +gland +gland's +glands +glandular +glare +glared +glares +glaring +glassed +glassier +glassiest +glassing +glassware +glassware's +glassy +glaze +glazed +glazes +glazing +glazing's +gleam +gleam's +gleamed +gleaming +gleams +glee +glee's +glen +glen's +glens +glib +glibber +glibbest +glibly +glide +glided +glider +glider's +gliders +glides +gliding +glimmer +glimmered +glimmering +glimmers +glimpse +glimpse's +glimpsed +glimpses +glimpsing +glint +glinted +glinting +glints +glisten +glistened +glistening +glistens +glitter +glittered +glittering +glitters +gloat +gloated +gloating +gloats +globe +globe's +globes +globular +globule +globule's +globules +gloom +gloom's +gloomier +gloomiest +gloomy +gloried +glories +glorification +glorification's +glorified +glorifies +glorify +glorifying +gloriously +glorying +gloss +gloss's +glossaries +glossary +glossary's +glossed +glosses +glossier +glossies +glossiest +glossing +glove's +gloved +gloving +glower +glowered +glowering +glowers +glucose +glucose's +glued +glues +gluing +glum +glummer +glummest +glums +glut +glut's +gluts +glutted +glutting +glutton +glutton's +gluttons +gluttony +gluttony's +glycerin +glycerin's +gnarl +gnarled +gnarling +gnarls +gnash +gnashed +gnashes +gnashing +gnat +gnat's +gnats +gnaw +gnawed +gnawing +gnaws +gnomes +gnu +gnu's +gnus +goad +goad's +goaded +goading +goads +goaled +goalie +goalie's +goalies +goaling +goalkeeper +goalkeeper's +goalkeepers +goatee +goatee's +goatees +goats +gob +gob's +gobbed +gobbing +gobble +gobbled +gobbles +gobbling +goblet +goblet's +goblets +goblin +goblin's +goblins +gobs +godchild +godchild's +godchildren +goddess +goddess's +goddesses +godfather +godfather's +godfathers +godless +godlier +godliest +godlike +godly +godmother +godmother's +godmothers +godparent +godparent's +godparents +godsend +godsend's +godsends +goggle +goggles +goldener +goldenest +golder +goldest +golds +goldsmith +goldsmith's +goldsmiths +golfed +golfer +golfer's +golfers +golfing +golfs +gondola +gondola's +gondolas +goner +goner's +goners +gong +gong's +gonged +gonging +gongs +gonna +goo +goo's +goodnight +goodwill +goodwill's +gooey +goof +goof's +goofed +goofier +goofiest +goofing +goofs +goofy +gooier +gooiest +goon +goon's +goons +goose +goose's +goosed +gooses +goosing +gopher +gopher's +gophers +gore +gore's +gored +gores +gorge +gorge's +gorged +gorges +gorging +gorier +goriest +gorilla +gorilla's +gorillas +goring +gory +gos +gosh +gosling +gosling's +gospels +gossamer +gossamer's +gossips +gouge +gouged +gouges +gouging +goulash +goulash's +goulashes +gourd +gourd's +gourds +gourmet +gourmet's +gourmets +gout +gout's +governess +governess's +governesses +governmental +governors +gowned +gowning +gowns +grabber +graced +graceful +gracefuller +gracefullest +gracefully +graceless +graces +gracing +gracious +graciously +graciousness +graciousness's +gradation +gradation's +gradations +graded +grader +gradient +gradient's +gradients +grading +graduations +graft +graft's +grafted +grafting +grafts +grains +gram +gram's +grammars +grammatically +gramophone +gramophone's +grams +grandchild +grandchild's +grandchildren +granddaughter +granddaughter's +granddaughters +grander +grandest +grandeur +grandeur's +grandfathered +grandfathering +grandfathers +grandiose +grandly +grandmothers +grandparent +grandparents +grandson +grandson's +grandsons +grandstand +grandstand's +grandstanded +grandstanding +grandstands +granite +granite's +grannies +granny +granny's +granola +granular +granule +granule's +granules +grape +grape's +graped +grapefruit +grapefruit's +grapefruits +grapes +grapevine +grapevine's +grapevines +graphed +graphically +graphing +graphite +graphite's +graping +grapple +grappled +grapples +grappling +grasped +grasping +grasps +grassed +grasses +grasshopper +grasshopper's +grasshoppers +grassier +grassiest +grassing +grassy +grate +grated +gratefuller +gratefullest +grater +grater's +graters +grates +gratification +gratification's +gratifications +gratified +gratifies +gratify +gratifying +grating +grating's +gratings +gratitude +gratitude's +gratuities +gratuity +gratuity's +graved +gravel +gravel's +gravels +gravely +graven +graver +graves +gravest +gravestone +gravestone's +gravestones +graveyard +graveyard's +graveyards +gravies +graving +gravitate +gravitated +gravitates +gravitating +gravitation +gravitation's +gravy +gravy's +graze +grazed +grazes +grazing +grease +grease's +greased +greases +greasier +greasiest +greasing +greatness +greatness's +greats +greedier +greediest +greedily +greediness +greediness's +greenback +greenback's +greenbacks +greened +greener +greenery +greenery's +greenest +greenhorn +greenhorn's +greenhorns +greenhouse +greenhouse's +greenhouses +greening +greens +greet +greeted +greeting +greeting's +greetings +greets +gregarious +gremlin +gremlin's +gremlins +grenade +grenade's +grenades +greyhound +greyhound's +greyhounds +gridded +griddle +griddle's +griddles +griding +gridiron +gridiron's +gridirons +grids +griefs +grievance +grievance's +grievances +grieve +grieved +grieves +grieving +grievous +grill +grille +grille's +grilled +grilles +grilling +grills +grimace +grimace's +grimaced +grimaces +grimacing +grime +grime's +grimed +grimes +grimier +grimiest +griming +grimly +grimmer +grimmest +grimy +grin +grinder +grinder's +grinders +grindstone +grindstone's +grindstones +grinned +grinning +grins +gripe +griped +gripes +griping +gripped +gripping +grislier +grisliest +grisly +gristle +gristle's +grit +grit's +grits +gritted +grittier +grittiest +gritting +gritty +grizzled +grizzlier +grizzlies +grizzliest +grizzly +groaned +groaning +groans +grocer +grocer's +groceries +grocers +grocery +grocery's +groggier +groggiest +groggy +groin +groin's +groins +groom +groom's +groomed +grooming +grooms +groove +groove's +grooved +grooves +groovier +grooviest +grooving +groovy +grope +groped +gropes +groping +grossed +grosser +grossest +grossing +grotesque +grotesques +grotto +grotto's +grottoes +grouch +grouched +grouches +grouchier +grouchiest +grouching +grouchy +grounded +grounding +groundless +groundwork +groundwork's +grouper +groupers +groupings +grouse +grouse's +groused +grouses +grousing +grove +grove's +grovel +grovels +groves +grower +grower's +growers +growl +growled +growling +growls +growths +grub +grubbed +grubbier +grubbiest +grubbing +grubby +grubs +grudge +grudge's +grudged +grudges +grudging +gruel +gruel's +gruels +gruesome +gruesomer +gruesomest +gruff +gruffed +gruffer +gruffest +gruffing +gruffly +gruffs +grumble +grumbled +grumbles +grumbling +grumpier +grumpiest +grumpy +grunt +grunted +grunting +grunts +guarantor +guarantor's +guarantors +guardian +guardian's +guardians +gubernatorial +guerrilla +guerrilla's +guerrillas +guessable +guesswork +guesswork's +guested +guesting +guffaw +guffaw's +guffawed +guffawing +guffaws +guidebook +guidebook's +guidebooks +guideline's +guild +guild's +guilds +guile +guile's +guiled +guiles +guiling +guillotine +guillotine's +guillotined +guillotines +guillotining +guiltier +guiltiest +guiltily +guiltless +guise +guise's +guises +guitarist +guitarist's +guitars +gulch +gulch's +gulches +gulfs +gull +gull's +gulled +gullet +gullet's +gullets +gullies +gulling +gulls +gully +gully's +gulp +gulped +gulping +gulps +gumdrop +gumdrop's +gumdrops +gummed +gummier +gummiest +gumming +gummy +gumption +gumption's +gums +gunfire +gunfire's +gunman +gunman's +gunmen +gunned +gunner +gunner's +gunners +gunning +gunpowder +gunpowder's +gunshot +gunshot's +gunshots +guppies +guppy +guppy's +gurgle +gurgled +gurgles +gurgling +guru +guru's +gurus +gush +gushed +gusher +gusher's +gushers +gushes +gushing +gust +gust's +gusted +gustier +gustiest +gusting +gusts +gusty +gutted +guttered +guttering +gutters +gutting +guyed +guying +guzzle +guzzled +guzzles +guzzling +gym +gym's +gymnasium +gymnasium's +gymnasiums +gymnast +gymnast's +gymnastics +gymnastics's +gymnasts +gyms +gyrate +gyrated +gyrates +gyrating +gyration +gyration's +gyrations +gyroscope +gyroscope's +gyroscopes +habitable +habitat +habitat's +habitation +habitation's +habitations +habitats +habitual +habitually +habituals +hackney +hackneyed +hackneying +hackneys +hacksaw +hacksaw's +hacksawed +hacksawing +hacksaws +haddock +haddock's +haddocks +haded +hades +hading +hag +hag's +haggard +hagged +hagging +haggle +haggled +haggles +haggling +hags +hailed +hailing +hails +hailstone +hailstone's +hailstones +haircuts +haircutting +hairdo +hairdo's +hairdos +hairdresser +hairdresser's +hairdressers +haired +hairier +hairiest +hairline +hairline's +hairlines +hale +haled +haler +hales +halest +halfway +halibut +halibut's +halibuts +haling +hallelujah +hallelujahs +hallmark +hallmark's +hallmarked +hallmarking +hallmarks +hallucination +hallucination's +hallucinations +hallway +hallway's +hallways +halo +halo's +haloed +haloing +halon +halos +halter +halter's +haltered +haltering +halters +halved +halving +hamburger +hamburger's +hamburgers +hamlet +hamlet's +hamlets +hammed +hammered +hammering +hammering's +hammers +hamming +hammock +hammock's +hammocks +hamper +hampered +hampering +hampers +hams +hamster +hamster's +hamsters +hamstring +hamstring's +hamstringing +hamstrings +hamstrung +handbag +handbag's +handbagged +handbagging +handbags +handbooks +handcuff +handcuffed +handcuffing +handcuffs +handedness +handedness's +handfuls +handicapped +handicapping +handicaps +handicraft +handicraft's +handicrafts +handier +handiest +handiwork +handiwork's +handkerchief +handkerchief's +handkerchiefs +handlebar +handlebars +handlers +handmade +handout +handout's +handouts +handrail +handrail's +handrails +handshake +handshake's +handsome +handsomer +handsomest +handwriting +handwriting's +hangar +hangar's +hangars +hanger +hanger's +hangers +hangings +hangout +hangout's +hangouts +hangovers +hanker +hankered +hankering +hankers +haphazard +hapless +happenings +harangue +harangued +harangues +haranguing +harass +harassed +harasses +harassing +harassment +harassment's +hardier +hardiest +hardliner +hardliners +hardships +hardwood +hardwood's +hardwoods +hare +hare's +harebrained +hared +harem +harem's +harems +hares +haring +hark +harked +harking +harks +harlot +harlot's +harlots +harmed +harmfully +harming +harmlessly +harmonic +harmonica +harmonica's +harmonicas +harmonies +harmonious +harms +harness +harness's +harnessed +harnesses +harnessing +harp +harp's +harped +harping +harping's +harpist +harpist's +harpists +harpoon +harpoon's +harpooned +harpooning +harpoons +harps +harpsichord +harpsichord's +harpsichords +harried +harries +harrow +harrowed +harrowing +harrows +harry +harrying +harsher +harshest +harshly +harshness +harshness's +hart +hart's +harts +harvest +harvest's +harvested +harvester +harvester's +harvesters +harvesting +harvests +hashed +hashes +hashing +hassled +hassles +hassling +haste +haste's +hasted +hastened +hastening +hastens +hastes +hastier +hastiest +hastily +hasting +hatch +hatched +hatches +hatchet +hatchet's +hatchets +hatching +hateful +hatefully +hatreds +hatted +hatting +haughtier +haughtiest +haughtily +haughtiness +haughtiness's +haughty +haul +hauled +hauling +hauls +haunt +haunted +haunting +haunts +haven +haven's +havens +haves +hawk +hawk's +hawked +hawking +hawks +hayed +haying +hays +haystack +haystack's +haystacks +haywire +haywire's +hazarded +hazarding +hazardous +haze +haze's +hazed +hazel +hazel's +hazels +hazes +hazier +haziest +hazing +headaches +headfirst +headier +headiest +headings +headland +headland's +headlands +headlight +headlight's +headlights +headlined +headlining +headlong +headmaster +headmaster's +headphone +headphones +headquarter +headquarters +headrest +headrest's +headrests +headroom +headroom's +headstone +headstone's +headstones +headstrong +headway +headway's +heady +heal +healed +healer +healer's +healers +healing +heals +healthful +healthier +healthiest +heaped +heaping +heaps +hearings +hearsay +hearsay's +hearse +hearse's +hearsed +hearses +hearsing +heartache +heartache's +heartaches +heartbeat +heartbeat's +heartbeats +heartbreak +heartbreak's +heartbreaking +heartbreaks +heartbroke +heartbroken +heartburn +heartburn's +hearted +hearten +heartened +heartening +heartens +heartfelt +hearth +hearth's +hearths +heartier +hearties +heartiest +hearting +heartless +hearty +heatedly +heater +heater's +heaters +heath +heath's +heathen +heathen's +heathens +heather +heather's +heave +heaved +heavenlier +heavenliest +heavenly +heaves +heavies +heaviness +heaviness's +heaving +heavyweight +heavyweight's +heavyweights +heckle +heckled +heckler +heckler's +hecklers +heckles +heckling +hectic +hectics +hedge +hedge's +hedged +hedgehog +hedgehog's +hedgehogs +hedges +hedging +heed +heed's +heeded +heeding +heedless +heeds +heel's +heeled +heeling +heftier +heftiest +hefty +heifer +heifer's +heifers +heighten +heightened +heightening +heightens +heinous +heir +heir's +heirloom +heirloom's +heirlooms +heirs +helicoptered +helicoptering +helicopters +heliport +heliport's +heliports +helium +helium's +helling +hellish +hellos +hells +helm +helm's +helmeted +helmeting +helmets +helms +helper +helper's +helpers +helpfully +helpings +helplessly +hem +hem's +hemisphere +hemisphere's +hemispheres +hemlock +hemlock's +hemlocks +hemmed +hemming +hemoglobin's +hemophilia +hemophilia's +hemorrhage +hemorrhage's +hemorrhaged +hemorrhages +hemorrhaging +hemp +hemp's +hems +hen +hen's +hences +henchman +henchman's +henchmen +hens +hepatitis +hepatitis's +herald +herald's +heralded +heralding +heralds +herb +herb's +herbivorous +herbs +herded +herding +herds +hereabouts +hereafter +hereafters +hereditary +heredity +heredity's +herein +heresies +heretic +heretic's +heretical +heretics +herewith +heritages +hermaphrodite +hermaphrodite's +hermit +hermit's +hermits +hernia +hernia's +hernias +heroine +heroine's +heroins +heroism +heroism's +heron +heron's +herons +herpes +herpes's +hers +hes +hesitancy +hesitancy's +hesitant +hesitated +hesitates +hesitating +hesitation +hesitation's +hesitations +heterogeneous +heterosexuality +heterosexuality's +heterosexuals +heuristic +hew +hewed +hewing +hews +hexagon +hexagon's +hexagonal +hexagons +heyday +heyday's +heydays +hi +hiatus +hiatus's +hiatuses +hibernate +hibernated +hibernates +hibernating +hibernation +hibernation's +hick +hick's +hickories +hickory +hickory's +hicks +hideaway +hideaway's +hideaways +hierarchies +hieroglyphic +hieroglyphics +highbrow +highbrow's +highbrows +highland +highland's +highlands +highs +hijack +hijacked +hijacking +hijacks +hike +hiked +hiker +hiker's +hikers +hikes +hiking +hilarity +hilarity's +hillbillies +hillbilly +hillbilly's +hillier +hilliest +hillside +hillside's +hillsides +hilly +hilt +hilt's +hilts +hims +hind +hinder +hindered +hindering +hinders +hindrance +hindrance's +hindrances +hinds +hinge +hinge's +hinged +hinges +hinging +hinterland +hinterland's +hinterlands +hipped +hipper +hippest +hippie +hippie's +hippier +hippies +hippiest +hipping +hippopotamus +hippopotamus's +hippopotamuses +hips +hiss +hiss's +hissed +hisses +hissing +histogram +histogram's +historian's +histories +hitch +hitched +hitches +hitchhike +hitchhiked +hitchhiker +hitchhikers +hitchhikes +hitchhiking +hitching +hither +hive +hive's +hived +hives +hiving +hoard +hoard's +hoarded +hoarder +hoarder's +hoarders +hoarding +hoarding's +hoards +hoarse +hoarseness +hoarseness's +hoarser +hoarsest +hoax +hoax's +hoaxed +hoaxes +hoaxing +hobbies +hobbit +hobble +hobbled +hobbles +hobbling +hobbyhorse +hobbyhorse's +hobbyhorses +hobgoblin +hobgoblin's +hobgoblins +hobnob +hobnobbed +hobnobbing +hobnobs +hobo +hobo's +hoboed +hoboing +hobos +hock +hock's +hocked +hockey +hockey's +hocking +hocks +hodgepodge +hodgepodge's +hodgepodges +hoe +hoe's +hoed +hoeing +hoes +hogged +hogging +hogs +hoist +hoisted +hoisting +hoists +holdup +holdup's +holdups +holed +holidayed +holidaying +holier +holiest +holiness +holiness's +holing +holler +hollered +hollering +hollers +hollies +hollowed +hollower +hollowest +hollowing +hollows +holly +holly's +holocaust +holocaust's +holocausts +holster +holster's +holstered +holstering +holsters +homage +homage's +homaged +homages +homaging +homed +homeland +homeland's +homelands +homeless +homelier +homeliest +homely +homemade +homesick +homesickness +homesickness's +homespun +homestead +homestead's +homesteaded +homesteading +homesteads +homeward +homework +homework's +homey +homeys +homicidal +homicide +homicide's +homicides +homier +homiest +homing +homogeneous +homonym +homonym's +homonyms +homophobic +homosexuals +hone +hone's +honed +honer +hones +honester +honestest +honeycomb +honeycomb's +honeycombed +honeycombing +honeycombs +honeyed +honeying +honeymoon +honeymoon's +honeymooned +honeymooning +honeymoons +honeys +honeysuckle +honeysuckle's +honeysuckles +honing +honk +honk's +honked +honking +honks +honoraries +hood +hood's +hooded +hooding +hoodlum +hoodlum's +hoodlums +hoods +hoodwink +hoodwinked +hoodwinking +hoodwinks +hoof +hoof's +hoofed +hoofing +hoofs +hoop +hoop's +hooped +hooping +hoops +hooray +hoorayed +hooraying +hoorays +hoot +hoot's +hooted +hooter +hooter's +hooting +hoots +hooves +hooves's +hop +hop's +hopefuls +hopped +hopper +hopper's +hopping +hopping's +hops +hopscotch +hopscotch's +hopscotched +hopscotches +hopscotching +horde's +horded +hording +horizons +horizontals +hormone +hormone's +hormones +horned +hornet +hornet's +hornets +hornier +horniest +horns +horny +horoscope +horoscope's +horoscopes +horribles +horrors +horseback +horseback's +horsed +horseman +horseman's +horseplay +horseplay's +horsepower +horsepower's +horseradish +horseradish's +horseradishes +horseshoe +horseshoe's +horseshoed +horseshoeing +horseshoes +horsing +horticultural +horticulture +horticulture's +hose +hose's +hosed +hoses +hosiery +hosiery's +hosing +hospitable +hospitality +hospitality's +hostage +hostage's +hostages +hosted +hostel +hostel's +hosteled +hosteling +hostels +hostess +hostess's +hostessed +hostesses +hostessing +hostiles +hostility +hostility's +hosting +hotbed +hotbed's +hotbeds +hotels +hothead +hothead's +hotheaded +hotheads +hotly +hotter +hottest +hound +hound's +hounded +hounding +hounds +hourglass +hourglass's +hourglasses +hourlies +hourly +houseboat +houseboat's +houseboats +households +housekeeper +housekeeper's +housekeepers +housewarming +housewarming's +housewarmings +housewife +housewife's +housewives +housework +housework's +housings +hove +hovel +hovel's +hovels +hover +hovered +hovering +hovers +howl +howl's +howled +howling +howls +hows +hub +hub's +hubbub +hubbub's +hubbubs +hubs +huddle +huddle's +huddled +huddles +huddling +hue +hue's +hued +hues +huff +huff's +huffed +huffier +huffiest +huffing +huffs +huffy +hug +huger +hugest +hugged +hugger +hugging +hugs +hulk +hulk's +hulking +hulks +hull +hull's +hullabaloo +hullabaloo's +hullabaloos +hulled +hulling +hulls +humanely +humaner +humanest +humanism +humanism's +humanist +humanist's +humanitarian +humanitarians +humanities +humanly +humbled +humbler +humbles +humblest +humbling +humbug +humbug's +humdrum +humid +humidified +humidifies +humidify +humidifying +humidity +humidity's +humiliate +humiliated +humiliates +humiliating +humiliation +humiliation's +humiliations +humility +humility's +hummed +humming +hummingbird +hummingbird's +hummingbirds +humorist +humorist's +humorists +humorously +hump +hump's +humped +humping +humps +hums +hunch +hunch's +hunchback +hunchback's +hunchbacks +hunched +hunches +hunching +hundredth +hundredths +hunger +hunger's +hungered +hungering +hungers +hungrier +hungriest +hungrily +hunk +hunk's +hunks +hunter +hunter's +hunters +hurdle +hurdle's +hurdled +hurdles +hurdling +hurl +hurled +hurling +hurling's +hurls +hurricane +hurricane's +hurricanes +hurried +hurriedly +hurries +hurrying +hurtful +hurtle +hurtled +hurtles +hurtling +husbanded +husbanding +husbands +hush +hushed +hushes +hushing +husk +husk's +husked +huskier +huskies +huskiest +huskily +huskiness +huskiness's +husking +husks +husky +hustle +hustled +hustler +hustler's +hustlers +hustles +hustling +hutch +hutch's +hutched +hutches +hutching +huts +hyacinth +hyacinth's +hyacinths +hybrid +hybrid's +hybrids +hydrant +hydrant's +hydrants +hydraulic +hydraulicked +hydraulicking +hydraulics +hydraulics's +hydroelectric +hydroplane +hydroplane's +hydroplaned +hydroplanes +hydroplaning +hyena +hyena's +hyenas +hygiene +hygiene's +hygienic +hygienics +hymn +hymn's +hymnal +hymnal's +hymnals +hymned +hymning +hymns +hyperbole +hyperbole's +hypertension +hypertension's +hyphenate +hyphenated +hyphenates +hyphenating +hyphenation +hyphenation's +hyphened +hyphening +hyphens +hypnosis +hypnosis's +hypnotic +hypnotics +hypnotism +hypnotism's +hypnotist +hypnotist's +hypnotists +hypochondria +hypochondria's +hypochondriac +hypochondriac's +hypochondriacs +hypocrisies +hypocrites +hypotenuse +hypotenuse's +hypotenuses +hypotheses +hysteria +hysteria's +hysteric +hysterically +hysterics +iceberg +iceberg's +icebergs +icebreaker +icebreaker's +icebreakers +iced +ices +icicle +icicle's +icicles +icier +iciest +icing +icing's +icings +icy +idealist +idealist's +idealists +identifiable +identities +ideologically +ideologies +idiocies +idiocy +idiocy's +idiomatic +idioms +idiosyncrasies +idiosyncrasy +idiosyncrasy's +idled +idler +idles +idlest +idling +idly +idol +idol's +idols +idyllic +ifs +igloo +igloo's +igloos +ignite +ignited +ignites +igniting +ignition +ignition's +ignitions +ignorants +iguana +iguana's +iguanas +ilk +ilk's +illegals +illegible +illegibly +illegitimate +illicit +illiteracy +illiteracy's +illiterates +illnesses +ills +illuminate +illuminated +illuminates +illuminating +illumination +illumination's +illuminations +illusions +illusory +illustrative +illustrator +illustrator's +illustrators +illustrious +imaged +imagery +imagery's +imaginable +imaginations +imaging +imbalances +imbecile +imbecile's +imbeciles +imitate +imitated +imitates +imitating +imitation +imitation's +imitations +imitative +imitator +imitator's +imitators +immaculate +immaculately +immaterial +immatures +immaturity +immaturity's +immeasurable +immeasurably +immenser +immensest +immensities +immensity +immensity's +immerse +immersed +immerses +immersing +immersion +immersion's +immersions +immigrant +immigrant's +immigrants +immigrate +immigrated +immigrates +immigrating +immigration +immigration's +imminently +immobile +immoralities +immorality +immorality's +immortality +immortality's +immortals +immovable +immunity +immunity's +imp +imp's +impacted +impacting +impacts +impairment +impairment's +impairments +impale +impaled +impales +impaling +impart +imparted +impartial +impartiality +impartiality's +impartially +imparting +imparts +impassable +impasse +impasse's +impasses +impassioned +impassive +impatience +impatience's +impatiences +impatient +impatiently +impeach +impeached +impeaches +impeaching +impeccable +impeccables +impedance +impedance's +impede +impeded +impedes +impediment +impediment's +impediments +impeding +impel +impelled +impelling +impels +impenetrable +imperatives +imperceptible +imperceptibly +imperfection +imperfection's +imperfections +imperfectly +imperfects +imperialism +imperialism's +imperialist +imperialist's +imperials +imperil +imperils +impersonally +impersonate +impersonated +impersonates +impersonating +impersonation +impersonation's +impersonations +impertinence +impertinence's +impertinent +impertinents +impervious +impetuous +impetuously +impetus +impetus's +impetuses +impinge +impinged +impinges +impinging +impish +implacable +implant +implanted +implanting +implants +implementable +implementer +implementer's +implicate +implicated +implicates +implicating +implore +implored +implores +imploring +impolite +importation +importation's +importations +imposition +imposition's +impositions +impossibilities +impossibility +impossibility's +impossibles +impossibly +impostor +impostor's +impostors +impotence +impotence's +impotent +impound +impounded +impounding +impounds +impoverish +impoverished +impoverishes +impoverishing +imprecise +impregnable +impregnate +impregnated +impregnates +impregnating +impressionable +impressively +imprint +imprint's +imprinted +imprinting +imprints +imprisonment +imprisonment's +imprisonments +improbabilities +improbability +improbability's +improbably +impromptu +impromptus +improper +improperly +improprieties +impropriety +impropriety's +improvisation +improvisation's +improvisations +improvise +improvised +improvises +improvising +imps +impudence +impudence's +impudent +impulsed +impulses +impulsing +impulsive +impulsively +impunity +impunity's +impure +impurer +impurest +impurities +impurity +impurity's +inabilities +inaccuracy's +inaction +inaction's +inactive +inactivity +inactivity's +inadequacies +inadequacy +inadequacy's +inadequately +inadequates +inadmissible +inadvertent +inadvisable +inalienable +inaner +inanest +inanimate +inapplicable +inarticulate +inarticulates +inasmuch +inaudible +inaugural +inaugurals +inaugurate +inaugurated +inaugurates +inaugurating +inauguration +inauguration's +inaugurations +inauspicious +inborn +inbred +inbreds +inbreed +inbreeding +inbreeding's +inbreeds +inbuilt +incalculable +incandescence +incandescence's +incandescent +incandescents +incantation +incantation's +incantations +incapacitate +incapacitated +incapacitates +incapacitating +incapacity +incapacity's +incarcerate +incarcerated +incarcerates +incarcerating +incarceration +incarceration's +incarcerations +incarnate +incarnated +incarnates +incarnating +incarnations +incendiaries +incendiary +incense +incense's +incensed +incenses +incensing +incentives +inception +inception's +inceptions +incessant +incessantly +incest +incest's +incestuous +inched +inching +incidences +incidentals +incinerate +incinerated +incinerates +incinerating +incinerator +incinerator's +incinerators +incision +incision's +incisions +incisive +incisor +incisor's +incisors +incite +incited +incitement +incitement's +incitements +incites +inciting +inclinations +inclusions +incognito +incognitos +incoherence +incoherence's +incoherently +incomes +incomparable +incompatibilities +incompatibility +incompatibility's +incompatibles +incompatibly +incompetents +inconceivable +inconclusive +incongruities +incongruity +incongruity's +incongruous +inconsequential +inconsiderable +inconsiderate +inconsolable +inconspicuous +inconveniently +incorporation +incorporation's +incorrigible +incredulity +incredulity's +incredulous +incremental +incremented +incrementing +increments +incriminate +incriminated +incriminates +incriminating +incubate +incubated +incubates +incubating +incubation +incubation's +incubator +incubator's +incubators +incumbent +incumbents +incurable +incurables +indebted +indecencies +indecency +indecency's +indecent +indecenter +indecentest +indecision +indecision's +indecisive +indeeds +indefinable +indefinites +indelible +indelibly +indelicate +indentation +indentation's +indentations +indented +indenting +indents +independents +indescribable +indescribables +indestructible +indicatives +indices's +indict +indicted +indicting +indictments +indicts +indifference +indifference's +indifferent +indigenous +indigestible +indigestibles +indigestion +indigestion's +indignant +indignantly +indignation +indignation's +indignities +indignity +indignity's +indigo +indigo's +indiscreet +indiscretion +indiscretion's +indiscretions +indiscriminate +indiscriminately +indispensable +indispensables +indisposed +indisputable +indistinct +individualism +individualism's +individualist +individualist's +individualists +individuality +individuality's +indivisible +indoctrinate +indoctrinated +indoctrinates +indoctrinating +indoctrination +indoctrination's +indolence +indolence's +indolent +indomitable +indoor +indoors +inducement +inducement's +inducements +induct +inducted +inducting +inductions +inducts +indulgence +indulgence's +indulgences +indulgent +industrialist +industrialist's +industrialists +industrious +inedible +ineffectual +inefficiencies +inefficiently +inefficients +inelegant +ineligible +ineligibles +inept +ineptitude +ineptitude's +inequalities +inert +inertial +inerts +inescapable +inexact +inexcusable +inexhaustible +inexorable +inexorably +inexpensive +inexperience +inexperience's +inexplicable +inexplicably +inextricably +infamies +infamy +infamy's +infancy +infancy's +infantries +infantry +infantry's +infants +infatuation +infatuation's +infatuations +infections +infectious +infelicities +inferences +inferiors +inferno +inferno's +infernos +inferred +inferring +infers +infertile +infest +infestation +infestation's +infestations +infested +infesting +infests +infidel +infidel's +infidelities +infidelity +infidelity's +infidels +infield +infield's +infields +infiltrate +infiltrated +infiltrates +infiltrating +infiltration +infiltration's +infinitesimal +infinitesimals +infinities +infinitive +infinitive's +infinitives +infirm +infirmaries +infirmary +infirmary's +infirmities +infirmity +infirmity's +infix +inflame +inflamed +inflames +inflaming +inflammable +inflammation +inflammation's +inflammations +inflammatory +inflatable +inflatable's +inflate +inflated +inflates +inflating +inflationary +inflection +inflection's +inflections +inflicted +inflicting +inflicts +influenza +influenza's +influx +influx's +influxes +informality +informality's +informant +informant's +informants +informational +informer +informer's +informers +infraction +infraction's +infractions +infrared +infrared's +infrequently +infringe +infringed +infringements +infringes +infringing +infuriate +infuriated +infuriates +infuriating +infuse +infused +infuses +infusing +infusion +infusion's +infusions +ingeniously +ingenuity +ingenuity's +ingest +ingested +ingesting +ingests +ingrain +ingrained +ingraining +ingrains +ingratiate +ingratiated +ingratiates +ingratiating +ingratitude +ingratitude's +ingredient's +inhabitant's +inhale +inhaled +inhaler +inhaler's +inhalers +inhales +inhaling +inheritances +inhibitions +inhospitable +inhuman +inhumane +inhumanities +inhumanity +inhumanity's +initiation +initiation's +initiations +initiatives +initiator +initiator's +initiators +injected +injecting +injection +injection's +injections +injects +injunction +injunction's +injunctions +injurious +injustices +inked +inkier +inkiest +inking +inkling +inkling's +inks +inky +inlaid +inland +inlay +inlaying +inlays +inlet +inlet's +inlets +inmate +inmate's +inmates +inn +inn's +innards +innate +inned +innermost +inners +inning +inning's +innings +innkeeper +innkeeper's +innkeepers +innocenter +innocentest +innocently +innocents +innocuous +innovations +inns +innuendo +innuendo's +innuendoed +innuendoing +innuendos +innumerable +inoculate +inoculated +inoculates +inoculating +inoculation +inoculation's +inoculations +inoffensive +inoperative +inopportune +inordinate +inquest +inquest's +inquests +inquisition +inquisition's +inquisitions +inquisitive +ins +insanely +insaner +insanest +insanity +insanity's +insatiable +inscribe +inscribed +inscribes +inscribing +inscription +inscription's +inscriptions +inscrutable +insecticide +insecticide's +insecticides +insecurities +insecurity +insecurity's +insensitivity +insensitivity's +inseparable +inseparables +insertions +insider +insider's +insiders +insides +insights +insignia +insignia's +insignias +insignificance +insignificance's +insincere +insincerely +insincerity +insincerity's +insinuate +insinuated +insinuates +insinuating +insinuation +insinuation's +insinuations +insipid +insistent +insolence +insolence's +insolent +insoluble +insolubles +insolvency +insolvency's +insolvent +insolvents +insomnia +insomnia's +inspections +inspector +inspector's +inspectors +inspirations +instability +instability's +instanced +instancing +instantaneous +instantaneously +instants +instep +instep's +insteps +instigate +instigated +instigates +instigating +instigation +instigation's +instill +instilled +instilling +instills +instinctive +instincts +instituted +institutes +institutes's +instituting +institutional +instructive +instructor +instructor's +instructors +instrumentals +instrumented +instrumenting +insubordinate +insubordination +insubordination's +insubstantial +insufferable +insufficiently +insular +insulate +insulated +insulates +insulating +insulation +insulation's +insulator +insulator's +insulators +insulin +insulin's +insurances +insure +insured +insurer +insurers +insures +insurgent +insurgents +insuring +insurmountable +insurrection +insurrection's +insurrections +intakes +intangible +intangibles +integrals +intellects +intellectually +intellectuals +intelligently +intelligible +intelligibly +intenser +intensest +intensified +intensifies +intensify +intensifying +intensities +intensives +intents +intercede +interceded +intercedes +interceding +intercept +intercepted +intercepting +interception +interception's +interceptions +intercepts +interchange +interchangeable +interchanged +interchanges +interchanging +intercom +intercom's +intercoms +interconnect +intercontinental +interdependence +interdependence's +interdependent +interiors +interject +interjected +interjecting +interjection +interjection's +interjections +interjects +interlock +interlocked +interlocking +interlocks +interloper +interloper's +interlopers +interlude +interlude's +interluded +interludes +interluding +intermarriage +intermarriage's +intermarriages +intermarried +intermarries +intermarry +intermarrying +intermediaries +intermediary +intermediary's +intermediates +interment +interment's +interments +interminable +interminably +intermingle +intermingled +intermingles +intermingling +intermission +intermission's +intermissions +intermittently +intern +internationally +internationals +interned +interning +interns +interplanetary +interplay +interplay's +interpolation +interpolation's +interpose +interposed +interposes +interposing +interpreters +interracial +interred +interring +interrogated +interrogates +interrogating +interrogation +interrogation's +interrogations +interrogator +interrogator's +interrogators +inters +intersect +intersected +intersecting +intersects +intersperse +interspersed +intersperses +interspersing +interstate +interstates +interstellar +intertwine +intertwined +intertwines +intertwining +interventions +interviewer +interviewer's +interviewers +interweave +interweaves +interweaving +interwove +interwoven +intestinal +intestine +intestine's +intestines +inti +intimacies +intimacy +intimacy's +intimated +intimately +intimates +intimating +intimation +intimation's +intimations +intimidate +intimidated +intimidates +intimidating +intimidation +intimidation's +intolerable +intolerably +intolerant +intonation +intonation's +intonations +intoxicate +intoxicated +intoxicates +intoxicating +intoxication +intoxication's +intractable +intramural +intransitive +intransitives +intravenous +intravenouses +intrepid +intricacies +intricacy +intricacy's +intricate +intrigue +intrigued +intrigues +intriguing +introductions +introspective +introvert +introvert's +introverts +intrude +intruded +intruder +intruder's +intruders +intrudes +intruding +intrusion +intrusion's +intrusions +intrusive +intrusives +intuition +intuition's +intuitions +intuitively +inundate +inundated +inundates +inundating +inundation +inundation's +inundations +invader +invader's +invaders +invalidated +invalidates +invalidating +invalided +invaliding +invalids +invariable +invariables +invariant +invariant's +invasions +invective +invective's +inventive +inventoried +inventories +inventors +inventory +inventory's +inventorying +inversely +inverses +inversion +inversion's +inversions +invertebrate +invertebrate's +invertebrates +invested +investigator +investigator's +investigators +investing +investments +investor +investor's +investors +invests +inveterate +invigorate +invigorated +invigorates +invigorating +invincible +invisibility +invisibility's +invisibly +invitations +invocation +invocation's +invocations +invoice +invoice's +invoiced +invoices +invoicing +involuntarily +involuntary +involvements +invulnerable +inward +inwardly +inwards +iodine +iodine's +ions +iota +iota's +iotas +irascible +irater +iratest +ire +ire's +ired +ires +iridescence +iridescence's +iridescent +iring +iris +iris's +irises +irk +irked +irking +irks +ironed +ironically +ironies +ironing +ironing's +irons +irradiate +irradiated +irradiates +irradiating +irrationally +irrationals +irreconcilable +irrefutable +irregular +irregularities +irregularity +irregularity's +irregulars +irrelevance +irrelevance's +irrelevances +irreparable +irreplaceable +irrepressible +irreproachable +irresistible +irresponsibility +irresponsibility's +irretrievable +irretrievably +irreverence +irreverence's +irreverent +irreversible +irrevocable +irrevocably +irrigate +irrigated +irrigates +irrigating +irrigation +irrigation's +irritability +irritability's +irritable +irritably +irritant +irritants +irritations +islander +islander's +islanders +isle +isle's +isles +isthmus +isthmus's +isthmuses +italic +italics +itch +itch's +itched +itches +itchier +itchiest +itching +itchy +iterate +iteration +iteration's +iterations +iterative +itinerant +itinerants +itineraries +itinerary +itinerary's +ivies +ivories +ivory +ivory's +ivy +ivy's +jab +jabbed +jabber +jabbered +jabbering +jabbers +jabbing +jabs +jackal +jackal's +jackals +jackass +jackass's +jackasses +jackdaw +jackdaw's +jacked +jacking +jackknife +jackknife's +jackknifed +jackknifes +jackknifing +jackknives +jackpot +jackpot's +jackpots +jacks +jade +jade's +jaded +jades +jading +jagged +jaggeder +jaggedest +jaguar +jaguar's +jaguars +jailed +jailer +jailer's +jailers +jailing +jails +jalopies +jalopy +jalopy's +jam's +jamb +jamb's +jambed +jambing +jamboree +jamboree's +jamborees +jambs +jangle +jangled +jangles +jangling +janitor +janitor's +janitors +jar +jar's +jarred +jarring +jars +jaundice +jaundice's +jaundiced +jaundices +jaundicing +jaunt +jaunt's +jaunted +jauntier +jaunties +jauntiest +jauntily +jaunting +jaunts +jaunty +javelin +javelin's +javelins +jaw +jaw's +jawbone +jawbone's +jawboned +jawbones +jawboning +jawed +jawing +jaws +jay +jay's +jays +jaywalk +jaywalked +jaywalker +jaywalker's +jaywalkers +jaywalking +jaywalks +jazzed +jazzes +jazzing +jealousies +jealously +jealousy +jealousy's +jeer +jeered +jeering +jeers +jell +jelled +jellied +jelling +jells +jelly's +jellyfish +jellyfish's +jellyfishes +jellying +jeopardy +jeopardy's +jerked +jerkier +jerkiest +jerking +jerks +jerky +jersey +jersey's +jerseys +jested +jester +jester's +jesters +jesting +jests +jets +jetted +jetties +jetting +jettison +jettisoned +jettisoning +jettisons +jetty +jetty's +jewel +jewel's +jewelries +jewelry +jewelry's +jewels +jiffies +jiffy +jiffy's +jig +jig's +jigged +jigging +jiggle +jiggled +jiggles +jiggling +jigs +jigsaw +jigsaw's +jigsawed +jigsawing +jigsaws +jilt +jilted +jilting +jilts +jingle +jingled +jingles +jingling +jinx +jinx's +jinxed +jinxes +jinxing +jitterier +jitteriest +jitters +jittery +jobbed +jobbing +jockey +jockey's +jockeyed +jockeying +jockeys +jocular +jog +jogged +jogger +jogger's +joggers +jogging +jogs +jointed +jointing +joker +joker's +jokers +jollied +jollier +jollies +jolliest +jollying +jolt +jolted +jolting +jolts +jostle +jostled +jostles +jostling +jot +jots +jotted +jotting +journalism +journalism's +journalist's +journeyed +journeying +journeys +jovial +jovially +joyed +joyful +joyfuller +joyfullest +joyfully +joying +joyous +joyously +joys +joystick +jubilant +jubilation +jubilation's +jubilee +jubilee's +jubilees +judicial +judicially +judiciaries +judiciary +judicious +judiciously +judo +judo's +jug +jug's +jugged +juggernaut +juggernaut's +jugging +juggle +juggled +juggler +juggler's +jugglers +juggles +juggling +jugs +jugular +jugulars +juiced +juices +juicier +juiciest +juicing +juicy +jumble +jumbled +jumbles +jumbling +jumbo +jumbo's +jumbos +jumper +jumper's +jumpers +jumpier +jumpiest +jumpy +junctions +juncture +juncture's +junctures +jungles +juniors +juniper +juniper's +junipers +junked +junket +junket's +junketed +junketing +junkets +junkie +junkie's +junkier +junkies +junkiest +junking +junks +junta +junta's +juntas +juries +jurisdiction +jurisdiction's +juror +juror's +jurors +juster +justest +justices +justifications +justly +jut +jute +jute's +juts +jutted +jutting +juveniles +juxtapose +juxtaposed +juxtaposes +juxtaposing +juxtaposition +juxtaposition's +juxtapositions +kaleidoscope +kaleidoscope's +kaleidoscopes +kangaroo +kangaroo's +kangarooed +kangarooing +kangaroos +karat +karat's +karate +karate's +karats +kayak +kayak's +kayaked +kayaking +kayaks +keel +keel's +keeled +keeling +keels +keened +keener +keenest +keening +keenly +keens +keepers +keepsake +keepsake's +keepsakes +keg +keg's +kegged +kegging +kegs +kelp +kelp's +kennel +kennel's +kennels +kerchief +kerchief's +kerchiefed +kerchiefing +kerchiefs +kernels +kerosene +kerosene's +ketchup +ketchup's +kettles +keyboarded +keyboarding +keyhole +keyhole's +keyholes +keynote +keynote's +keynoted +keynotes +keynoting +keystone +keystone's +keystones +khaki +khaki's +khakis +kickback +kickback's +kickbacks +kickoff +kickoff's +kickoffs +kidnapper +kidnapper's +kidnappers +kidneys +killers +killings +kiln +kiln's +kilned +kilning +kilns +kilo +kilo's +kilobyte +kilobytes +kilos +kilowatt +kilowatt's +kilowatts +kilt +kilt's +kilts +kimono +kimono's +kimonos +kin +kin's +kinda +kinder +kindergarten +kindergarten's +kindergartens +kindest +kindle +kindled +kindles +kindlier +kindliest +kindling +kindling's +kindnesses +kindred +kinfolk +kingdoms +kingfisher +kingfisher's +kingfishers +kink +kink's +kinked +kinkier +kinkiest +kinking +kinks +kinky +kins +kinship +kinship's +kiosk +kiosk's +kiosks +kipper +kipper's +kissed +kisses +kissing +kitchened +kitchenette +kitchenette's +kitchenettes +kitchening +kitchens +kite +kite's +kited +kites +kiting +kitten +kitten's +kittens +kitties +kitty +kitty's +kiwi +kiwi's +kiwis +knack +knack's +knacked +knacker +knacker's +knacking +knacks +knapsack +knapsack's +knapsacks +knead +kneaded +kneading +kneads +kneecap +kneecap's +kneecapped +kneecapping +kneecaps +kneed +kneeing +kneel +kneeling +kneels +knelt +knickers +knifed +knifes +knifing +knighted +knighthood +knighthood's +knighthoods +knighting +knights +knit +knits +knitted +knitting +knitting's +knives +knives's +knob +knob's +knobs +knocker +knocker's +knockers +knockout +knockout's +knockouts +knoll +knoll's +knolls +knot +knot's +knots +knotted +knottier +knottiest +knotting +knotty +knowinger +knowingest +knowingly +knowings +knowledgeable +knuckle +knuckle's +knuckled +knuckles +knuckling +koala +koala's +koalas +kosher +koshered +koshering +koshers +kowtow +kowtowed +kowtowing +kowtows +kudos +kudos's +lab's +laboratories +laborious +laboriously +labyrinth +labyrinth's +labyrinths +lace +lace's +laced +lacerate +lacerated +lacerates +lacerating +laceration +laceration's +lacerations +laces +lacier +laciest +lacing +lacquer +lacquer's +lacquered +lacquering +lacquers +lacrosse +lacrosse's +lacy +laddered +laddering +ladders +lade +laded +laden +lades +lading +ladle +ladle's +ladled +ladles +ladling +lads +ladybug +ladybug's +ladybugs +ladylike +laggard +laggard's +laggards +lagged +lagging +lagging's +lagoon +lagoon's +lagoons +lags +lair +lair's +lairs +laked +lakes +laking +lamb +lamb's +lambda +lambda's +lambed +lambing +lambs +lame +lamed +lament +lamentable +lamentation +lamentation's +lamentations +lamented +lamenting +laments +lamer +lames +lamest +laming +lampoon +lampoon's +lampooned +lampooning +lampoons +lamps +lance +lance's +lanced +lances +lancing +lander +landings +landladies +landlady +landlady's +landlocked +landlords +landmark +landmark's +landmarks +landowner +landowners +landscaped +landscapes +landscaping +landslid +landslide +landslide's +landslides +landsliding +lanes +languid +languish +languished +languishes +languishing +languor +languor's +languorous +languors +lankier +lankiest +lanky +lantern +lantern's +lanterns +lap +lap's +lapel +lapel's +lapels +lapped +lapping +laps +lapse +lapse's +lapsed +lapses +lapsing +larcenies +larceny +larceny's +lard +lard's +larded +larding +lards +larges +larked +larking +larks +larva +larva's +larvae +larynges +laryngitis +laryngitis's +larynx +larynx's +lascivious +lash +lash's +lashed +lashes +lashing +lass +lass's +lasses +lastly +latch +latch's +latched +latches +latching +latent +latents +lateral +lateraled +lateraling +laterals +latex +latex's +lath +lathe +lathe's +lathed +lather +lather's +lathered +lathering +lathers +lathes +lathing +laths +latitude +latitude's +latitudes +latrine +latrine's +latrines +lattice +lattice's +lattices +laud +laudable +lauded +lauding +lauds +laughable +laughingstock +laughingstock's +laughingstocks +launcher +launchers +launder +laundered +laundering +launders +laundries +laundry +laundry's +laureate +laureated +laureates +laureating +laurel +laurel's +laurels +lava +lava's +lavatories +lavender +lavender's +lavendered +lavendering +lavenders +lavish +lavished +lavisher +lavishes +lavishest +lavishing +lawful +lawless +lawmaker +lawmaker's +lawmakers +lawns +lawsuit +lawsuit's +lawsuits +lax +laxative +laxative's +laxatives +laxer +laxes +laxest +laxity +laxity's +layered +layering +layman +layman's +laymen +layouts +lazied +lazier +lazies +laziest +lazying +leaden +leafed +leafier +leafiest +leafing +leafleted +leafleting +leafs +leafy +leagued +leagues +leaguing +leakage +leakage's +leakages +leaked +leaking +leaks +leaky +leaner +leanest +leaped +leapfrog +leapfrog's +leapfrogged +leapfrogging +leapfrogs +leaping +leaps +lease +lease's +leased +leases +leash +leash's +leashed +leashes +leashing +leasing +leathery +lectern +lectern's +lecterns +ledge +ledge's +ledger +ledger's +ledgered +ledgering +ledgers +ledges +lee +lee's +leech +leech's +leeched +leeches +leeching +leek +leek's +leeks +leer +leered +leerier +leeriest +leering +leers +leery +leeway +leeway's +lefter +leftest +leftmost +lefts +legacies +legacy +legacy's +legalistic +legality +legality's +legals +legends +legged +legging +leggings +legibility +legibility's +legibly +legion +legion's +legions +legislate +legislated +legislates +legislating +legislative +legislator +legislator's +legislators +legislature +legislature's +legislatures +legitimacy +legitimacy's +legitimated +legitimates +legitimating +legume +legume's +legumes +leisurely +lemme +lemonade +lemonade's +lemoned +lemoning +lemons +lengthen +lengthened +lengthening +lengthens +lengthier +lengthiest +lengthwise +leniency +leniency's +lenients +lentil +lentil's +lentils +leopard +leopard's +leopards +leotard +leotard's +leotards +leper +leper's +lepers +leprosy +leprosy's +lesbians +lesion +lesion's +lesions +lessen +lessened +lessening +lessens +letdown +letdown's +letdowns +lethals +lethargic +lethargy +lethargy's +lettered +letterhead +letterhead's +letterheads +lettering +lettuce +lettuce's +lettuces +letup +letup's +letups +levee +levee's +levees +lever +lever's +leverage +leverage's +leveraged +leverages +leveraging +levered +levering +levers +levied +levies +levity +levity's +levy +levying +lewd +lewder +lewdest +lexical +lexicon +lexicon's +lexicons +liabilities +liaisons +liar +liar's +liars +libels +liberalism +liberalism's +liberally +liberals +liberate +liberated +liberates +liberating +liberation +liberation's +libertarian +libertarian's +librarians +libretto +libretto's +lice +lice's +lichen +lichen's +lichens +lick +licked +licking +licks +licorice +licorice's +licorices +lids +lieu +lieu's +lieutenant +lieutenant's +lieutenants +lifeboat +lifeboat's +lifeboats +lifeforms +lifeguard +lifeguard's +lifeguards +lifeless +lifelike +lifeline +lifeline's +lifelines +lifelong +lifespan +lifestyles +lifetimes +lift's +ligament +ligament's +ligaments +ligature +ligatures +lighten +lightened +lightening +lightens +lighters +lighthouse +lighthouse's +lighthouses +lightness +lightness's +lightweight +lightweights +likable +likelier +likeliest +likelihoods +liken +likened +likeness +likeness's +likenesses +likening +likens +liker +likest +lilac +lilac's +lilacs +lilies +lilt +lilt's +lilted +lilting +lilts +lily +lily's +limb's +limber +limbered +limberer +limberest +limbering +limbers +limbo +limbo's +lime +lime's +limed +limelight +limelight's +limelighted +limelighting +limelights +limerick +limerick's +limericks +limes +limestone +limestone's +liming +limitless +limousine +limousine's +limousines +limp +limped +limper +limpest +limping +limps +linchpin +linchpin's +linchpins +lineage +lineage's +lineages +linearly +linefeed +linen +linen's +liner +liner's +liners +linger +lingered +lingerie +lingerie's +lingering +lingers +lingo +lingo's +lingoes +linguist +linguist's +linguistics +linguistics's +linguists +liniment +liniment's +liniments +linings +linker +linoleum +linoleum's +lint +lint's +lints +lioness +lioness's +lionesses +lions +lip's +lipstick +lipstick's +lipsticked +lipsticking +lipsticks +liquefied +liquefies +liquefy +liquefying +liqueur +liqueur's +liqueured +liqueuring +liqueurs +liquidate +liquidated +liquidates +liquidating +liquidation +liquidation's +liquidations +liquids +liquor's +liquored +liquoring +liquors +lisped +lisping +lisps +listeners +listless +litanies +litany +litany's +literacy +literacy's +literals +literates +lithe +lither +lithest +lithium +lithium's +litigation +litigation's +litterbug +litterbug's +litterbugs +littered +littering +litters +littler +littlest +liturgical +liturgies +liturgy +liturgy's +livable +livelier +liveliest +livelihood +livelihood's +livelihoods +liveliness +liveliness's +liven +livened +livening +livens +livers +livestock +livestock's +livid +livings +lizard +lizard's +lizards +llama +llama's +llamas +loadable +loaf +loaf's +loafed +loafer +loafer's +loafers +loafing +loafs +loam +loam's +loaned +loaning +loath +loathe +loathed +loather +loathes +loathing +loathing's +loathings +loathsome +loaves +loaves's +lob +lob's +lobbed +lobbied +lobbies +lobbing +lobbying +lobbyist +lobbyist's +lobbyists +lobe +lobe's +lobed +lobes +lobing +lobotomy +lobotomy's +lobs +lobster +lobster's +lobstered +lobstering +lobsters +locale +locale's +localed +locales +localing +localities +locality +locality's +locker +locker's +lockers +locket +locket's +lockets +locksmith +locksmith's +locksmiths +locomotion +locomotion's +locomotive +locomotive's +locomotives +locust +locust's +locusts +lodged +lodger +lodger's +lodgers +lodges +lodging +lodging's +lodgings +loft +loft's +lofted +loftier +loftiest +loftiness +loftiness's +lofting +lofts +lofty +logarithm +logarithm's +logarithmic +logger +logger's +logician +logician's +loin +loin's +loincloth +loincloth's +loincloths +loins +loiter +loitered +loiterer +loiterer's +loiterers +loitering +loiters +loll +lolled +lolling +lollipop +lollipop's +lollipops +lolls +lone +lonelier +loneliest +loneliness +loneliness's +lonesome +lonesomes +longed +longevity +longevity's +longhand +longhand's +longing +longing's +longings +longish +longitude +longitude's +longitudes +longitudinal +longs +longshoreman +longshoreman's +longshoremen +lookout +lookout's +lookouts +loom +loom's +loomed +looming +looms +loon +loon's +loonier +loonies +looniest +loons +loony +looped +loopholes +looping +loosed +loosen +loosened +loosening +loosens +looser +looses +loosest +loosing +loosing's +loot +loot's +looted +looting +loots +lop +lope +loped +lopes +loping +lopped +lopping +lops +lopsided +lorded +lording +lore +lore's +loser +loser's +losers +lotion +lotion's +lotions +lotteries +lottery +lottery's +lotus +lotus's +lotuses +loudlier +loudliest +loudness +loudness's +loudspeaker +loudspeaker's +loudspeakers +lounge +lounged +lounges +lounging +louse +louse's +loused +louses +lousier +lousiest +lousing +lovable +lovelier +lovelies +loveliest +loveliness +loveliness's +lovingly +lovings +lowdown +lowed +lowing +lowlier +lowliest +lowly +lows +loyaler +loyalest +loyalties +loyalty +loyalty's +lozenge +lozenge's +lozenges +lubricant +lubricant's +lubricants +lubricate +lubricated +lubricates +lubricating +lubrication +lubrication's +lucid +lucked +luckier +luckiest +lucking +lucks +lucrative +lug +lugged +lugging +lugs +lukewarm +lull +lullabies +lullaby +lullaby's +lulled +lulling +lulls +lumber +lumber's +lumbered +lumbering +lumberjack +lumberjack's +lumberjacks +lumbers +luminaries +luminary +luminary's +luminous +lumped +lumpier +lumpiest +lumping +lumpy +lunacies +lunacy +lunacy's +lunar +lunatics +lunched +luncheon +luncheon's +luncheoned +luncheoning +luncheons +lunches +lunching +lunge +lunge's +lunged +lunges +lunging +lurch +lurched +lurches +lurching +lure +lured +lures +lurid +luring +luscious +lush +lusher +lushes +lushest +lusted +lustier +lustiest +lusting +lustrous +lusts +lusty +lute +lute's +lutes +luxuriant +luxuriate +luxuriated +luxuriates +luxuriating +luxuries +luxurious +lye +lye's +lymph +lymph's +lymphatic +lymphatics +lynch +lynched +lynches +lynching +lyre +lyre's +lyres +lyrical +m +ma +ma's +macabre +macaroni +macaroni's +mace +mace's +maced +maces +machete +machete's +machetes +machined +machining +machinist +machinist's +machinists +macho +macing +mackerel +mackerel's +mackerels +macroscopic +madam +madam's +madame +madame's +madams +madcap +madcaps +madden +maddened +maddening +maddens +madder +maddest +madhouse +madhouse's +madhouses +madly +madman +madman's +madmen +maelstrom +maelstrom's +maelstroms +magenta +magenta's +maggot +maggot's +maggots +magically +magician +magician's +magicians +magicked +magicking +magics +magistrate +magistrate's +magistrates +magnanimity +magnanimity's +magnanimous +magnanimously +magnate +magnate's +magnates +magnesium +magnesium's +magnet +magnet's +magnetics +magnetism +magnetism's +magnets +magnificence +magnificence's +magnified +magnifies +magnify +magnifying +magnitudes +magnolia +magnolia's +magnolias +magnum +magnum's +magpie +magpie's +magpies +mahoganies +mahogany +mahogany's +maid +maid's +maiden +maiden's +maidens +maids +mailboxes +mailman +mailman's +mailmen +maim +maimed +maiming +maims +mainland +mainland's +mainlands +mainline +mainstay +mainstay's +mainstays +maintainability +maintainable +maintainer +maintainer's +maintainers +maizes +majestic +majestically +majesties +majesty +majesty's +majored +majoring +majorities +majors +makeshift +makeshifts +makeup +makeup's +makeups +maladies +maladjusted +malady +malady's +malaria +malaria's +malevolence +malevolent +malformed +malice +malice's +maliced +malices +malicing +maliciously +malign +malignancies +malignancy +malignancy's +malignant +malignants +maligned +maligning +maligns +mall +mall's +mallard +mallard's +mallards +malleable +malled +mallet +mallet's +mallets +malling +malls +malnutrition +malnutrition's +malpractice +malpractice's +malpractices +malt +malt's +malted +malting +maltreat +maltreated +maltreating +maltreats +malts +mama +mama's +mamas +mammal +mammal's +mammalian +mammalian's +mammals +mammoth +mammoth's +mammoths +manacle +manacle's +manacled +manacles +manacling +manageable +managerial +mandated +mandates +mandating +mandible +mandible's +mandibles +mandolin +mandolin's +mandolins +mane +mane's +manes +mange +mange's +manged +manger +manger's +mangers +manges +mangier +mangiest +manging +mango +mango's +mangoes +mangrove +mangrove's +mangroves +mangy +manhandle +manhandled +manhandles +manhandling +manhole +manhole's +manholes +manhood +manhood's +maniac +maniac's +maniacal +maniacs +manias +manic +manicure +manicure's +manicured +manicures +manicuring +manicurist +manicurist's +manicurists +manifest +manifestations +manifested +manifesting +manifestoed +manifestoing +manifestos +manifests +manifold +manifolded +manifolding +manifolds +manipulations +manlier +manliest +manliness +manliness's +manly +mannequin +mannequin's +mannequins +mannerism +mannerism's +mannerisms +manners +mannish +manor +manor's +manors +mansion +mansion's +mansions +manslaughter +manslaughter's +mantel +mantel's +mantelpiece +mantelpiece's +mantelpieces +mantels +mantle +mantle's +mantled +mantles +mantling +manure +manure's +manured +manures +manuring +manuscript +manuscript's +manuscripts +maple +maple's +maples +mapper +mappings +mar +marathon +marathon's +marathons +marble +marble's +marbled +marbles +marbling +marched +marcher +marcher's +marches +marching +mare +mare's +mares +margarine +margarine's +marigold +marigold's +marigolds +marijuana +marijuana's +marina +marina's +marinas +marinate +marinated +marinates +marinating +marine +mariner +mariner's +mariners +marines +marionette +marionette's +marionettes +maritime +markedly +marketable +marketplace +marketplace's +marketplaces +markings +marksman +marksman's +marksmen +marmalade +marmalade's +maroon +marooned +marooning +maroons +marquee +marquee's +marquees +marred +marriages +marring +marrow +marrow's +marrowed +marrowing +marrows +mars +marsh +marsh's +marshal +marshal's +marshaled +marshaling +marshals +marshes +marshier +marshiest +marshmallow +marshmallow's +marshmallows +marshy +marsupial +marsupial's +marsupials +mart +mart's +marted +martial +martin +martin's +marting +marts +martyr +martyr's +martyrdom +martyrdom's +martyred +martyring +martyrs +marvel +marvels +mas +mascara +mascara's +mascaraed +mascaraing +mascaras +mascot +mascot's +mascots +masculine +masculines +mash +mash's +mashed +mashes +mashing +masked +masking +masks +masochist +masochist's +masochists +mason +mason's +masonry +masonry's +masons +masquerade +masquerade's +masqueraded +masquerades +masquerading +massacre +massacre's +massacred +massacres +massacring +massage +massage's +massaged +massages +massaging +massed +massing +mast +mast's +mastered +masterful +mastering +masterly +mastermind +masterminded +masterminding +masterminds +masterpiece +masterpiece's +masterpieces +mastery +mastery's +masticate +masticated +masticates +masticating +masts +masturbation +masturbation's +mat +mat's +matador +matador's +matadors +matchbook +matchbook's +matchbooks +matchless +matchmaker +matchmaker's +matchmakers +mated +materialism +materialism's +materialist +materialist's +materialistic +materialists +maternal +maternity +maternity's +mates +math +math's +mating +mating's +matine +matines +matriarch +matriarch's +matriarchal +matriarchs +matriculate +matriculated +matriculates +matriculating +matriculation +matriculation's +matrimonial +matrimony +matrimony's +matron +matron's +matronly +matrons +mats +matte +matted +mattered +mattering +mattes +matting +matting's +mattress +mattress's +mattresses +matured +maturer +matures +maturest +maturing +maturities +maturity +maturity's +maudlin +maul +mauled +mauling +mauls +mausoleum +mausoleum's +mausoleums +mauve +mauve's +maverick +maverick's +mavericked +mavericking +mavericks +maxim +maxim's +maxima's +maximal +maxims +maximums +maybes +mayhem +mayhem's +mayonnaise +mayonnaise's +mayors +mazes +meadow +meadow's +meadows +mealed +mealier +mealies +mealiest +mealing +mealy +meander +meandered +meandering +meanders +meaner +meanest +measles +measles's +measlier +measliest +measly +measurable +meats +mechanic's +mechanically +medal +medal's +medallion +medallion's +medallions +medals +meddle +meddled +meddler +meddlers +meddles +meddlesome +meddling +median +medias +mediate +mediated +mediates +mediating +mediation +mediation's +mediator +mediator's +mediators +medically +medicals +medicate +medicated +medicates +medicating +medication +medication's +medications +medicinal +medicinals +medicines +mediocre +mediocrities +mediocrity +mediocrity's +meditate +meditated +meditates +meditating +meditation +meditation's +meditations +medley +medley's +medleys +meek +meeker +meekest +meekly +meekness +meekness's +meeter +megalomaniac +megalomaniac's +megaphone +megaphone's +megaphoned +megaphones +megaphoning +megaton +megaton's +megatons +melancholy +melancholy's +mellow +mellowed +mellower +mellowest +mellowing +mellows +melodic +melodics +melodies +melodious +melodrama +melodrama's +melodramas +melodramatic +melodramatics +melon +melon's +melons +melted +melting +melts +memberships +membrane +membrane's +membranes +memento +memento's +mementos +memo +memo's +memoir +memoirs +memorably +memorandum +memorandum's +memorandums +memorial +memorials +memos +menace +menaced +menaces +menacing +menagerie +menagerie's +menageries +mending's +menial +menials +menopause +menopause's +menstrual +menstruate +menstruated +menstruates +menstruating +menstruation +menstruation's +mentalities +menthol +menthol's +mentor +mentor's +mentored +mentoring +mentors +mercantile +mercenaries +mercenary +merchandise +merchandise's +merchandised +merchandises +merchandising +merchant +merchant's +merchanted +merchanting +merchants +mercies +merciful +mercifully +merciless +mercilessly +mered +merer +meres +merest +merger +merger's +mergers +meridian +meridian's +meridians +mering +meringue +meringue's +meringues +merited +meriting +mermaid +mermaid's +mermaids +merrier +merriest +merrily +merriment +merriment's +mes +mesdames +mesh +mesh's +meshed +meshes +meshing +messaged +messaging +messenger +messenger's +messengers +messier +messiest +metabolic +metabolism +metabolism's +metabolisms +metallic +metallurgy +metallurgy's +metals +metamorphose +metamorphoses +metamorphosis +metamorphosis's +metaphorical +metaphorically +metaphors +metaphysical +metaphysics +mete +meted +meteor +meteor's +meteoric +meteorite +meteorite's +meteorites +meteorologist +meteorologists +meteorology +meteorology's +meteors +metes +methodical +methodology +methodology's +meticulous +meting +metropolis +metropolis's +metropolises +metropolitan +mettle +mettle's +mew +mewed +mewing +mews +mezzanine +mezzanine's +mezzanines +microbe +microbe's +microbes +microbiology +microbiology's +microcode +microfiche +microfiche's +microfilm +microfilm's +microfilmed +microfilming +microfilms +microorganism +microorganism's +microorganisms +microphone +microphone's +microphones +microscope +microscope's +microscopes +microscopic +microsecond +microseconds +microwaved +microwaves +microwaving +middleman +middleman's +middlemen +middles +midget +midget's +midgets +midriff +midriff's +midriffs +midst +midst's +midstream +midstream's +midsummer +midsummer's +midway +midways +midwife +midwife's +midwifed +midwifes +midwifing +midwives +mien +mien's +miens +mightier +mightiest +migraine +migraine's +migraines +migrant +migrant's +migrants +migrations +migratory +mike +mike's +miked +mikes +miking +milder +mildest +mildew +mildew's +mildewed +mildewing +mildews +mileages +milestone +milestone's +milestones +militancy +militancy's +militant +militants +militarily +militate +militated +militates +militating +militia +militia's +militias +milked +milker +milkier +milkiest +milking +milkman +milkman's +milkmen +milks +milky +milled +miller +miller's +millers +milliner +milliner's +milliners +millinery +millinery's +milling +milling's +millionaire +millionaire's +millionaires +millionth +millionth's +millionths +millisecond +milliseconds +mills +mime +mime's +mimed +mimes +mimicked +mimicking +mimicries +mimicry +mimicry's +mimics +miming +mince +minced +mincemeat +mincemeat's +minces +mincing +mindbogglingly +mindedness +mindful +mindlessly +minefield +minefield's +miner +miner's +mineral +mineral's +minerals +miners +mingle +mingled +mingles +mingling +miniature +miniature's +miniatured +miniatures +miniaturing +minibus +minibus's +minibuses +minicomputer +minicomputer's +minimalism +minimally +minimals +minimums +minion +minion's +minions +ministered +ministerial +ministering +ministries +ministry +ministry's +mink +mink's +minks +minnow +minnow's +minnows +minored +minoring +minors +minstrel +minstrel's +minstrels +minted +minting +mints +minuet +minuet's +minuets +minuscule +minuscule's +minuscules +minuses +minuted +minuter +minutest +minuting +miraculously +mirage +mirage's +mirages +mire +mire's +mired +mires +miring +mirrored +mirroring +mirth +mirth's +misadventure +misadventure's +misadventures +misapprehension +misapprehension's +misappropriate +misappropriated +misappropriates +misappropriating +misappropriation +misappropriations +misbehave +misbehaved +misbehaves +misbehaving +miscarriage +miscarriage's +miscarriages +miscarried +miscarries +miscarry +miscarrying +miscellany +miscellany's +mischief +mischief's +mischiefed +mischiefing +mischiefs +mischievous +misconception +misconception's +misconceptions +misconduct +misconduct's +misconducted +misconducting +misconducts +misconstrue +misconstrued +misconstrues +misconstruing +misdeed +misdeed's +misdeeds +misdirection +misdirection's +miser +miser's +miserables +miseries +miserly +misers +misfit +misfit's +misfits +misfitted +misfitting +misfortunes +misgiving +misgivings +mishap +mishap's +mishapped +mishapping +mishaps +misinform +misinformation +misinformation's +misinformed +misinforming +misinforms +misinterpretation +misinterpretation's +misjudge +misjudged +misjudges +misjudging +mislaid +mislay +mislaying +mislays +mismanagement +mismanagement's +mismatch +mismatched +mismatches +mismatching +misnomer +misnomer's +misnomered +misnomering +misnomers +misprinted +misprinting +misprints +misquote +misquoted +misquotes +misquoting +misrepresentation +misrepresentation's +misrepresentations +misshapen +missionaries +missionary +missionary's +missioned +missioning +missions +missive +missive's +missives +misspell +misspelled +misspelling +misspelling's +misspellings +misspells +mist's +misted +mistier +mistiest +misting +mistletoe +mistletoe's +mistress +mistress's +mistresses +mistrust +mistrusted +mistrusting +mistrusts +misty +mistype +mistyping +misunderstandings +misused +misuses +misusing +mite +mite's +mites +mitigate +mitigated +mitigates +mitigating +mitt +mitt's +mitten +mitten's +mittens +mitts +mixer +mixer's +mixers +mixtures +mnemonics +mnemonics's +moat +moat's +moated +moating +moats +mobbed +mobbing +mobiles +mobility +mobility's +mobs +moccasin +moccasin's +moccasins +mocked +mockeries +mockery +mockery's +mocking +mockingbird +mockingbird's +mockingbirds +mocks +modal +moder +moderated +moderates +moderating +moderator +moderator's +moderators +moderner +modernest +modernity +modernity's +moderns +modester +modestest +modestly +modesty +modesty's +modicum +modicum's +modicums +modifier +modifier's +modifiers +modular +modulate +modulated +modulates +modulating +modulation +modulation's +modulations +mohair +mohair's +moist +moisten +moistened +moistening +moistens +moister +moistest +moisture +moisture's +molar +molar's +molars +molasses +molasses's +molecule's +moles +molest +molested +molesting +molests +mollified +mollifies +mollify +mollifying +mollusk +mollusks +molt +molted +molten +molting +molts +mom +mom's +momentary +momentous +moms +monarchies +monarchs +monarchy +monarchy's +monasteries +monastery +monastery's +monastic +monastics +monetarism +monetary +mongoose +mongoose's +mongrel +mongrel's +mongrels +monies +monies's +monk +monk's +monkeyed +monkeying +monks +monogamous +monogamy +monogamy's +monogram +monogram's +monogrammed +monogramming +monograms +monolithic +monologue +monologue's +monologued +monologues +monologuing +monopolies +monorail +monorail's +monorails +monosyllable +monosyllable's +monosyllables +monotonically +monotonous +monotony +monotony's +monsoon +monsoon's +monsoons +monstrosities +monstrosity +monstrosity's +monstrous +monthlies +monument +monument's +monumental +monuments +moo +moodier +moodiest +moodily +moods +moody +mooed +mooing +moonbeam +moonbeam's +moonbeams +mooned +mooning +moonlight +moonlight's +moonlighted +moonlighting +moonlights +moor +moor's +moored +mooring +mooring's +moorings +moors +moos +moose +moose's +moot +mooted +mooter +mooting +moots +mop +mop's +mope +moped +moped's +mopes +moping +mopped +mopping +mops +morale +morale's +moralist +moralist's +moralists +moralities +moralled +moralling +morass +morass's +morasses +moratorium +moratorium's +moratoriums +morbid +morgue +morgue's +morgues +morn +morn's +morned +morns +moronic +morose +morphine +morphine's +morphology +morphology's +morsel +morsel's +morsels +mortally +mortar +mortar's +mortared +mortaring +mortars +mortgage +mortgage's +mortgaged +mortgages +mortgaging +mortification +mortification's +mortified +mortifies +mortify +mortifying +mortuaries +mortuary +mortuary's +mosaic +mosaic's +mosaics +mosque +mosque's +mosques +mosquito +mosquito's +mosquitoes +moss +moss's +mosses +mossier +mossies +mossiest +mossy +motel +motel's +motels +moth +moth's +mothball +mothball's +mothballed +mothballing +mothballs +mothered +motherhood +motherhood's +mothering +motherly +moths +motif +motif's +motifs +motioned +motioning +motionless +motivations +motley +motleys +motlier +motliest +motorbike +motorbike's +motorbikes +motorcade +motorcade's +motorcades +motorcycle +motorcycle's +motorcycled +motorcycles +motorcycling +motored +motoring +motoring's +motorist +motorist's +motorists +mottoes +mound +mound's +mounded +mounding +mounds +mountaineer +mountaineer's +mountaineered +mountaineering +mountaineers +mountainous +mourn +mourned +mourner +mourner's +mourners +mournful +mournfuller +mournfullest +mourning +mourning's +mourns +moused +mouses +mousier +mousiest +mousing +mousse +mousse's +moussed +mousses +moussing +mousy +mouthed +mouthful +mouthful's +mouthfuls +mouthing +mouthpiece +mouthpiece's +mouthpieces +mouths +movable +movables +mover +mover's +movers +mow +mowed +mower +mower's +mowers +mowing +mows +ms +mu +mu's +mucous +mucus +mucus's +muddied +muddier +muddies +muddiest +muddy +muddying +muff +muff's +muffed +muffin +muffin's +muffing +muffins +muffle +muffled +muffler +muffler's +mufflers +muffles +muffling +muffs +mugged +mugger +mugger's +muggers +muggier +muggiest +mugginess +mugging +muggy +mulch +mulch's +mulched +mulches +mulching +mule +mule's +muled +mules +muling +mull +mulled +mulling +mulls +multinational +multinationals +multiplications +multiplicative +multiplicities +multiplicity +multiplicity's +multiprocessing +multitasking +multitude +multitude's +multitudes +mumbled +mumbles +mumbling +mummies +mummified +mummifies +mummify +mummifying +mumps +mumps's +mums +munch +munched +munches +munching +mundanes +municipal +municipalities +municipality +municipality's +municipals +mural +mural's +murals +murderers +murderous +murkier +murkiest +murky +murmur +murmur's +murmured +murmuring +murmurs +muscled +muscling +muscular +muse +mused +muses +mush +mush's +mushed +mushes +mushier +mushiest +mushing +mushroom +mushroom's +mushroomed +mushrooming +mushrooms +mushy +musically +musicals +musicked +musicking +musics +musing +musk +musk's +musked +musket +musket's +muskets +musking +musks +muss +mussed +mussel +mussel's +mussels +musses +mussing +mustang +mustang's +mustangs +mustard +mustard's +muster +mustered +mustering +musters +mustier +mustiest +musts +musty +mutant +mutant's +mutants +mutate +mutated +mutates +mutating +mutation +mutation's +mutations +mute +muted +mutely +muter +mutes +mutest +mutilate +mutilated +mutilates +mutilating +mutilation +mutilation's +mutilations +muting +mutinied +mutinies +mutinous +mutiny +mutiny's +mutinying +mutt +mutt's +mutton +mutton's +mutts +muzzle +muzzle's +muzzled +muzzles +muzzling +myopic +myopics +myriad +myriads +mys +mysteried +mysterying +mystical +mysticism +mysticism's +mystics +mystified +mystifies +mystify +mystifying +mythological +mythologies +nab +nabbed +nabbing +nabs +nag +nagged +nagging +nags +naively +naiver +naives +naivest +naivety +naivety's +naivet +naivet's +nakeder +nakedest +nakedness +nakedness's +namesake +namesake's +namesakes +nap +napalm +napalm's +napalmed +napalming +napalms +nape +nape's +napes +napkin +napkin's +napkins +napped +nappies +napping +nappy +nappy's +naps +narcotic +narcotic's +narcotics +narrate +narrated +narrates +narrating +narration +narration's +narrations +narratives +narrator +narrator's +narrators +narrowed +narrowing +narrowly +narrowness +narrowness's +narrows +nasal +nasals +nastily +nastiness +nastiness's +nationalism +nationalism's +nationalist +nationalist's +nationalistic +nationalists +nationalities +nationality +nationality's +nationals +nationwide +nativities +nativity +nativity's +nattier +nattiest +natty +naturalist +naturalist's +naturalists +naturalness +naturals +natured +natures +naturing +naughtier +naughties +naughtiest +naughtily +naughtiness +naughtiness's +nausea +nausea's +nauseate +nauseated +nauseates +nauseating +nauseous +nautical +naval +navel +navel's +navels +navies +navigable +navigate +navigated +navigates +navigating +navigation +navigation's +navigator +navigator's +navigators +navy +navy's +nays +neared +nearing +nearlier +nearliest +nears +nearsighted +nearsightedness +neater +neatest +neatness +neatness's +nebula +nebula's +nebulae +nebulous +necessaries +necessitate +necessitated +necessitates +necessitating +necessities +necked +neckerchief +neckerchief's +neckerchiefs +necking +necklace +necklace's +necklaces +neckline +neckline's +necklines +necks +necktie +necktie's +neckties +necrophilia +necrophilia's +nectar +nectar's +nectarine +nectarine's +nectarines +needier +neediest +needled +needlework +needlework's +needling +needy +negated +negates +negating +negation +negation's +negations +negatived +negatively +negatives +negativing +neglectful +negligee +negligee's +negligees +negligence +negligence's +negligent +negligently +negotiator +negotiator's +negotiators +neigh +neigh's +neighed +neighing +neighs +neon +neon's +neophyte +neophyte's +neophytes +nephew +nephew's +nephews +nepotism +nepotism's +nerved +nerving +nervously +nervousness +nervousness's +nestle +nestled +nestles +nestling +nether +netted +netting +netting's +nettle +nettle's +nettled +nettles +nettling +neurologist +neurologist's +neurologists +neurology +neurology's +neuron +neuron's +neurons +neuroses +neurosis +neurosis's +neurotic +neurotics +neuter +neutered +neutering +neuters +neutrality +neutrality's +neutrals +neutron +neutron's +neutrons +newbie +newbies +newborn +newborns +newed +newfangled +newing +newsagents +newscast +newscast's +newscaster +newscaster's +newscasters +newscasting +newscasts +newsed +newses +newsier +newsiest +newsing +newspapered +newspapering +newsprint +newsprint's +newsstand +newsstand's +newsstands +newsy +newt +newt's +newton +newton's +newts +nibble +nibbled +nibbles +nibbling +niceties +nicety +niche +niche's +niches +nickel +nickel's +nickels +nicknamed +nicknaming +nicotine +nicotine's +niece +niece's +nieces +niftier +niftiest +nifty +nigh +nightclub +nightclub's +nightclubbed +nightclubbing +nightclubs +nightfall +nightfall's +nightgown +nightgown's +nightgowns +nightingale +nightingale's +nightingales +nightly +nightmares +nightmarish +nighttime +nilled +nilling +nils +nimble +nimbler +nimblest +nimbly +nincompoop +nincompoop's +nincompoops +nines +nineteen +nineteen's +nineteens +nineteenth +nineteenths +nineties +ninetieth +ninetieths +ninety +ninety's +ninnies +ninny +ninny's +ninth +ninths +nip +nipped +nippier +nippiest +nipping +nipple +nipple's +nippled +nipples +nippling +nippy +nips +nit +nit's +nitrate +nitrate's +nitrated +nitrates +nitrating +nitrogen +nitrogen's +nits +nitwit +nitwit's +nitwits +nobility +nobility's +nobleman +nobleman's +noblemen +nobler +nobles +noblest +noblewoman +noblewomen +nobly +nobodies +nocturnal +nod +nodded +nodding +nods +noes +noised +noiseless +noiselessly +noisier +noisiest +noisily +noisiness +noisiness's +noising +nomad +nomad's +nomadic +nomads +nomenclature +nomenclature's +nomenclatures +nomination +nomination's +nominations +nominative +nominatives +nominee +nominee's +nominees +non +nonchalance +nonchalance's +nonchalant +nonchalantly +noncommittal +nonconformist +nonconformist's +nonconformists +nondescript +nonentities +nonentity +nonentity's +nones +nonfiction +nonfiction's +nonflammable +nonpartisan +nonpartisans +nonprofit +nonprofits +nonresident +nonresident's +nonresidents +nonsensical +nonstandard +nonstop +nontrivial +nonviolence +nonviolence's +noodle +noodle's +noodled +noodles +noodling +nook +nook's +nooks +nooned +nooning +noons +noose +noose's +nooses +normed +norming +norms +northeast +northeast's +northeasterly +northeastern +northerlies +northerly +northward +northwest +northwest's +northwestern +nosebleed +nosebleed's +nosebleeds +nosed +nosing +nostalgic +nostalgics +nostril +nostril's +nostrils +notables +notations +notch +notch's +notched +notches +notching +notebook +notebook's +notebooks +noteworthy +nothingness +nothingness's +nothings +noticeboard +noticeboards +notifications +notional +notoriety +notoriously +nougat +nougat's +nougats +nourish +nourished +nourishes +nourishing +nourishment +nourishment's +nova +nova's +novelist +novelist's +novelists +novelties +noxious +nozzle +nozzle's +nozzles +nuance +nuance's +nuances +nuclei +nuclei's +nucleus +nucleus's +nude +nuder +nudes +nudest +nudge +nudged +nudges +nudging +nudity +nudity's +nugget +nugget's +nuggets +nuisances +nullified +nullifies +nullify +nullifying +nulls +numbed +numbing +numbness +numbness's +numbs +numeral's +numerate +numerator +numerator's +numerators +numerically +nun's +nuptial +nuptials +nursed +nursemaid +nursemaid's +nursemaids +nurseries +nursery +nursery's +nursing +nurture +nurture's +nurtured +nurtures +nurturing +nutcracker +nutcracker's +nutcrackers +nutmeg +nutmeg's +nutmegged +nutmegging +nutmegs +nutrient +nutrient's +nutrients +nutriment +nutriment's +nutriments +nutrition +nutrition's +nutritional +nutritious +nutshell +nutshell's +nutshells +nutted +nuttier +nuttiest +nutting +nutty +nuzzle +nuzzled +nuzzles +nuzzling +nylon +nylon's +nymph +nymph's +nymphs +ne +oaf +oaf's +oafs +oak +oak's +oaks +oared +oaring +oars +oases +oasis +oasis's +oath +oath's +oaths +oatmeal +oatmeal's +obedience +obedience's +obedient +obediently +obelisk +obelisk's +obelisks +obese +obesity +obesity's +obfuscation +obfuscation's +obituaries +obituary +obituary's +objectively +objectives +objectivity +objectivity's +objector +objectors +obligate +obligated +obligates +obligating +obligations +oblique +obliques +obliterate +obliterated +obliterates +obliterating +obliteration +obliteration's +oblivion +oblivion's +oblivious +oblong +oblongs +oboe +oboe's +oboes +obscener +obscenest +obscenities +obscenity +obscenity's +obscurer +obscurest +obscurities +observable +observance +observance's +observances +observant +observatories +observatory +observatory's +obsessions +obsessive +obsolescence +obsolescent +obsoleted +obsoletes +obsoleting +obstacle +obstacle's +obstacles +obstetrician +obstetrician's +obstetricians +obstetrics +obstetrics's +obstinacy +obstinacy's +obstinate +obstruction +obstruction's +obstructions +obstructive +obtrusive +obtuse +obtuser +obtusest +occasioned +occasioning +occupancy +occupancy's +occupant +occupant's +occupants +occupational +occupations +oceanic +oceanography +oceanography's +oceans +octagon +octagon's +octagonal +octagons +octal +octave +octave's +octaves +octopus +octopus's +octopuses +ocular +oculars +odder +oddest +oddities +oddity +oddity's +ode +ode's +odes +odious +odometer +odometer's +odometers +offbeat +offbeat's +offbeats +offed +offensiveness +offensiveness's +offensives +officiate +officiated +officiates +officiating +officious +offing +offing's +offings +offload +offs +offshoot +offshoot's +offshoots +offshore +offstage +offstages +oftener +oftenest +ogle +ogled +ogles +ogling +ogre +ogre's +ogres +ohm +ohm's +ohms +ohs +oiled +oilier +oiliest +oiling +oils +oily +ointment +ointment's +ointments +okay +okays +okra +okra's +okras +olden +oldened +oldening +oldens +olfactory +olive +olive's +olives +omega +omega's +omelet +omelet's +omelets +omelette's +omen +omen's +omens +ominous +ominously +omnibus +omnibus's +omnipotence +omnipotence's +omnipotent +omnipresent +omniscient +oncoming +onerous +onioned +onioning +onions +onliest +onlooker +onlooker's +onlookers +onomatopoeia +onomatopoeia's +onrush +onrush's +onrushes +onset +onset's +onsets +onsetting +onslaught +onslaught's +onslaughts +onuses +onward +oodles +ooze +oozed +oozes +oozing +opal +opal's +opals +opaque +opaqued +opaquer +opaques +opaquest +opaquing +opener +opener's +openers +openest +openings +openness +operand +operand's +operands +operatic +operatics +operative +operatives +ophthalmologist +ophthalmologist's +ophthalmologists +ophthalmology +ophthalmology's +opinionated +opium +opium's +opossum +opossum's +opossums +opportune +opportunist +opportunist's +opportunists +opposites +oppressive +oppressor +oppressor's +oppressors +optician +optician's +opticians +optics +optics's +optima +optimise's +optimism +optimism's +optimist +optimist's +optimists +optimums +optionals +optioned +optioning +optometrist +optometrist's +optometrists +opulent +opus's +oracle +oracle's +oracled +oracles +oracling +orals +oranges +orangutan +orangutan's +orangutans +oration +oration's +orations +orator +orator's +oratories +orators +oratory +oratory's +orbitals +orbited +orbiting +orbits +orchard +orchard's +orchards +orchestras +orchestrate +orchestrated +orchestrates +orchestrating +orchestration +orchestration's +orchestrations +orchid +orchid's +orchids +ordain +ordained +ordaining +ordains +ordeal +ordeal's +ordeals +orderlies +orderly +ordinance +ordinance's +ordinances +ordinarier +ordinaries +ordinariest +ordinarily +ordination +ordination's +ordinations +ore +ore's +ores +organics +organism +organism's +organisms +organist +organist's +organists +orgasm +orgasm's +orgies +orgy +orgy's +orient's +orientations +orifice +orifice's +originality +originality's +originators +ornament +ornament's +ornamental +ornamented +ornamenting +ornaments +ornate +ornately +ornithologist +ornithologist's +ornithologists +ornithology +ornithology's +orphan +orphan's +orphanage +orphanage's +orphanages +orphaned +orphaning +orphans +orthodontist +orthodontist's +orthodontists +orthodoxes +orthogonal +orthogonality +orthogonality's +orthography +orthography's +oscillate +oscillated +oscillates +oscillating +oscillation +oscillations +oscilloscope +oscilloscope's +osmosis +osmosis's +ostensible +ostensibly +ostentation +ostentation's +ostentatious +ostrich +ostrich's +ostriches +otter +otter's +ottered +ottering +otters +ouch +ounce +ounce's +ounces +oust +ousted +ouster +ouster's +ousters +ousting +ousts +outbound +outbreak +outbreak's +outbreaking +outbreaks +outbroke +outbroken +outburst +outburst's +outbursting +outbursts +outcast +outcast's +outcasting +outcasts +outclass +outclassed +outclasses +outclassing +outcries +outdid +outdistance +outdistanced +outdistances +outdistancing +outdo +outdoes +outdoing +outdone +outdoor +outdoors +outed +outermost +outers +outfield +outfield's +outfields +outfit +outfit's +outfits +outfitted +outfitting +outgoings +outgrew +outgrow +outgrowing +outgrown +outgrows +outgrowth +outgrowth's +outgrowths +outhouse +outhouse's +outhouses +outing +outing's +outings +outlaid +outlandish +outlast +outlasted +outlasting +outlasts +outlaw +outlaw's +outlawed +outlawing +outlaws +outlay +outlay's +outlaying +outlays +outlet +outlet's +outlets +outlive +outlived +outlives +outliving +outlooked +outlooking +outlooks +outlying +outmoded +outnumber +outnumbered +outnumbering +outnumbers +outpatient +outpatient's +outpatients +outpost +outpost's +outposts +outputted +outputting +outrageously +outran +outrun +outrunning +outruns +outs +outsets +outsetting +outshine +outshines +outshining +outshone +outsider +outsider's +outsiders +outsides +outskirt +outskirts +outsmart +outsmarted +outsmarting +outsmarts +outspoken +outstandingly +outstation +outstation's +outstations +outstrip +outstripped +outstripping +outstrips +outward +outwardly +outwards +outweighed +outweighing +outwit +outwits +outwitted +outwitting +ova +ova's +oval +ovals +ovaries +ovary +ovary's +ovation +ovation's +ovations +oven +oven's +ovens +overalls +overate +overbear +overbearing +overbears +overblown +overboard +overbore +overborne +overburden +overburdened +overburdening +overburdens +overcast +overcasting +overcasts +overcharge +overcharged +overcharges +overcharging +overcoat +overcoat's +overcoats +overcrowd +overcrowded +overcrowding +overcrowds +overdid +overdo +overdoes +overdoing +overdone +overdose +overdose's +overdosed +overdoses +overdosing +overdraw +overdrawing +overdrawn +overdraws +overdrew +overeat +overeaten +overeating +overeats +overestimate +overestimated +overestimates +overestimating +overflowed +overflowing +overflows +overgrew +overgrow +overgrowing +overgrown +overgrows +overhand +overhands +overhang +overhanging +overhangs +overhaul +overhauled +overhauling +overhauls +overhear +overheard +overhearing +overhears +overheat +overheated +overheating +overheats +overhung +overkill +overkill's +overlaid +overlain +overland +overlands +overlapped +overlapping +overlaps +overlay +overlaying +overlays +overlie +overlies +overlying +overnights +overpass +overpass's +overpasses +overpopulation +overpopulation's +overpower +overpowered +overpowering +overpowers +overprint +overprinted +overprinting +overprints +overran +overrate +overrated +overrates +overrating +overreact +overreacted +overreacting +overreacts +overrule +overruled +overrules +overruling +overrun +overrunning +overruns +overs +oversampling +oversaw +oversee +overseeing +overseen +overseer +overseer's +overseers +oversees +overshadow +overshadowed +overshadowing +overshadows +overshoot +overshooting +overshoots +overshot +oversight +oversight's +oversights +oversimplification +oversimplification's +oversleep +oversleeping +oversleeps +overslept +overstate +overstated +overstates +overstating +overstep +overstepped +overstepping +oversteps +overt +overtake +overtaken +overtakes +overtaking +overthrew +overthrow +overthrowing +overthrown +overthrows +overtimes +overtly +overtook +overture +overture's +overtures +overturn +overturned +overturning +overturns +overuse +overused +overuses +overusing +overweight +overwhelmingly +overwork +overworked +overworking +overworks +overwrite +overwrites +overwrought +ovum +ovum's +owl +owl's +owls +ox +ox's +oxen +oxen's +oxes +oxidation +oxidation's +oxide +oxide's +oxides +oyster +oyster's +oysters +pa +pa's +paced +pacemaker +pacemaker's +pacemakers +paces +pacific +pacified +pacifiers +pacifies +pacifism +pacifism's +pacifist +pacifist's +pacifists +pacify +pacifying +pacing +packer +packer's +packers +pact +pact's +pacts +paddies +paddle +paddle's +paddled +paddles +paddling +paddock +paddock's +paddocked +paddocking +paddocks +paddy +paddy's +padlock +padlock's +padlocked +padlocking +padlocks +pagan +pagan's +pagans +pageant +pageant's +pageantry +pageantry's +pageants +pager +pagination +pagoda +pagoda's +pagodas +pail +pail's +pails +pained +painfuller +painfullest +paining +painlessly +painstaking +painter +painter's +paired +pairing +pal +pal's +palaces +palatable +palate +palate's +palates +palatial +paled +paleontologist +paleontologists +paleontology +paleontology's +paler +pales +palest +palette +palette's +palettes +paling +pall +pall's +pallbearer +pallbearer's +pallbearers +palled +pallid +palling +pallor +pallor's +palls +palm +palm's +palmed +palming +palms +palomino +palomino's +palominos +palpable +palpably +pals +paltrier +paltriest +paltry +pamper +pampered +pampering +pampers +pamphlet +pamphlet's +pamphlets +panacea +panacea's +panaceas +pancake +pancake's +pancaked +pancakes +pancaking +pancreas +pancreas's +pancreases +pancreatic +panda +panda's +pandas +pandemonium +pandemonium's +pander +pandered +pandering +panders +pane +pane's +panes +pang +pang's +panged +panging +pangs +panhandle +panhandle's +panhandled +panhandler +panhandlers +panhandles +panhandling +panicked +panickier +panickiest +panicking +panicky +panics +panned +panning +panorama +panorama's +panoramas +panoramic +pans +pansies +pansy +pansy's +panted +panther +panther's +panthers +pantie +panties +panting +pantomime +pantomime's +pantomimed +pantomimes +pantomiming +pantries +pantry +pantry's +pap +pap's +papa +papa's +papacies +papacy +papacy's +papal +papas +papaya +papaya's +papayas +paperbacked +paperbacking +paperbacks +papered +papering +paperweight +paperweight's +paperweights +paperwork +paperwork's +paprika +paprika's +papyri +papyrus +papyrus's +parable +parable's +parabled +parables +parabling +parachute +parachute's +parachuted +parachutes +parachuting +paraded +parades +paradigm +paradigm's +parading +paradises +paradoxes +paradoxical +paradoxically +paraffin +paraffin's +paragon +paragon's +paragons +paragraphed +paragraphing +parakeet +parakeet's +parakeets +paralysis +paralysis's +paralytic +paralytics +paramount +paranoids +paraphernalia +paraphrased +paraphrases +paraphrasing +paraplegic +paraplegics +parasite +parasite's +parasites +parasitic +parasol +parasol's +parasols +paratrooper +paratrooper's +paratroopers +parcel +parcel's +parcels +parch +parched +parches +parching +parchment +parchment's +parchments +pardonable +pardoned +pardoning +pardons +pare +pared +parentage +parentage's +parental +parented +parenthesis's +parenthetical +parenthood +parenthood's +parenting +pares +paring +parish +parish's +parishes +parishioner +parishioner's +parishioners +parka +parka's +parkas +parkway +parkway's +parkways +parliamentary +parliaments +parodied +parodies +parodying +parole +parole's +paroled +paroles +paroling +parred +parring +parroted +parroting +parrots +pars +parsec +parsecs +parser +parser's +parsley +parsley's +parsnip +parsnip's +parsnips +parson +parson's +parsonage +parsonage's +parsonages +parsons +partake +partaken +partakes +partaking +parted +partiality +partiality's +partials +participant's +participation +participation's +participle +participle's +participles +particulars +partied +parting +parting's +partings +partisan +partisan's +partisans +partnered +partnering +partnership +partnership's +partnerships +partook +partridge +partridge's +partridges +partying +pas +passable +passageway +passageway's +passageways +passbook +passbook's +passbooks +passer +passionated +passionately +passionates +passionating +passioned +passioning +passions +passively +passives +passports +pass +pass's +pasta +pasta's +pastas +pasted +pastel +pastel's +pastels +pastes +pastiche +pastiche's +pastier +pasties +pastiest +pastime +pastime's +pastimes +pasting +pastor +pastor's +pastoral +pastorals +pastors +pastries +pastry +pastry's +pasts +pasture +pasture's +pastured +pastures +pasturing +pasty +patchwork +patchwork's +patchworks +patchy +pate +pate's +patented +patenting +patently +patents +paternal +paternalism +paternalism's +paternity +paternity's +pates +pathetically +pathological +pathologist +pathologists +pathology +pathology's +pathos +pathos's +pathway +pathway's +pathways +patienter +patientest +patiently +patio +patio's +patios +patriarch +patriarch's +patriarchal +patriarchs +patrimonies +patrimony +patrimony's +patriot +patriot's +patriotic +patriotism +patriotism's +patriots +patrol +patrol's +patrolled +patrolling +patrols +patron +patron's +patronage +patronage's +patronages +patrons +pats +patted +patter +pattered +pattering +patterned +patterning +patters +patties +patting +patty +patty's +paucity +paucity's +paunch +paunch's +paunched +paunches +paunchier +paunchiest +paunching +paunchy +pauper +pauper's +paupers +pave +paved +pavemented +pavementing +pavements +paves +pavilion +pavilion's +pavilions +paving +paving's +paw +paw's +pawed +pawing +pawn +pawnbroker +pawnbroker's +pawnbrokers +pawned +pawning +pawns +paws +payable +payer +payers +payload +payload's +payoff +payoff's +payoffs +payroll +payroll's +payrolls +pea +pea's +peaceable +peacefuller +peacefullest +peacefully +peacemaker +peacemaker's +peacemakers +peaces +peach +peach's +peaches +peacock +peacock's +peacocks +peaked +peaking +peal +peal's +pealed +pealing +peals +peanut's +pear +pear's +pearl +pearl's +pearled +pearling +pearls +pears +peas +peasant's +peat +peat's +pebble +pebble's +pebbled +pebbles +pebbling +pecan +pecan's +pecans +peck +peck's +pecked +pecking +pecks +peculiarities +peculiarity +peculiarity's +peculiarly +pedagogy +pedagogy's +pedals +peddle +peddled +peddler +peddler's +peddlers +peddles +peddling +pedestal +pedestal's +pedestals +pediatrician's +pediatricians +pediatrics +pedigree +pedigree's +pedigrees +peek +peeked +peeking +peeks +peel +peeled +peeling +peeling's +peels +peep +peeped +peeping +peeps +peered +peering +peerless +peeve +peeved +peeves +peeving +peevish +peg +peg's +pegged +pegging +pegs +pelican +pelican's +pelicans +pellet +pellet's +pelleted +pelleting +pellets +pelt +pelted +pelting +pelts +pelvic +pelvics +pelvis +pelvis's +pelvises +penal +penance +penance's +penanced +penances +penancing +penchant +penchant's +pencils +pendant +pendant's +pendants +pendulum +pendulum's +pendulums +penetrate +penetrated +penetrates +penetrating +penetration +penetration's +penetrations +penguins +penicillin +penicillin's +peninsula +peninsula's +peninsulas +penis +penis's +penises +penitence +penitence's +penitent +penitentiaries +penitentiary +penitentiary's +penitents +penknife +penknife's +penknives +penmanship +penmanship's +pennant +pennant's +pennants +penned +penniless +penning +pension +pension's +pensioned +pensioner +pensioners +pensioning +pensions +pensive +pensively +pentagon +pentagon's +pentagonal +pentagonals +pentagons +penthouse +penthouse's +penthoused +penthouses +penthousing +penultimate +peon +peon's +peonies +peons +peony +peony's +peopled +peopling +pep +pep's +pepped +pepper +pepper's +peppered +peppering +peppermint +peppermint's +peppermints +peppers +pepping +peps +percentages +perceptible +perceptions +perceptive +perch +perch's +perchance +perched +perches +perching +percolate +percolated +percolates +percolating +percolation +percolation's +percolator +percolator's +percolators +percussion +percussion's +peremptory +perennial +perennials +perfected +perfecter +perfectest +perfecting +perfectionist +perfectionist's +perfectionists +perfections +perfects +perforate +perforated +perforates +perforating +perforation +perforations +performer +performer's +performers +perfume +perfume's +perfumed +perfumes +perfuming +perfunctorily +perfunctory +perhapses +peril +peril's +perilous +perilously +perils +perimeter +perimeter's +perimeters +periodical +periodical's +periodicals +peripheries +periphery +periphery's +periscope +periscope's +periscoped +periscopes +periscoping +perish +perishable +perishables +perished +perishes +perishing +perjure +perjured +perjures +perjuries +perjuring +perjury +perjury's +perk +perked +perkier +perkiest +perking +perks +perky +permanence +permanence's +permanents +permeate +permeated +permeates +permeating +permissions +permissive +permutation +permutation's +permutations +pernicious +peroxide +peroxide's +peroxided +peroxides +peroxiding +perpendicular +perpendiculars +perpetrate +perpetrated +perpetrates +perpetrating +perpetrator +perpetrator's +perpetrators +perpetually +perpetuals +perpetuate +perpetuated +perpetuates +perpetuating +perplex +perplexed +perplexes +perplexing +perplexities +perplexity +perplexity's +persecution +persecution's +persecutions +persecutor +persecutor's +persecutors +perseverance +perseverance's +persevere +persevered +perseveres +persevering +persisted +persistence +persistence's +persistently +persisting +persists +persona +persona's +personable +personals +personification +personification's +personifications +personified +personifies +personify +personifying +perspectives +perspiration +perspiration's +perspire +perspired +perspires +perspiring +persuasions +persuasive +persuasively +pert +pertain +pertained +pertaining +pertains +perter +pertest +pertinent +pertinents +perts +perturb +perturbed +perturbing +perturbs +perusal +perusal's +perusals +peruse +perused +peruses +perusing +pervade +pervaded +pervades +pervading +pervasive +perversion +perversion's +perversions +pervert +perverted +perverting +perverts +peskier +peskiest +pesky +pessimism +pessimism's +pessimist +pessimist's +pessimistic +pessimists +pest +pest's +pester +pestered +pestering +pesters +pesticide +pesticide's +pesticides +pestilence +pestilence's +pestilences +pests +petal +petal's +petals +peter +petered +petering +peters +petite +petites +petition +petition's +petitioned +petitioning +petitions +petrified +petrifies +petrify +petrifying +petroleum +petroleum's +pets +petted +petticoat +petticoat's +petticoats +pettier +petties +pettiest +pettiness +petting +petulant +petunia +petunia's +petunias +pew +pew's +pews +pewter +pewter's +pewters +phantom +phantom's +phantoms +pharmaceutical +pharmaceuticals +pharmacist +pharmacist's +pharmacists +pheasant +pheasant's +pheasants +phenomenal +phenomenally +phenomenas +philanthropic +philanthropies +philanthropist +philanthropist's +philanthropists +philanthropy +philanthropy's +phlegm +phlegm's +phlegmatic +phobia +phobia's +phobias +phonetic +phonetics +phonetics's +phonics +phonics's +phonied +phonier +phonies +phoniest +phonograph +phonograph's +phonographs +phony +phonying +phosphor +phosphor's +phosphorescence +phosphorescence's +phosphorescent +phosphorus +phosphorus's +photocopied +photocopier +photocopier's +photocopiers +photocopies +photocopying +photoed +photogenic +photographed +photographer +photographer's +photographers +photographing +photography +photography's +photoing +photon +photons +photosynthesis +photosynthesis's +phototypesetter +phraseology +phraseology's +physicals +physician +physician's +physicians +physiological +physique +physique's +physiques +pianist +pianist's +pianists +pianos +piccolo +piccolo's +piccolos +pickax +pickax's +pickaxed +pickaxes +pickaxing +picket +picket's +picketed +picketing +pickets +pickier +pickiest +pickle +pickle's +pickled +pickles +pickling +pickpocket +pickpocket's +pickpockets +pickup +pickups +picky +picnic +picnic's +picnicked +picnicking +picnics +pictorial +pictorials +pictured +picturesque +picturing +piddle +piddled +piddles +piddling +pieced +piecemeal +piecework +piecework's +piecing +pier +pier's +pierce +pierced +pierces +piercing +piers +pies +piety +piety's +pigeoned +pigeonhole +pigeonhole's +pigeonholed +pigeonholes +pigeonholing +pigeoning +pigeons +pigged +pigging +piggish +piggyback +piggyback's +piggybacked +piggybacking +piggybacks +pigheaded +pigment +pigment's +pigments +pigpen +pigpen's +pigpens +pigtail +pigtail's +pigtails +pike +pike's +piked +pikes +piking +piled +pilfer +pilfered +pilfering +pilfers +pilgrim +pilgrim's +pilgrimage +pilgrimage's +pilgrimages +pilgrims +piling +piling's +pillage +pillaged +pillages +pillaging +pillar +pillar's +pillars +pillow +pillow's +pillowcase +pillowcase's +pillowcases +pillowed +pillowing +pillows +piloted +piloting +pilots +pimple +pimple's +pimples +pimplier +pimpliest +pimply +pimply's +pincushion +pincushion's +pincushions +pine +pine's +pineapple +pineapple's +pineapples +pined +pines +pining +pinion +pinion's +pinioned +pinioning +pinions +pinked +pinker +pinkest +pinking +pinks +pinnacle +pinnacle's +pinnacles +pinned +pinning +pinpoint +pinpointed +pinpointing +pinpoints +pioneer +pioneer's +pioneered +pioneering +pioneers +pious +piped +pipelines +piping +piping's +pique +pique's +piqued +piques +piquing +piracy +piracy's +piranha +piranha's +piranhas +pirate +pirate's +pirated +pirates +pirating +pirouette +pirouette's +pirouetted +pirouettes +pirouetting +pis +pistachio +pistachio's +pistachios +pistol +pistol's +pistols +piston +piston's +pistons +pitched +pitcher +pitcher's +pitchers +pitches +pitchfork +pitchfork's +pitchforked +pitchforking +pitchforks +pitching +piteous +piteously +pitfall's +pithier +pithiest +pithy +pitied +pities +pitiful +pitifuller +pitifullest +pitifully +pitiless +pits +pittance +pittance's +pittances +pitted +pitting +pitying +pivot +pivot's +pivotal +pivoted +pivoting +pivots +pixie +pixie's +pixies +placard +placard's +placarded +placarding +placards +placate +placated +placates +placating +placement +placement's +placenta +placenta's +placentas +placid +placidly +plagiarism +plagiarism's +plagiarisms +plagiarist +plagiarist's +plagiarists +plaice +plaice's +plaid +plaid's +plaided +plaiding +plaids +plainer +plainest +plains +plaintiff +plaintiff's +plaintiffs +plaintive +planar +planed +planetarium +planetarium's +planetariums +planing +plank +plank's +planked +planking +planks +plankton +plankton's +planner +planners +plantain +plantain's +plantains +plantation +plantation's +plantations +planter +planter's +planters +plaque +plaque's +plaques +plasma +plasma's +plastics +plateau +plateau's +plateaued +plateauing +plateaus +plated +platformed +platforming +platforms +plating +platinum +platinum's +platitude +platitude's +platitudes +platoon +platoon's +platooned +platooning +platoons +platter +platter's +platters +plausibility +plausibly +playable +playback +playback's +playful +playfully +playfulness +playfulness's +playgrounds +playhouse +playhouse's +playhouses +playmate +playmate's +playmates +playpen +playpen's +playpens +plaything +plaything's +playthings +playwright +playwright's +playwrights +plaza +plaza's +plazas +plead +pleaded +pleading +pleading's +pleads +pleas +pleasanter +pleasantest +pleasantries +pleasantry +pleasantry's +pleasings +pleasurable +pleasured +pleasures +pleasuring +pleat +pleat's +pleated +pleating +pleats +pledge +pledge's +pledged +pledges +pledging +plentiful +plentifully +plethora +plethora's +pliable +pliant +plied +pliers +plies +plight +plight's +plighted +plighting +plights +plod +plodded +plodding +plods +plop +plop's +plopped +plopping +plops +plotters +ploys +pluck +plucked +plucking +plucks +plucky +plum +plum's +plumage +plumage's +plumb +plumbed +plumber +plumber's +plumbers +plumbing +plumbing's +plumbs +plume +plume's +plumed +plumes +pluming +plummet +plummeted +plummeting +plummets +plump +plumped +plumper +plumpest +plumping +plumps +plums +plunder +plundered +plundering +plunders +plunge +plunged +plunger +plunger's +plungers +plunges +plunging +plurality +plurality's +plurals +pluses +plush +plush's +plusher +plushest +plussed +plussing +plutonium +plutonium's +ply +plying +plywood +plywood's +pneumatic +pneumonia +pneumonia's +poach +poached +poacher +poacher's +poachers +poaches +poaching +pocketbook +pocketbook's +pocketbooks +pocketed +pocketing +pockmark +pockmark's +pockmarked +pockmarking +pockmarks +pod +pod's +podded +podding +podium +podium's +podiums +pods +poetical +poignancy +poignancy's +poignant +poinsettia +poinsettia's +poinsettias +pointedly +pointlessly +poise +poise's +poised +poises +poising +poisonous +poked +poker +poker's +pokers +pokes +pokier +pokiest +poking +poky +polarity +polarity's +polars +poled +polemic +polemics +poles +policed +policemen +polices +policewoman +policewoman's +policewomen +policing +poling +polio +polio's +polios +politely +politer +politest +polka +polka's +polkaed +polkaing +polkas +polled +pollen +pollen's +pollinate +pollinated +pollinates +pollinating +pollination +pollination's +polling +pollster +pollster's +pollsters +pollutant +pollutant's +pollutants +pollute +polluted +pollutes +polluting +polo +polo's +polygamous +polygamy +polygamy's +polygon +polygon's +polygons +polynomials +polyp +polyp's +polyps +polytechnic +polytechnic's +pomegranate +pomegranate's +pomegranates +pomp +pomp's +poncho +poncho's +ponchos +pond +pond's +ponder +pondered +pondering +ponderous +ponders +ponds +ponies +pontoon +pontoon's +pontooned +pontooning +pontoons +pony +pony's +poodle +poodle's +poodles +pooled +pooling +pools +poop +poop's +pooped +pooping +poops +popcorn +popcorn's +poplar +poplar's +poplars +poppies +poppy +poppy's +populaces +popularly +populars +populous +porcelain +porcelain's +porch +porch's +porches +porcupine +porcupine's +porcupines +pore +pored +pores +poring +pornographic +porous +porpoise +porpoise's +porpoised +porpoises +porpoising +porridge +porridge's +portables +portal +portal's +portals +portend +portended +portending +portends +portent +portent's +portents +portered +portering +portfolio +portfolio's +portfolios +porthole +porthole's +portholes +portico +portico's +porticoes +portioned +portioning +portlier +portliest +portly +portrait +portrait's +portraits +portrayal +portrayal's +portrayals +posies +positional +positiver +positives +positivest +positivism +positivism's +possessions +possessive +possessives +possessor +possessor's +possessors +possibler +possibles +possiblest +possum +possum's +possums +postbox +postbox's +postcards +postcode +postcode's +posterior +posteriors +posterity +posterity's +postgraduate +postgraduate's +postgraduates +posthumous +posthumously +postman +postman's +postmark +postmark's +postmarked +postmarking +postmarks +postmasters +postmen +postponement +postponements +postscripts +postulated +postulates +postulating +posture +posture's +postured +postures +posturing +posy +posy's +potassium +potassium's +potency +potency's +potent +pothole +pothole's +potholed +potholes +potholing +potion +potion's +potions +pots +potted +potter +potter's +pottered +potteries +pottering +potters +pottery +pottery's +potting +pouch +pouch's +pouched +pouches +pouching +poultry +poultry's +pounce +pounced +pounces +pouncing +pounded +pounding +pout +pouted +pouting +pouts +powdered +powdering +powders +powdery +powerfully +powerhouse +powerhouse's +powerhouses +powerless +powwow +powwow's +powwowed +powwowing +powwows +practicalities +practicality +practicality's +practitioner +practitioner's +practitioners +pragmatics +pragmatism +pragmatism's +prairie +prairie's +prairies +praised +praises +praiseworthy +praising +pram +pram's +prance +pranced +prances +prancing +prank +prank's +pranks +prattle +prattled +prattles +prattling +prawn +prawn's +prawned +prawning +prawns +preacher +preacher's +preachers +preamble +preamble's +preambled +preambles +preambling +precarious +precariously +precautionary +precedents +precinct +precinct's +precincts +precipice +precipice's +precipices +precipitate +precipitated +precipitates +precipitating +precipitation +precipitation's +precipitations +precipitous +preciser +precises +precisest +preclude +precluded +precludes +precluding +precocious +preconceive +preconceived +preconceives +preconceiving +preconception +preconception's +preconceptions +precursor +precursor's +precursors +predator +predator's +predators +predatory +predefined +predestination +predestination's +predicament +predicament's +predicaments +predicate +predicated +predicates +predicating +predictably +predictor +predictor's +predisposition +predisposition's +predispositions +predominance +predominance's +predominant +predominate +predominated +predominates +predominating +preeminence +preeminence's +preeminent +preempt +preempted +preempting +preempts +preen +preened +preening +preens +prefab +prefab's +prefabbed +prefabbing +prefabs +prefaced +prefaces +prefacing +prefect +prefect's +preferential +pregnancies +prehistoric +prejudicial +preliminaries +prelude +prelude's +preludes +premeditation +premeditation's +premier +premier's +premiere +premiere's +premiered +premieres +premiering +premiers +premised +premising +premiums +premonition +premonition's +premonitions +prenatal +preoccupied +preoccupies +preoccupy +preoccupying +prepaid +preparations +preparatory +prepay +prepaying +prepays +preponderance +preponderance's +preponderances +preposition +preposition's +prepositional +prepositioned +prepositioning +prepositions +preposterous +prerequisites +prerogative +prerogative's +prerogatives +prescriptions +presences +presentable +presentations +presenter +preservation +preservation's +preservative +preservative's +preservatives +preside +presided +presidencies +presidency +presidency's +presidential +presidents +presides +presiding +pressings +pressured +pressuring +prestige +prestige's +prestigious +presto +presumption +presumption's +presumptions +presumptuous +presuppose +presupposed +presupposes +presupposing +pretender +pretender's +pretenders +pretentiously +pretentiousness +pretext +pretext's +pretexted +pretexting +pretexts +prettied +prettier +pretties +prettiest +prettying +pretzel +pretzel's +pretzels +prevailed +prevailing +prevails +prevalence +prevalence's +prevalents +preventable +preventive +preventives +previewed +previewers +previewing +previews +prey +prey's +preyed +preying +preys +priceless +prick +pricked +pricking +prickle +prickle's +prickled +prickles +pricklier +prickliest +prickling +prickly +pricks +prided +prides +priding +pried +prier +pries +priestess +priestess's +priestesses +priesthood +priesthood's +priesthoods +prim +primal +primaries +primate +primate's +primates +primed +primer +primer's +primers +primeval +priming +priming's +primly +primmer +primmest +primp +primped +primping +primps +primrose +primrose's +primrosed +primroses +primrosing +princes +princess +princess's +princesses +principalities +principality +principality's +principals +principled +principling +printable +printings +priors +prism +prism's +prisms +prisoned +prisoner's +prisoning +prisons +privater +privates +privatest +privation +privation's +privations +privier +privies +priviest +privy +probabilistic +probables +probation +probation's +probe +probed +probes +probing +problematic +procedural +procession +procession's +processional +processionals +processioned +processioning +processions +proclaimed +proclaiming +proclaims +proclamation +proclamation's +proclamations +procrastinate +procrastinated +procrastinates +procrastinating +procrastination +procrastination's +procure +procured +procurement +procurement's +procures +procuring +prod +prodded +prodding +prodigal +prodigals +prodigies +prodigious +prodigy +prodigy's +prods +productions +profane +profaned +profanes +profaning +profanities +profanity +profanity's +profess +professed +professes +professing +professionally +professions +professors +proffer +proffered +proffering +proffers +proficiency +proficiency's +proficient +proficiently +proficients +profiled +profiling +profited +profiteer +profiteer's +profiteered +profiteering +profiteers +profiting +profounder +profoundest +profoundly +profundities +profundity +profundity's +profuse +profusely +profusion +profusion's +profusions +progeny +progeny's +prognoses +prognosis +prognosis's +progression +progression's +progressions +progressive +progressively +progressives +prohibition +prohibition's +prohibitions +prohibitive +prohibitively +projectile +projectile's +projectiles +projections +projector +projector's +projectors +proletarian +proletarians +proletariat +proletariat's +proliferate +proliferated +proliferates +proliferating +prolific +prologue +prologue's +prologues +prom +prom's +promenade +promenade's +promenaded +promenades +promenading +prominence +prominence's +prominently +promiscuity +promiscuity's +promiscuous +promontories +promontory +promontory's +promotions +prompter +promptest +promptness +promptness's +proms +promulgate +promulgated +promulgates +promulgating +prong +prong's +prongs +pronouncement +pronouncement's +pronouncements +pronouns +pronunciations +proofed +proofing +proofread +proofreading +proofreads +prop +propagate +propagated +propagates +propagating +propagation +propagation's +propel +propelled +propeller +propeller's +propellers +propelling +propels +propensities +propensity +propensity's +properer +properest +prophecies +prophecy +prophecy's +prophesied +prophesies +prophesy +prophesying +prophetic +prophets +proponent +proponent's +proponents +proportionality +proportionality's +proportionally +proportionals +proportionate +proportioned +proportioning +propositional +propositioned +propositioning +propositions +propped +propping +proprietaries +proprietor +proprietor's +proprietors +propriety +propriety's +props +propulsion +propulsion's +pros +prosecutions +prosecutor +prosecutor's +prosecutors +proses +prospected +prospecting +prospectives +prospector +prospector's +prospectors +prospectus +prospectus's +prospectuses +prosper +prospered +prospering +prosperity +prosperity's +prosperous +prospers +prostitute's +prostituted +prostituting +prostitution +prostitution's +prostrate +prostrated +prostrates +prostrating +protagonist +protagonists +protections +protective +protectives +protector +protector's +protectors +proteins +protestant +protested +protesting +protests +proton +proton's +protons +prototypes +protract +protracted +protracting +protractor +protractor's +protractors +protracts +protrude +protruded +protrudes +protruding +protrusion +protrusion's +protrusions +protg +protg's +protgs +prouder +proudest +proudly +provable +provably +provenance +provenance's +proverb +proverb's +proverbial +proverbs +providence +providence's +provider +provider's +province +province's +provinces +provincial +provincials +provisionally +provisioned +provisioning +proviso +proviso's +provisos +provocation +provocation's +provocations +prow +prow's +prowess +prowess's +prowl +prowled +prowler +prowler's +prowlers +prowling +prowls +prows +proxies +proxy +proxy's +prude +prude's +prudence +prudence's +prudent +prudes +prudish +prune +prune's +pruned +prunes +pruning +pry +prying +prcis +prcis's +prcised +prcising +psalm +psalm's +psalms +pseudonym +pseudonym's +pseudonyms +psych +psyche +psyche's +psyched +psychedelic +psychedelics +psyches +psychiatric +psychiatrist +psychiatrist's +psychiatrists +psychiatry +psychiatry's +psychic +psychics +psyching +psychoanalysis +psychoanalysis's +psychoanalyst +psychoanalysts +psychologically +psychologies +psychologist's +psychopath +psychopath's +psychopaths +psychoses +psychosis +psychosis's +psychotherapies +psychotherapy +psychotherapy's +psychotic +psychs +puberty +puberty's +puck +puck's +pucked +pucker +puckered +puckering +puckers +pucking +pucks +puddings +puddle +puddle's +puddled +puddles +puddling +pudgier +pudgiest +pudgy +pueblo +pueblo's +pueblos +puff +puff's +puffed +puffer +puffier +puffiest +puffing +puffs +puffy +pugnacious +puke +puked +pukes +puking +pulley +pulley's +pulleys +pullover +pullover's +pullovers +pulmonary +pulped +pulping +pulpit +pulpit's +pulpits +pulps +pulsate +pulsated +pulsates +pulsating +pulsation +pulsation's +pulsations +pulse's +pulsed +pulsing +puma +puma's +pumas +pumice +pumice's +pumices +pummel +pummels +pumpernickel +pumpernickel's +pumpkin +pumpkin's +pumpkins +punchline +punctual +punctuality +punctuality's +punctuate +punctuated +punctuates +punctuating +puncture's +punctured +punctures +puncturing +pundit +pundit's +pundits +pungent +punier +puniest +punishable +punishments +punitive +punk +punk's +punker +punkest +punks +punned +punning +punted +punter +punter's +punters +punting +puny +pup +pup's +pupil's +pupped +puppet +puppet's +puppets +puppied +puppies +pupping +puppy +puppy's +puppying +pups +purchaser +purchasers +pured +puree +puree's +pureed +pureeing +purees +purer +purest +purgatory +purgatory's +purged +purges +purging +purification +purified +purifies +purify +purifying +puring +puritanical +purpler +purples +purplest +purport +purported +purporting +purports +purposed +purposeful +purposing +purr +purred +purring +purrs +purse +purse's +pursed +purses +pursing +pursuits +purveyor +purveyor's +pus +pus's +pusher +pusher's +pushers +pushier +pushiest +pushover +pushover's +pushovers +pushy +puss +pusses +pussier +pussies +pussiest +pussy +pussy's +putative +putrid +putt's +putter +putter's +puttered +puttering +putters +puttied +putties +putty +putty's +puttying +pyramid +pyramid's +pyramided +pyramiding +pyramids +pyre +pyre's +pyres +pythons +pres +qua +quack +quacked +quacking +quacks +quadrangle +quadrangle's +quadrangles +quadrant +quadrant's +quadrants +quadratic +quadratic's +quadrilateral +quadrilaterals +quadruped +quadruped's +quadrupeds +quadruple +quadrupled +quadruples +quadruplet +quadruplet's +quadruplets +quadrupling +quagmire +quagmire's +quagmired +quagmires +quagmiring +quail +quail's +quailed +quailing +quails +quaint +quainter +quaintest +quake +quaked +quakes +quaking +qualitative +qualm +qualm's +qualms +quandaries +quandary +quandary's +quantifier +quantifier's +quantify +quantitative +quarantine +quarantine's +quarantined +quarantines +quarantining +quark +quark's +quarrel +quarrel's +quarrels +quarrelsome +quarried +quarries +quarry +quarry's +quarrying +quart +quart's +quarterback +quarterback's +quarterbacked +quarterbacking +quarterbacks +quartered +quartering +quarterlies +quarterly +quartet +quartet's +quartets +quarts +quartz +quartz's +quash +quashed +quashes +quashing +quaver +quavered +quavering +quavers +quay +quay's +quays +queasier +queasiest +queasy +queened +queening +queenlier +queenliest +queenly +queer +queered +queerer +queerest +queering +queers +quell +quelled +quelling +quells +quench +quenched +quenches +quenching +queried +querying +quested +questing +questionnaires +quests +quibbled +quibbles +quibbling +quiche +quiche's +quicken +quickened +quickening +quickens +quicksand +quicksand's +quicksands +quieted +quieting +quiets +quill +quill's +quills +quilt +quilt's +quilted +quilting +quilts +quinine +quinine's +quintessence +quintessence's +quintessences +quintet +quintet's +quintets +quintuplet +quintuplet's +quintuplets +quip +quip's +quipped +quipping +quips +quirk +quirk's +quirked +quirking +quirks +quirky +quited +quites +quiting +quitter +quitters +quiver +quivered +quivering +quivers +quizzed +quizzes +quizzical +quizzing +quorum +quorum's +quorums +quotient +quotient's +quotients +rabbi +rabbi's +rabbis +rabbited +rabbiting +rabble +rabble's +rabbles +rabies +raccoon +raccoon's +raccoons +racer +racer's +racetrack +racetrack's +racetracks +racially +racier +raciest +racists +racked +racketed +racketeer +racketeer's +racketeered +racketeering +racketeers +racketing +rackets +racking +racy +radars +radial +radials +radiance +radiance's +radiant +radiate +radiated +radiates +radiating +radiations +radiator +radiator's +radiators +radicals +radii +radii's +radioactive +radioactivity +radioactivity's +radioed +radioing +radish +radish's +radishes +radium +radium's +raffle +raffle's +raffled +raffles +raffling +raft +raft's +rafted +rafter +rafter's +rafters +rafting +rafts +ragamuffin +ragamuffin's +ragamuffins +raged +rages +ragged +raggeder +raggedest +ragging +raging +rags +ragtime +ragtime's +raid's +raided +raider +raider's +raiders +raiding +railed +railing +railing's +railroaded +railroading +railroads +railways +rainbows +raincoat +raincoat's +raincoats +raindrop +raindrop's +raindrops +rainfall +rainfall's +rainfalls +rainforest's +rainier +rainiest +rainstorm +rainstorm's +rainstorms +rainwater +rainwater's +rainy +raisin +raisin's +raisins +rake +rake's +raked +rakes +raking +rallied +rallies +rally +rallying +ramble +rambled +rambler +rambler's +ramblers +rambles +rambling +ramification +ramification's +ramifications +rammed +ramming +ramp +ramp's +rampage +rampaged +rampages +rampaging +ramps +ramrod +ramrod's +ramrodded +ramrodding +ramrods +rams +ramshackle +ranch +ranch's +ranched +rancher +rancher's +ranchers +ranches +ranching +rancid +rancorous +randomness +randomness's +ranger +ranger's +rangers +ranked +ranker +rankest +ranking +rankle +rankled +rankles +rankling +ransack +ransacked +ransacking +ransacks +ransom +ransom's +ransomed +ransoming +ransoms +rap +raped +rapes +rapider +rapidest +rapidity +rapidity's +rapids +raping +rapist +rapist's +rapists +rapped +rapping +rapport +rapport's +rapports +raps +rapt +rapture +rapture's +raptures +rapturous +rared +rares +raring +rarities +rarity +rarity's +rascal +rascal's +rascals +rasher +rashes +rashest +rashly +rasp +rasp's +raspberries +raspberry +raspberry's +rasped +rasping +rasps +raster +raster's +ratification +ratified +ratifies +ratify +ratifying +ratings +ration +ration's +rationales +rationality +rationality's +rationals +rationed +rationing +rations +ratted +ratting +rattler +rattlers +rattlesnake +rattlesnake's +rattlesnakes +ratty +raucous +raucously +ravage +ravaged +ravages +ravaging +ravel +ravels +raven +raven's +ravened +ravening +ravenous +ravenously +ravens +ravine +ravine's +ravined +ravines +ravings +ravining +ravish +ravished +ravishes +ravishing +rawer +rawest +rayon +rayon's +rays +raze +razed +razes +razing +razors +reactionaries +reactive +reactors +readability +readability's +readied +readier +readies +readiest +readiness +readiness's +readjust +readjusted +readjusting +readjusts +readying +realer +realest +realism +realism's +realist +realist's +realistically +realists +realities +reallied +reallies +reallocate +reallocated +reallocates +reallocating +reallying +realm's +realty +realty's +ream +ream's +reamed +reaming +reams +reap +reaped +reaper +reaper's +reapers +reaping +reappear +reappeared +reappearing +reappears +reaps +reared +rearing +rearrangement +rearrangements +rears +reassurance +reassurance's +reassurances +rebate +rebate's +rebated +rebates +rebating +rebel +rebelled +rebelling +rebellion +rebellion's +rebellions +rebellious +rebels +rebind +rebinding +rebinds +rebirth +rebirth's +rebirths +reborn +rebound +rebounded +rebounding +rebounds +rebuff +rebuffed +rebuffing +rebuffs +rebuke +rebuked +rebukes +rebuking +rebut +rebuts +rebuttal +rebuttal's +rebuttals +rebutted +rebutting +recalcitrant +recant +recanted +recanting +recants +recap +recapped +recapping +recaps +recapture +recaptured +recaptures +recapturing +recede +receded +recedes +receding +receipted +receipting +receipts +receivers +recenter +recentest +receptacle +receptacle's +receptacles +receptionist +receptionist's +receptionists +receptions +receptive +recess +recess's +recessed +recesses +recessing +recession +recession's +recessions +recharge +rechargeable +recharged +recharges +recharging +reciprocal +reciprocals +reciprocate +reciprocated +reciprocates +reciprocating +recital +recital's +recitals +recitation +recitation's +recitations +recite +recited +recites +reciting +recklessly +recklessness +reckoning's +reclaimed +reclaiming +reclaims +reclamation +reclamation's +recline +reclined +reclines +reclining +recluse +recluse's +recluses +recoil +recoiled +recoiling +recoils +recollect +recollected +recollecting +recollections +recollects +recompense +recompensed +recompenses +recompensing +recompile +recompiled +recompiling +reconciled +reconciles +reconciliation +reconciliations +reconciling +recondition +reconditioned +reconditioning +reconditions +reconfigure +reconfigured +reconnaissance +reconnaissance's +reconnaissances +reconnect +reconnected +reconnecting +reconnects +reconsidered +reconsidering +reconsiders +reconstruct +reconstructed +reconstructing +reconstruction +reconstruction's +reconstructions +reconstructs +recorders +recount +recounted +recounting +recounts +recoup +recouped +recouping +recoups +recourse +recourse's +recoverable +recoveries +recreate +recreated +recreates +recreating +recreation +recreation's +recreations +rectal +rectangles +rector +rector's +rectors +rectum +rectum's +rectums +recuperate +recuperated +recuperates +recuperating +recuperation +recuperation's +recur +recurred +recurrence +recurrence's +recurrences +recurrent +recurring +recurs +recursively +redden +reddened +reddening +reddens +redder +reddest +redeem +redeemable +redeemed +redeeming +redeems +redefinition +redefinition's +redemption +redemption's +redesign +redesigned +redesigning +redesigns +redhead +redhead's +redheads +redid +redirected +redirecting +redirection +redirects +rediscover +rediscovered +rediscovering +rediscovers +redistribute +redistributed +redistributes +redistributing +redistribution +redistribution's +redo +redoes +redoing +redone +redraft +redraft's +redraw +redress +redressed +redresses +redressing +reds +redundancies +reed +reed's +reeds +reef +reef's +reefed +reefing +reefs +reek +reeked +reeking +reeks +reel +reel's +reelect +reelected +reelecting +reelects +reeled +reeling +reels +referee +referee's +refereed +refereeing +referees +referendums +refill +refilled +refilling +refills +refinement +refinement's +refinements +refineries +refinery +refinery's +reflections +reflective +reflector +reflector's +reflectors +reflexes +reflexive +reflexives +reformation +reformation's +reformations +reformatted +reformatting +reformer +reformer's +reformers +refraction +refraction's +refrained +refraining +refrains +refreshment +refreshment's +refreshments +refrigerate +refrigerated +refrigerates +refrigerating +refrigeration +refrigeration's +refrigerator +refrigerator's +refrigerators +refuel +refuels +refuge +refuge's +refugee +refugee's +refugees +refuges +refunded +refunding +refunds +refurbish +refurbished +refurbishes +refurbishing +refurbishment +refusals +refutation +refutation's +refuted +refutes +refuting +regained +regaining +regains +regal +regale +regaled +regales +regalia +regalia's +regaling +regals +regatta +regatta's +regattas +regenerate +regenerated +regenerates +regenerating +regeneration +regeneration's +regent +regent's +regents +regimen +regimen's +regimens +regiment +regiment's +regimental +regimentals +regimented +regimenting +regiments +regimes +registrar +registrar's +registrars +registrations +registries +registry +registry's +regress +regressed +regresses +regressing +regression +regression's +regressions +regretful +regrettable +regularity +regularity's +regulars +regulate +regulated +regulates +regulating +regurgitate +regurgitated +regurgitates +regurgitating +rehabilitate +rehabilitated +rehabilitates +rehabilitating +rehabilitation +rehabilitation's +rehash +rehashed +rehashes +rehashing +rehearsal +rehearsal's +rehearsals +rehearse +rehearsed +rehearses +rehearsing +reigned +reigning +reigns +reimburse +reimbursed +reimbursement +reimbursements +reimburses +reimbursing +rein +rein's +reincarnate +reincarnated +reincarnates +reincarnating +reincarnation +reincarnation's +reincarnations +reindeer +reindeer's +reined +reinforce +reinforced +reinforcement +reinforcement's +reinforcements +reinforces +reinforcing +reining +reins +reinstatement +reinstatement's +reiterated +reiterates +reiterating +reiteration +reiterations +rejections +rejoice +rejoiced +rejoices +rejoicing +rejoin +rejoinder +rejoinder's +rejoinders +rejoined +rejoining +rejoins +rejuvenate +rejuvenated +rejuvenates +rejuvenating +rejuvenation +relaid +relapse +relapsed +relapses +relapsing +relational +relativistic +relaxation +relaxation's +relaxations +relayed +relaying +relays +releasable +relegate +relegated +relegates +relegating +relent +relented +relenting +relentless +relentlessly +relents +reliables +reliance +reliance's +reliant +relic +relic's +relics +reliefs +religiously +relinquish +relinquished +relinquishes +relinquishing +relish +relished +relishes +relishing +relive +relived +relives +reliving +reload +reload's +reloaded +reloading +reloads +relocatable +relocate +relocated +relocates +relocating +remade +remainders +remake +remakes +remaking +remedial +remedied +remedies +remedying +remembrance +remembrance's +remembrances +reminders +reminisce +reminisced +reminiscence +reminiscence's +reminiscences +reminisces +reminiscing +remiss +remission +remission's +remissions +remit +remits +remittance +remittance's +remittances +remitted +remitting +remnant +remnant's +remnants +remodel +remodels +remorse +remorse's +remorseful +remorseless +remoter +remotes +remotest +removable +removables +removals +remunerate +remunerated +remunerates +remunerating +remuneration +remuneration's +remunerations +renaissance +rendezvous +rendezvous's +rendezvoused +rendezvouses +rendezvousing +renditioned +renditioning +renditions +renegade +renegade's +renegaded +renegades +renegading +renege +reneged +reneges +reneging +renewable +renewal +renewal's +renewals +renounce +renounced +renounces +renouncing +renovate +renovated +renovates +renovating +renovation +renovation's +renovations +renown +renown's +renowned +renowning +renowns +rental +rental's +rentals +rented +renting +rents +renunciation +renunciation's +renunciations +reopen +reopened +reopening +reopens +repaid +reparation +reparation's +repatriate +repatriated +repatriates +repatriating +repay +repaying +repayment +repayment's +repayments +repays +repeal +repealed +repealing +repeals +repel +repelled +repellent +repellents +repelling +repels +repentance +repentance's +repentant +repentants +repented +repenting +repents +repercussion +repercussion's +repercussions +repertoires +repetitions +repetitious +replay +replay's +replenish +replenished +replenishes +replenishing +replete +repleted +repletes +repleting +replica +replica's +replicas +replicate +replicated +replicates +replicating +replication +replication's +reportedly +reporters +repose +repose's +reposed +reposes +reposing +repositories +repository +repository's +reprehensible +repress +repressed +represses +repressing +repression +repression's +repressions +repressive +reprieve +reprieved +reprieves +reprieving +reprimand +reprimand's +reprimanded +reprimanding +reprimands +reprint +reprinted +reprinting +reprints +reprisal +reprisal's +reprisals +reproach +reproached +reproaches +reproaching +reproductions +reproductive +reprogrammed +reprogramming +reprove +reproved +reproves +reproving +reptile +reptile's +reptiles +republic +republic's +republican +republicans +republics +repudiate +repudiated +repudiates +repudiating +repudiation +repudiation's +repudiations +repugnance +repugnance's +repugnant +repulse +repulsed +repulses +repulsing +repulsion +repulsion's +reputable +reputations +repute +reputed +reputedly +reputes +reputing +requiem +requisites +requisition +requisition's +requisitioned +requisitioning +requisitions +reroute +rerouted +reroutes +rerouting +resale +resale's +reschedule +rescheduled +reschedules +rescheduling +rescind +rescinded +rescinding +rescinds +rescued +rescuer +rescuers +rescues +rescuing +researched +researches +researching +resemblances +resented +resentful +resenting +resentment +resentment's +resentments +resents +reservation's +reservoir +reservoir's +reservoirs +reshuffle +reshuffle's +resided +residences +residential +residing +residual +residuals +residue +residue's +residues +resignations +resilience +resilience's +resilient +resin +resin's +resins +resistances +resistant +resisted +resisting +resistor +resistors +resists +resolute +resolutely +resoluter +resolutes +resolutest +resolutions +resolver +resolver's +resonance +resonance's +resonances +resonant +resound +resounded +resounding +resounds +resourceful +resourcefulness +resourcefulness's +respectability +respectability's +respectables +respectably +respectful +respectfully +respiration +respiration's +respirator +respirator's +respirators +respiratory +respiratory's +respite +respite's +respites +resplendent +responsibly +responsive +restful +restfuller +restfullest +restitution +restitution's +restive +restless +restlessly +restlessness +restlessness's +restoration +restoration's +restorations +restraint +restraint's +restraints +restrictives +restructure +restructured +restructures +restructuring +resubmit +resubmits +resubmitted +resubmitting +resultant +resultants +resumption +resumption's +resumptions +resurface +resurfaced +resurfaces +resurfacing +resurgence +resurgence's +resurgences +resurrect +resurrected +resurrecting +resurrections +resurrects +resuscitate +resuscitated +resuscitates +resuscitating +resuscitation +resuscitation's +retailed +retailer +retailer's +retailers +retailing +retails +retainer +retainer's +retainers +retaliate +retaliated +retaliates +retaliating +retaliation +retaliation's +retaliations +retard +retarded +retarding +retards +retch +retched +retches +retching +retention +retention's +rethink +reticence +reticent +retina +retina's +retinas +retirements +retort +retorted +retorting +retorts +retrace +retraced +retraces +retracing +retracted +retracting +retraction +retraction's +retractions +retracts +retreat +retreated +retreating +retreats +retribution +retribution's +retributions +retries +retrievals +retriever +retriever's +retrievers +retroactive +retrograde +retrospect +retrospect's +retrospected +retrospecting +retrospective +retrospectively +retrospectives +retrospects +retry +returnable +returnables +retype +reunion +reunion's +reunions +reunite +reunited +reunites +reuniting +reused +reuses +reusing +rev +rev's +revamp +revamped +revamping +revamps +revel +revelations +revelries +revelry +revelry's +revels +revenged +revengeful +revenges +revenging +revenues +reverberate +reverberated +reverberates +reverberating +reverberation +reverberation's +reverberations +revere +revered +reverence +reverence's +reverenced +reverences +reverencing +reverent +reverently +reveres +reverie +reverie's +reveries +revering +reversal +reversal's +reversals +reversible +reversion +reversion's +reverted +reverting +reverts +reviewer +reviewers +revile +reviled +reviles +reviling +revisions +revisit +revisited +revisiting +revisits +revival +revival's +revivals +revive +revived +revives +reviving +revoke +revoked +revokes +revoking +revolt's +revolutionaries +revolutions +revolve +revolved +revolver +revolver's +revolvers +revolves +revolving +revs +revue +revue's +revues +revulsion +revulsion's +revved +revving +rewarded +rewarding +rewind +rework +rhapsodies +rhapsody +rhapsody's +rhetoric +rhetoric's +rheumatism +rheumatism's +rhino +rhino's +rhinoceros +rhinoceros's +rhinoceroses +rhinos +rhododendron +rhododendron's +rhododendrons +rhubarb +rhubarb's +rhubarbs +rhymed +rhymes +rhyming +rhythmic +rhythms +rib +rib's +ribbed +ribbing +ribbons +ribs +riced +rices +riches +richly +richness +richness's +ricing +ricketier +ricketiest +rickety +rickshaw +rickshaw's +rickshaws +ricochet +ricocheted +ricocheting +ricochets +riddance +riddance's +riddle +riddle's +riddled +riddles +riddling +rider +rider's +riders +ridge +ridge's +ridged +ridges +ridging +ridicule +ridicule's +ridiculed +ridicules +ridiculing +rife +rifer +rifest +rifle +rifle's +rifled +rifles +rifling +rift +rift's +rifted +rifting +rifts +rig +rigged +rigging +rigging's +righted +righteous +righteously +righteousness +righteousness's +righter +rightest +rightful +rightfully +righting +rightmost +rightness +rightness's +rigidity +rigidly +rigorously +rigs +rile +riled +riles +riling +rim +rim's +rimmed +rimming +rims +rind +rind's +rinded +rinding +rinds +ringleader +ringleader's +ringleaders +ringlet +ringlet's +ringlets +ringworm +ringworm's +rink +rink's +rinked +rinking +rinks +rinse +rinsed +rinses +rinsing +rioted +rioter +rioter's +rioters +rioting +riotous +riots +ripe +riped +ripen +ripened +ripeness +ripeness's +ripening +ripens +riper +ripes +ripest +riping +riposte +riposte's +ripper +ripple +ripple's +rippled +ripples +rippling +riser +riser's +risers +riskier +riskiest +risqu +rite +rite's +rites +rivalries +rivalry +rivalry's +rive +rives +rivet +rivet's +riveted +riveting +rivets +roach +roach's +roaches +roadblock +roadblock's +roadblocked +roadblocking +roadblocks +roadside +roadsides +roam +roamed +roaming +roams +roar +roared +roaring +roars +roast +roasted +roasting +roasts +rob +robbed +robber +robber's +robberies +robbers +robbery +robbery's +robbing +robe +robe's +robed +robes +robin +robin's +robing +robins +robs +robuster +robustest +robustness +robustness's +rocked +rocker +rocker's +rockers +rocketed +rocketing +rockets +rockier +rockiest +rocking +rocky +roded +rodent +rodent's +rodents +rodeo +rodeo's +rodeos +rodes +roding +rods +roe +roe's +roes +rogue +rogue's +rogues +roguish +roller +roller's +rollers +romanced +romances +romancing +romantically +romantics +romp +romped +romping +romps +roofed +roofing +roofing's +roofs +rook +rook's +rooked +rookie +rookie's +rookier +rookies +rookiest +rooking +rooks +roomed +roomier +roomiest +rooming +roommate +roommate's +roommates +roomy +roost +roost's +roosted +rooster +rooster's +roosters +roosting +roosts +rooted +rooter +rooting +roped +ropes +roping +rosaries +rosary +rosary's +rosemary +rosemary's +roses +rosier +rosiest +roster +roster's +rostered +rostering +rosters +rostrum +rostrum's +rostrums +rosy +rotaries +rotary +rotations +rote +rote's +roted +rotes +roting +rotisserie +rotisserie's +rotisseries +rotor +rotor's +rotors +rots +rotted +rottener +rottenest +rottens +rotting +rotund +rotunda +rotunda's +rotundas +rotunded +rotunding +rotunds +rouge +rouge's +rouged +rouges +roughage +roughage's +roughed +roughen +roughened +roughening +roughens +rougher +roughest +roughhouse +roughhouse's +roughhoused +roughhouses +roughhousing +roughing +roughness +roughness's +roughs +rouging +roulette +roulette's +roundabouts +rounder +roundest +roundness +roundness's +rouse +roused +rouses +rousing +rout's +router +router's +rowboat +rowboat's +rowboats +rowdier +rowdies +rowdiest +rowdiness +rowdiness's +rowdy +rowed +rowing +royally +royals +royalty +royalty's +rubbed +rubbers +rubbing +rubbing's +rubbished +rubbishes +rubbishing +rubble +rubble's +rubbled +rubbles +rubbling +rubied +rubier +rubies +rubiest +rubric +rubric's +rubs +ruby +ruby's +rubying +rucksack +rucksack's +ruckus +ruckus's +ruckuses +rudder +rudder's +rudders +ruddied +ruddier +ruddies +ruddiest +ruddy +ruddying +rudely +rudeness +rudeness's +ruder +rudest +rudimentary +rue +rued +rueful +rues +ruff +ruff's +ruffed +ruffian +ruffian's +ruffianed +ruffianing +ruffians +ruffing +ruffle +ruffled +ruffles +ruffling +ruffs +rug +rug's +rugby +rugby's +rugged +ruggeder +ruggedest +rugging +rugs +ruing +ruinous +rulered +rulering +rulings +rum +rum's +rumble +rumbled +rumbles +rumbling +ruminate +ruminated +ruminates +ruminating +rummage +rummaged +rummages +rummaging +rummer +rummest +rummy +rummy's +rump +rump's +rumped +rumping +rumple +rumpled +rumples +rumpling +rumps +rums +runaway +runaways +rundown +rundown's +rundowns +rune +runes +rung's +rungs +runner +runner's +runners +runnier +runniest +runny +runt +runt's +runts +runway +runway's +runways +rupture +rupture's +ruptured +ruptures +rupturing +ruse +ruse's +ruses +rust +rust's +rusted +rustic +rustics +rustier +rustiest +rusting +rustle +rustled +rustler +rustler's +rustlers +rustles +rustling +rusts +rut +rut's +ruthless +ruthlessly +ruthlessness +ruthlessness's +ruts +rutted +rutting +rye +rye's +sabbatical +sabotaged +sabotages +sabotaging +saboteur +saboteur's +saboteurs +sac +sac's +sacrament +sacrament's +sacramented +sacramenting +sacraments +sacrificial +sacrilege +sacrilege's +sacrileges +sacrilegious +sacs +sadder +saddest +saddle +saddle's +saddled +saddles +saddling +sades +sadism +sadism's +sadist +sadist's +sadistic +sadists +sadness +sadness's +safari +safari's +safaried +safariing +safaris +safeguarded +safeguarding +safekeeping +safekeeping's +safekeepings +safes +safetied +safeties +safetying +saffron +saffron's +saffrons +sag +sagas +sage +sage's +sagebrush +sagebrush's +sager +sages +sagest +sagged +sagger +sagging +sags +sailboat +sailboat's +sailboats +sailor +sailor's +sailors +saintlier +saintliest +saintly +saints +salad +salad's +salads +salami +salami's +salamis +salaried +salarying +salesmen +salespeople +salesperson +salesperson's +saleswoman +saleswomen +salient +salients +saliva +saliva's +salivate +salivated +salivates +salivating +sallow +sallower +sallowest +sally +sally's +salmon +salmon's +salmons +salon +salon's +salons +saloon +saloon's +saloons +salted +salter +saltest +saltier +salties +saltiest +salting +salts +salty +salutation +salutation's +salutations +salute +saluted +salutes +saluting +salvage +salvage's +salvaged +salvages +salvaging +salve +salve's +salved +salves +salving +sameness +sameness's +sames +sampler +sampler's +sanatorium +sanatorium's +sanatoriums +sanctified +sanctifies +sanctify +sanctifying +sanctimonious +sanction +sanction's +sanctioned +sanctioning +sanctions +sanctity +sanctity's +sanctuaries +sanctuary +sanctuary's +sandal +sandal's +sandals +sandbag +sandbag's +sandbagged +sandbagging +sandbags +sanded +sandier +sandiest +sanding +sandman +sandman's +sandmen +sandpaper +sandpaper's +sandpapered +sandpapering +sandpapers +sands +sandstone +sandstone's +sandstorm +sandstorm's +sandstorms +sandwiched +sandwiching +sandy +saned +saner +sanes +sanest +sangs +saning +sanitaries +sanitarium +sanitarium's +sanitariums +sanitary +sanitation +sanitation's +sanserif +sap +sap's +sapling +sapling's +sapped +sapphire +sapphire's +sapphires +sapping +saps +sarcasms +sarcastically +sardine +sardine's +sardined +sardines +sardining +sari +sari's +saris +sash +sash's +sashes +sassier +sassiest +sassy +satanic +satchel +satchel's +satchels +satellited +satelliting +satin +satin's +satined +satining +satins +satires +satirical +satirist +satirist's +satirists +satisfactions +saturate +saturated +saturates +saturating +saturation +saturation's +sauced +saucepan +saucepan's +saucepans +saucer +saucer's +saucers +sauces +saucier +sauciest +saucing +saucy +sauerkraut +sauerkraut's +sauna +sauna's +saunaed +saunaing +saunas +saunter +sauntered +sauntering +saunters +sausage +sausage's +sausages +saut +sauted +sauting +sauts +savage +savaged +savagely +savager +savageries +savagery +savagery's +savages +savagest +savaging +saver +saver's +savvied +savvier +savvies +savviest +savvy +savvying +sawdust +sawdust's +sawdusted +sawdusting +sawdusts +sawed +sawing +saws +saxophone +saxophone's +saxophones +sayings +scab +scab's +scabbed +scabbing +scabs +scaffold +scaffold's +scaffolding +scaffolding's +scaffolds +scalar +scalar's +scalars +scald +scalded +scalding +scalds +scalier +scaliest +scallop +scallop's +scalloped +scalloping +scallops +scalp +scalp's +scalped +scalpel +scalpel's +scalpels +scalping +scalps +scaly +scamper +scampered +scampering +scampers +scandalous +scandals +scanners +scant +scanted +scanter +scantest +scantier +scanties +scantiest +scanting +scants +scanty +scapegoat +scapegoat's +scapegoated +scapegoating +scapegoats +scar +scar's +scarcer +scarcest +scarcity +scarcity's +scarecrow +scarecrow's +scarecrows +scarfed +scarfing +scarfs +scarier +scariest +scarleted +scarleting +scarlets +scarred +scarring +scars +scarves +scarves's +scary +scathing +scatterbrain +scatterbrain's +scatterbrained +scatterbrains +scattering's +scavenger +scavenger's +scavengers +scened +scenic +scening +scent +scent's +scented +scenting +scents +schemed +schemer +schemer's +schemers +scheming +schizophrenia +schizophrenia's +schizophrenic +scholar's +scholarly +scholarship +scholarship's +scholarships +scholastic +schoolboy +schoolboy's +schoolboys +schoolchild +schoolchildren +schooled +schooling +schooling's +schoolteacher +schoolteacher's +schoolteachers +schooner +schooner's +schooners +scissor +scissors +scoff +scoffed +scoffing +scoffs +scold +scolded +scolding +scolds +scoop +scoop's +scooped +scooping +scoops +scoot +scooted +scooter +scooter's +scooters +scooting +scoots +scoped +scopes +scoping +scorch +scorched +scorches +scorching +scorer +scorn +scorn's +scorned +scornful +scorning +scorns +scorpion +scorpion's +scorpions +scotchs +scoundrel +scoundrel's +scoundrels +scour +scoured +scourge +scourge's +scourged +scourges +scourging +scouring +scours +scout +scout's +scouted +scouting +scouts +scowl +scowled +scowling +scowls +scrabble +scram +scramble +scrambled +scrambles +scrambling +scrammed +scramming +scrams +scrapbook +scrapbook's +scrapbooks +scrape +scraped +scrapes +scraping +scratches's +scratchier +scratchiest +scratchy +scrawl +scrawled +scrawling +scrawls +scrawnier +scrawniest +scrawny +screech +screech's +screeched +screeches +screeching +screened +screening +screening's +screwdriver +screwdriver's +screwdrivers +screwier +screwiest +screwy +scribble +scribbled +scribbles +scribbling +scribe +scribe's +scribes +scripted +scripting +scripture +scripture's +scriptures +scriptwriter +scriptwriters +scrounge +scrounged +scrounges +scrounging +scrub +scrubbed +scrubbing +scrubs +scruff +scruff's +scruffier +scruffiest +scruffs +scruffy +scruple +scruple's +scrupled +scruples +scrupling +scrupulous +scrupulously +scrutiny +scrutiny's +scuff +scuffed +scuffing +scuffle +scuffled +scuffles +scuffling +scuffs +sculptor +sculptor's +sculptors +sculpture +sculpture's +sculptured +sculptures +sculpturing +scummed +scumming +scums +scurried +scurries +scurrilous +scurry +scurrying +scuttle +scuttle's +scuttled +scuttles +scuttling +scythe +scythe's +scythed +scythes +scything +seafaring +seafood +seafood's +seam +seam's +seaman +seaman's +seamed +seamen +seaming +seams +seamstress +seamstress's +seamstresses +seaport +seaport's +seaports +sear +searchlight +searchlight's +searchlights +seared +searing +sears +seas +seashell +seashell's +seashells +seashore +seashore's +seashores +seasick +seasickness +seasickness's +seaside +seaside's +seasides +seasonable +seasonal +seasoned +seasoning +seasoning's +seasonings +seasons +seated +seating +seating's +seaweed +seaweed's +secede +seceded +secedes +seceding +secession +secession's +seclude +secluded +secludes +secluding +seclusion +seclusion's +secondaries +secondarily +secrecy +secrecy's +secretarial +secrete +secreted +secreter +secretes +secretest +secreting +secretion +secretion's +secretions +secretive +sectioned +sectioning +sectors +secured +securely +securer +secures +securest +securing +securities +sedan +sedan's +sedans +sedate +sedated +sedater +sedates +sedatest +sedating +sedative +sedatives +sedentary +sediment +sediment's +sedimentary +sediments +seduce +seduced +seduces +seducing +seduction +seduction's +seductions +seductive +seeded +seedier +seediest +seeding +seedling +seedling's +seeds +seedy +seep +seepage +seepage's +seeped +seeping +seeps +seer +seesaw +seesaw's +seesawed +seesawing +seesaws +seethe +seethed +seethes +seething +segmentation +segmentation's +segmented +segmenting +segregate +segregated +segregates +segregating +segregation +segregation's +seize +seized +seizes +seizing +seizure +seizure's +seizures +selections +selector +selector's +selectors +selfishness +seller +seller's +sellers +selves +selves's +semantically +semblance +semblance's +semblances +semen +semen's +semester +semester's +semesters +semicircle +semicircle's +semicircles +semicolon +semicolon's +semicolons +semiconductor +semiconductor's +semiconductors +semifinal +semifinal's +semifinals +seminaries +seminary +seminary's +senate +senate's +senates +senator +senator's +senators +senile +senility +senility's +seniority +seniority's +seniors +sensational +sensationalism +sensationalism's +sensations +sensed +senseless +sensibilities +sensibility +sensibility's +sensibler +sensibles +sensiblest +sensing +sensitives +sensitivities +sensor +sensor's +sensors +sensory +sensual +sensuality +sensuality's +sensuous +sentience +sentience's +sentimentality +sentimentality's +sentries +sentry +sentry's +separates's +separations +sequels +sequenced +sequencer +sequencer's +sequencing +sequentially +sequin +sequin's +sequining +sequins +serenade +serenade's +serenaded +serenades +serenading +serene +serened +serener +serenes +serenest +serening +serenity +serenity's +sergeant +sergeant's +sergeants +serials +sermoned +sermoning +sermons +serpent +serpent's +serpented +serpenting +serpents +serum +serum's +serums +servanted +servanting +serviceable +serviced +serviceman +serviceman's +servicemen +servicing +serviette +serviette's +serviettes +servile +serviles +servitude +servitude's +setback +setbacks +settable +setter +setter's +setters +settlement +settlement's +settlements +settler +settler's +settlers +sevens +seventeen +seventeen's +seventeens +seventeenth +seventeenths +sevenths +seventies +seventy +seventy's +sever +severance +severance's +severances +severed +severer +severest +severing +severs +sew +sewage +sewage's +sewed +sewer +sewer's +sewers +sewing +sewing's +sewn +sews +sexed +sexing +sexism +sexism's +shabbier +shabbiest +shabbily +shabby +shack +shack's +shackle +shackle's +shackled +shackles +shackling +shacks +shaded +shadier +shadiest +shading +shading's +shadowed +shadowier +shadowiest +shadowing +shadows +shadowy +shady +shaft +shaft's +shafted +shafting +shafts +shaggier +shaggiest +shaggy +shakier +shakiest +shallower +shallowest +shallows +sham +sham's +shamble +shambles +shambles's +shamed +shameful +shamefully +shameless +shames +shaming +shammed +shamming +shampoo +shampoo's +shampooed +shampooing +shampoos +shamrock +shamrock's +shamrocks +shams +shanties +shanty +shanty's +shapelier +shapeliest +shapely +shark +shark's +sharked +sharking +sharks +sharped +sharpen +sharpened +sharpener +sharpeners +sharpening +sharpens +sharper +sharper's +sharpest +sharping +sharpness +sharpness's +sharps +shatter +shattered +shattering +shatters +shave +shaved +shaver +shaver's +shavers +shaves +shaving +shaving's +shawl +shawl's +shawled +shawling +shawls +sheaf +sheaf's +shear +sheared +shearing +shears +sheath +sheath's +sheathe +sheathed +sheathes +sheathing +sheaths +sheave +sheaves +sheaves's +sheen +sheen's +sheepish +sheepishly +sheered +sheerer +sheerest +sheering +sheers +sheik +sheik's +sheiks +shelled +sheller +shellfish +shellfish's +shellfishes +shelling +sheltered +sheltering +shelters +shelved +shelving +shepherd +shepherd's +shepherded +shepherding +shepherds +sherbet +sherbet's +sherbets +sheriff +sheriff's +sheriffs +sherries +sherry +sherry's +shes +shied +shield +shield's +shielded +shielding +shields +shies +shiftier +shiftiest +shiftless +shifty +shimmer +shimmered +shimmering +shimmers +shin +shin's +shingle +shingle's +shingled +shingles +shingling +shinier +shiniest +shinned +shinning +shins +shipment +shipment's +shipments +shipshape +shipwreck +shipwreck's +shipwrecked +shipwrecking +shipwrecks +shire +shire's +shirk +shirked +shirking +shirks +shirted +shirting +shirts +shiver +shivered +shivering +shivers +shoal +shoal's +shoaled +shoaling +shoals +shod +shoddier +shoddiest +shoddy +shoeing +shoelace +shoelace's +shoelaces +shoestring +shoestring's +shoestrings +shoo +shooed +shooing +shook's +shoos +shopkeeper +shopkeeper's +shopkeepers +shoplifter +shoplifter's +shoplifters +shopper +shopper's +shoppers +shore +shore's +shored +shores +shoring +shortages +shortcoming +shortcoming's +shortcomings +shorted +shortening's +shortenings +shortfall +shortfall's +shorting +shortlist +shortness +shortness's +shotgun +shotgun's +shotgunned +shotgunning +shotguns +shouldered +shouldering +shouldest +shoved +shovel +shovel's +shovels +shoves +shoving +showcase +showcase's +showcased +showcases +showcasing +showdown +showdown's +showdowns +showered +showering +showier +showiest +showings +showman +showman's +showmen +showy +shrank +shrapnel +shrapnel's +shred +shred's +shredded +shredding +shreds +shrew +shrew's +shrewd +shrewder +shrewdest +shrewdness +shrewdness's +shrewed +shrewing +shrews +shriek +shriek's +shrieked +shrieking +shrieks +shrill +shrilled +shriller +shrillest +shrilling +shrills +shrimp +shrimp's +shrimped +shrimping +shrimps +shrine +shrine's +shrines +shrink +shrinkage +shrinkage's +shrinking +shrinks +shrivel +shrivels +shroud +shroud's +shrouded +shrouding +shrouds +shrub +shrub's +shrubbed +shrubberies +shrubbery +shrubbery's +shrubbing +shrubs +shrug +shrugged +shrugging +shrugs +shrunk +shrunken +shuck +shuck's +shucked +shucking +shucks +shudder +shuddered +shuddering +shudders +shuffle +shuffled +shuffles +shuffling +shun +shunned +shunning +shuns +shunt +shunted +shunting +shunts +shutter +shutter's +shuttered +shuttering +shutters +shuttle +shuttle's +shuttled +shuttles +shuttling +shyer +shyest +shying +shyness +shyness's +sibling +sibling's +siblings +sicked +sickenings +sicker +sickest +sicking +sickle +sickle's +sickled +sickles +sicklier +sickliest +sickling +sickly +sickness +sickness's +sicknesses +sicks +sics +sideline +sideline's +sidelined +sidelines +sidelining +sidelong +sideshow +sideshow's +sideshows +sidestep +sidestepped +sidestepping +sidesteps +sidetrack +sidetracked +sidetracking +sidetracks +sidewalk +sidewalk's +sidewalks +siding's +sidings +sidle +sidled +sidles +sidling +siege +siege's +sieges +sierra +sierra's +siesta +siesta's +siestas +sieve +sieve's +sieved +sieves +sieving +sift +sifted +sifting +sifts +sighed +sighing +sighs +sightless +signer +signified +signifies +signify +signifying +signpost +signpost's +signposted +signposting +signposts +silenced +silences +silencing +silenter +silentest +silently +silents +silhouette +silhouette's +silhouetted +silhouettes +silhouetting +silk +silk's +silken +silkened +silkening +silkens +silks +sill +sill's +sillies +silliness +silliness's +sills +silo +silo's +silos +silt +silt's +silted +silting +silts +silvered +silverier +silveriest +silvering +silvers +silversmith +silversmith's +silversmiths +silverware +silverware's +silvery +simile +simile's +similes +simmer +simmered +simmering +simmers +simpled +simples +simplex +simplification +simpling +simulations +simulator +simulator's +sincerer +sincerest +sincerity +sincerity's +sinew +sinew's +sinews +sinewy +singe +singed +singeing +singes +singled +singling +singly +singularity +singularity's +singulars +sinned +sinner +sinner's +sinners +sinning +sinus +sinus's +sinuses +sip +sipped +sipping +sips +sire +sire's +sired +siren +siren's +sirens +sires +siring +sirloin +sirloin's +sirloins +sirred +sirring +sirs +sissier +sissies +sissiest +sissy +sissy's +sistered +sisterhood +sisterhood's +sisterhoods +sistering +sisterly +sisters +sited +siting +sitter +sitter's +sitters +sixes +sixpence +sixpence's +sixpences +sixteens +sixteenth +sixteenths +sixths +sixtieth +sixtieths +sixty's +sizable +sizer +sizzle +sizzled +sizzles +sizzling +skate +skate's +skateboard +skateboard's +skateboarded +skateboarding +skateboards +skated +skater +skater's +skaters +skates +skating +skein +skein's +skeined +skeining +skeins +skeletons +sketched +sketchier +sketchiest +sketching +sketchy +skew +skewed +skewer +skewer's +skewered +skewering +skewers +skewing +skews +ski +ski's +skid +skidded +skidding +skids +skied +skies +skiing +skiing's +skillet +skillet's +skillets +skillful +skim +skimmed +skimming +skimp +skimped +skimpier +skimpiest +skimping +skimps +skimpy +skims +skinflint +skinflint's +skinflints +skinned +skinnier +skinniest +skinning +skinny +skins +skipper +skipper's +skippered +skippering +skippers +skirmish +skirmish's +skirmished +skirmishes +skirmishing +skirted +skirting +skirts +skis +skit +skit's +skited +skiting +skits +skittish +skulk +skulked +skulking +skulks +skulls +skunk +skunk's +skunked +skunking +skunks +skying +skylight +skylight's +skylights +skyline +skyline's +skylines +skyrocket +skyrocket's +skyrocketed +skyrocketing +skyrockets +skyscraper +skyscraper's +skyscrapers +slab +slab's +slabbed +slabbing +slabs +slack +slacked +slacken +slackened +slackening +slackens +slacker +slackest +slacking +slacks +slain +slake +slaked +slakes +slaking +slam +slammed +slamming +slams +slander +slander's +slandered +slandering +slanders +slant +slanted +slanting +slants +slap +slap's +slapped +slapping +slaps +slapstick +slapstick's +slashed +slashes +slashing +slat +slat's +slate +slate's +slated +slates +slating +slats +slaughter +slaughter's +slaughtered +slaughtering +slaughters +slaved +slavery +slavery's +slaving +slavish +slay +slaying +slays +sleazier +sleaziest +sleazy +sled +sled's +sledded +sledding +sledgehammer +sledgehammer's +sleds +sleek +sleeked +sleeker +sleekest +sleeking +sleeks +sleeper +sleeper's +sleepers +sleepier +sleepiest +sleepless +sleepy +sleet +sleet's +sleeted +sleeting +sleets +sleeve +sleeve's +sleeveless +sleeves +sleigh +sleigh's +sleighed +sleighing +sleighs +slender +slenderer +slenderest +slew +slewed +slewing +slews +slick +slicked +slicker +slickest +slicking +slicks +slided +slier +sliest +slighted +slighting +slights +slime +slime's +slimier +slimiest +slimmed +slimmer +slimmest +slimming +slims +slimy +sling +sling's +slinging +slings +slingshot +slingshot's +slingshots +slink +slinking +slinks +slipper +slipper's +slipperier +slipperiest +slippers +slipshod +slit +slither +slithered +slithering +slithers +slits +slitted +slitter +slitting +sliver +sliver's +slivered +slivering +slivers +slob +slob's +slobber +slobbered +slobbering +slobbers +slobs +slog +slogans +slogged +slogging +slogs +slop +sloped +slopes +sloping +slopped +sloppier +sloppiest +slopping +slops +slosh +slosh's +sloshed +sloshes +sloshing +sloth +sloth's +slothed +slothful +slothing +sloths +slotted +slotting +slouch +slouched +slouches +slouching +slovenlier +slovenliest +slovenly +slowness +slowness's +sludge +sludge's +sludged +sludges +sludging +slug +slug's +slugged +slugging +sluggish +slugs +sluice +sluice's +sluiced +sluices +sluicing +slum +slum's +slumber +slumbered +slumbering +slumbers +slummed +slummer +slumming +slump +slumped +slumping +slumps +slums +slung +slunk +slur +slurred +slurring +slurs +slush +slush's +slut +slut's +sluts +sly +slyness +slyness's +smack +smack's +smacked +smacking +smacks +smalled +smalling +smallpox +smallpox's +smalls +smarted +smarter +smartest +smarting +smartly +smarts +smattering +smattering's +smatterings +smear +smeared +smearing +smears +smelled +smellier +smelliest +smelling +smelt +smelted +smelting +smelts +smidgen +smidgen's +smidgens +smirk +smirk's +smirked +smirking +smirks +smite +smites +smithereens +smiths +smiting +smitten +smock +smock's +smocked +smocking +smocks +smog +smog's +smoker's +smokestack +smokestack's +smokestacks +smokier +smokies +smokiest +smoky +smoldered +smolders +smoothed +smoother +smoothest +smoothing +smoothness +smoothness's +smooths +smote +smother +smothered +smothering +smothers +smudge +smudged +smudges +smudging +smugged +smugger +smuggest +smugging +smuggle +smuggled +smuggler +smuggler's +smugglers +smuggles +smuggling +smugly +smugs +smut +smut's +smuts +snacked +snacking +snacks +snagged +snagging +snags +snailed +snailing +snails +snake +snake's +snaked +snakes +snaking +snap +snapped +snappier +snappiest +snapping +snappy +snaps +snapshot +snapshot's +snapshots +snare +snare's +snared +snares +snaring +snarl +snarled +snarling +snarls +snatch +snatched +snatches +snatching +sneaker +sneaker's +sneakers +sneakier +sneakiest +sneer +sneer's +sneered +sneering +sneers +sneeze +sneezed +sneezes +sneezing +snicker +snicker's +snickered +snickering +snickers +snide +snider +snides +snidest +sniffed +sniffing +sniffle +sniffled +sniffles +sniffling +sniffs +snigger's +snip +snipe +snipe's +sniped +sniper +sniper's +snipers +snipes +sniping +snipped +snippet +snippet's +snippets +snipping +snips +snitch +snitched +snitches +snitching +snob +snob's +snobbish +snobs +snooker +snooker's +snoop +snooped +snooping +snoops +snootier +snootiest +snooty +snooze +snoozed +snoozes +snoozing +snore +snored +snores +snoring +snorkel +snorkel's +snorkeled +snorkeling +snorkels +snort +snorted +snorting +snorts +snot +snot's +snots +snotted +snotting +snout +snout's +snouted +snouting +snouts +snowball +snowball's +snowballed +snowballing +snowballs +snowdrift +snowdrift's +snowdrifts +snowed +snowfall +snowfall's +snowfalls +snowflake +snowflake's +snowflakes +snowier +snowiest +snowing +snowplow +snowplow's +snowplowed +snowplowing +snowplows +snows +snowstorm +snowstorm's +snowstorms +snowy +snub +snubbed +snubbing +snubs +snuff +snuffed +snuffer +snuffing +snuffs +snug +snugged +snugger +snuggest +snugging +snuggle +snuggled +snuggles +snuggling +snugly +snugs +soak +soaked +soaking +soaks +soaped +soapier +soapiest +soaping +soaps +soapy +soar +soared +soaring +soars +sob +sobbed +sobbing +sobered +soberer +soberest +sobering +sobers +sobriety +sobriety's +sobs +soccer +soccer's +sociable +sociables +socialists +socials +sociological +sociological's +sociologist +sociologist's +sociologists +sociology +sociology's +sock's +socked +socking +soda +soda's +sodas +sodded +sodden +sodding +sodium +sodium's +sodomy +sodomy's +sods +sofa +sofa's +sofas +softball +softball's +softballs +soften +softened +softening +softens +softer +softest +softly +softness +softness's +soggier +soggiest +soggy +soiled +soiling +soils +sojourn +sojourn's +sojourned +sojourning +sojourns +solace +solace's +solaced +solaces +solacing +solder +solder's +soldered +soldering +solders +soldiered +soldiering +soled +solemn +solemner +solemnest +solemnity +solemnity's +solemnly +solicit +solicited +soliciting +solicitous +solicits +solidarity +solidarity's +solider +solidest +solidified +solidifies +solidify +solidifying +solidity +solidly +solids +soling +solitaire +solitaire's +solitaires +solitaries +solitary +solitude +solitude's +soloed +soloing +soloist +soloist's +soloists +solos +soluble +solubles +solvent +solvents +somber +somebodies +someday +someones +somersault +somersault's +somersaulted +somersaulting +somersaults +somethings +somewhats +somewheres +sonata +sonata's +sonatas +sonic +sonics +sonnet +sonnet's +sonnets +sonorous +soot +soot's +soothe +soothed +soother +soothes +soothest +soothing +sootier +sootiest +sooty +sop +sop's +sophistication +sophistication's +sophistry +sophistry's +sophomore +sophomore's +sophomores +sopped +sopping +soprano +soprano's +sopranos +sops +sorcerer +sorcerer's +sorcerers +sorceress +sorceresses +sorcery +sorcery's +sored +sorely +sorer +sores +sorest +soring +sororities +sorority +sorority's +sorrier +sorriest +sorrow +sorrow's +sorrowed +sorrowful +sorrowing +sorrows +sorta +souffl +souffl's +souffls +sounder +soundest +soundly +soundproof +soundproofed +soundproofing +soundproofs +souped +souping +soups +sour +sourced +sourcing +soured +sourer +sourest +souring +sours +southeast +southeast's +southeastern +southerlies +southerly +southerner +southerners +southerns +southpaw +southpaw's +southpaws +southward +southwest +southwest's +southwestern +souvenir +souvenir's +souvenirs +sovereign +sovereign's +sovereigns +sovereignty +sovereignty's +sow +sowed +sowing +sown +sows +sox's +spa +spa's +spacecraft +spacecraft's +spacecrafts +spaceship +spaceship's +spaceships +spacial +spacious +spade +spade's +spaded +spades +spading +spaghetti +spaghetti's +spangle +spangle's +spangled +spangles +spangling +spaniel +spaniel's +spanielled +spanielling +spaniels +spank +spanked +spanking +spanking's +spankings +spanks +spanned +spanner +spanner's +spanners +spanning +spans +spar +spar's +spared +sparer +sparest +sparing +spark +spark's +sparked +sparking +sparkle +sparkled +sparkler +sparkler's +sparklers +sparkles +sparkling +sparks +sparred +sparrer +sparring +sparrow +sparrow's +sparrows +spars +sparse +sparsely +sparser +sparsest +spas +spasm +spasm's +spasmed +spasming +spasmodic +spasms +spat +spat's +spate +spate's +spats +spatted +spatter +spattered +spattering +spatters +spatting +spatula +spatula's +spatulas +spawn +spawn's +spawned +spawning +spawns +spay +spayed +spaying +spays +spear +spear's +speared +spearhead +spearhead's +spearheaded +spearheading +spearheads +spearing +spearmint +spearmint's +spears +specialer +specialists +specials +specifics +specifier +specifier's +specimens +specious +speck +speck's +specked +specking +specks +spectacle +spectacle's +spectacles +spectacularly +spectaculars +spectator +spectator's +spectators +spectra +speculated +speculates +speculating +speculations +speculative +speculator +speculator's +speculators +speeched +speeching +speechless +speedboat +speedboat's +speedboats +speedier +speediest +speedometer +speedometer's +speedometers +speedy +spellbind +spellbinding +spellbinds +spellbound +speller +speller's +spendthrift +spendthrift's +spendthrifts +sperm +sperm's +sperms +spew +spewed +spewing +spews +spheres +spherical +sphinx +sphinx's +sphinxes +spice +spice's +spiced +spices +spicier +spiciest +spicing +spicy +spider +spider's +spiders +spied +spigot's +spigots +spiked +spikes +spiking +spilling +spills +spinach +spinach's +spinal +spinals +spindlier +spindliest +spindly +spine +spine's +spineless +spines +spinning +spinning's +spins +spinster +spinster's +spinsters +spirals +spire +spire's +spires +spirited +spiriting +spiritually +spirituals +spited +spiteful +spitefuller +spitefullest +spites +spiting +spittle +spittle's +splash +splashed +splashes +splashing +splat +splat's +splatter +splattered +splattering +splatters +spleen +spleen's +spleens +splendider +splendidest +splendidly +splice +spliced +splices +splicing +splint +splint's +splinted +splinter +splinter's +splintered +splintering +splinters +splinting +splints +splurge +splurge's +splurged +splurges +splurging +spokes +spokesmen +spokespeople +spokesperson +spokespersons +spokeswoman +spokeswoman's +spokeswomen +sponge +sponge's +sponged +sponges +spongier +spongiest +sponging +spongy +sponsorship +spontaneity +spontaneity's +spoofed +spoofing +spoofs +spook +spook's +spooked +spookier +spookiest +spooking +spooks +spooky +spooled +spooling +spools +spoon +spoon's +spooned +spoonful +spoonful's +spoonfuls +spooning +spoons +sporadic +spore +spores +sporran +sporran's +sported +sporting +sportsmanship +sportsmanship's +spotless +spotlight +spotlight's +spotlighted +spotlighting +spotlights +spottier +spottiest +spotty +spouse +spouse's +spouses +spouted +spouting +spouts +sprain +sprained +spraining +sprains +sprangs +sprawl +sprawled +sprawling +sprawls +sprayed +spraying +sprays +spreadsheet +spreadsheets +spree +spree's +spreed +spreeing +sprees +sprier +spriest +sprig +sprig's +sprigs +springboard +springboard's +springboards +springier +springiest +springing's +springtime +springtime's +springy +sprinkle +sprinkled +sprinkler +sprinkler's +sprinklers +sprinkles +sprinkling +sprinkling's +sprinklings +sprint +sprint's +sprinted +sprinter +sprinters +sprinting +sprints +sprout +sprouted +sprouting +sprouts +spruce +spruce's +spruced +sprucer +spruces +sprucest +sprucing +spry +spud +spud's +spuds +spun +spunk +spunk's +spunked +spunking +spunks +spurn +spurned +spurning +spurns +spurred +spurring +spurs +spurt +spurted +spurting +spurts +sputter +sputtered +sputtering +sputters +spying +squabble +squabbled +squabbles +squabbling +squadded +squadding +squadron +squadron's +squadrons +squads +squalid +squalider +squalidest +squall +squall's +squalled +squalling +squalls +squalor +squalor's +squander +squandered +squandering +squanders +squarely +squarer +squarest +squat +squats +squatted +squatter +squattest +squatting +squawk +squawk's +squawked +squawking +squawks +squeak +squeak's +squeaked +squeakier +squeakiest +squeaking +squeaks +squeaky +squeal +squeal's +squealed +squealing +squeals +squeamish +squelch +squelched +squelches +squelching +squid +squid's +squidded +squidding +squids +squint +squinted +squinter +squintest +squinting +squints +squire +squire's +squired +squires +squiring +squirm +squirmed +squirming +squirms +squirrel +squirrel's +squirrels +squirt +squirted +squirting +squirts +stab +stabbed +stabbing +stabled +stabler +stables +stablest +stabling +stabs +stacked +stacking +stadium +stadium's +stadiums +staffed +staffing +staffs +stag +stag's +stagecoach +stagecoach's +stagecoaches +staged +staging +stagnant +stagnate +stagnated +stagnates +stagnating +stagnation +stagnation's +stags +staid +staider +staidest +stain +stained +staining +stains +stair's +staircases +stairway +stairway's +stairways +staked +stakes +staking +staled +stalemate +stalemate's +stalemated +stalemates +stalemating +staler +stales +stalest +staling +stalk +stalk's +stalked +stalking +stalks +stalled +stalling +stallion +stallion's +stallions +stalls +stalwart +stalwarts +stamina +stamina's +stammer +stammered +stammering +stammers +stampede +stampede's +stampeded +stampedes +stampeding +stances +stanch +stanched +stancher +stanches +stanchest +stanching +standby +standbys +standings +standoff +standoff's +standoffs +standpoints +standstill +standstill's +standstills +stank +stanks +stanza +stanza's +stanzas +staple +staple's +stapled +stapler +stapler's +staplers +staples +stapling +starboard +starboard's +starch +starch's +starched +starches +starchier +starchiest +starching +starchy +stardom +stardom's +starfish +starfish's +starfishes +starked +starker +starkest +starking +starks +starlight +starlight's +starrier +starriest +starry +starter's +startlingly +starvation +starvation's +statelier +stateliest +stately +stater +statesman +statesman's +statesmanship +statesmanship's +statesmen +stationed +stationery +stationery's +stationing +statistically +statistician +statistician's +statisticians +statue +statue's +statues +stature +stature's +statures +statuses +statute +statute's +statutes +statutory +staunch +staunched +stauncher +staunches +staunchest +staunching +staunchly +stave +stave's +staved +staving +steadfast +steadied +steadier +steadies +steadiest +steadying +steak +steak's +steaks +stealth +stealth's +stealthier +stealthiest +stealthily +stealthy +steamed +steamier +steamies +steamiest +steaming +steamroller +steamroller's +steamrollered +steamrollering +steamrollers +steams +steamy +steeled +steeling +steels +steeped +steeper +steepest +steeping +steeple +steeple's +steeples +steeps +stellar +stem's +stemmed +stemming +stench +stench's +stenched +stenches +stenching +stencil +stencil's +stencils +stenographer +stenographer's +stenographers +stenography +stenography's +stepladder +stepladder's +stepladders +stereos +stereotyped +stereotyping +stern +sterned +sterner +sternest +sterning +sternly +sternness +sterns +stethoscope +stethoscope's +stethoscopes +stew +stew's +steward +steward's +stewarded +stewardess +stewardess's +stewardesses +stewarding +stewards +stewed +stewing +stews +sticker +sticker's +stickers +stickied +stickier +stickies +stickiest +stickler +stickler's +sticklers +stickying +stiffed +stiffen +stiffened +stiffening +stiffens +stiffer +stiffest +stiffing +stiffly +stiffness +stiffness's +stiffs +stifle +stifled +stifles +stifling +stigma +stigma's +stigmas +stigmata +stillborn +stillborns +stilled +stiller +stillest +stilling +stillness +stillness's +stills +stilted +stimulant +stimulant's +stimulants +stimuli +stimuli's +stimulus +stimulus's +sting +stinger +stinger's +stingers +stingier +stingiest +stinginess +stinginess's +stinging +stings +stingy +stink +stinking +stinks +stint +stinted +stinting +stints +stipulate +stipulated +stipulates +stipulating +stipulation +stipulation's +stipulations +stirrup +stirrup's +stirrups +stitch +stitch's +stitched +stitches +stitching +stockade +stockade's +stockaded +stockades +stockading +stockbroker +stockbroker's +stockbrokers +stocked +stockholder +stockholder's +stockholders +stockier +stockiest +stocking +stocking's +stockings +stockpile +stockpiled +stockpiles +stockpiling +stocky +stockyard +stockyard's +stockyards +stodgier +stodgiest +stodgy +stoical +stoke +stoked +stokes +stoking +stoles +stolid +stolider +stolidest +stolidly +stomached +stomaching +stomachs +stomp +stomped +stomping +stomps +stoned +stonier +stoniest +stoning +stony +stool +stool's +stools +stoop +stooped +stooping +stoops +stopgap +stopgap's +stopgaps +stopover +stopover's +stopovers +stoppage +stoppage's +stoppages +stopper +stopper's +stoppered +stoppering +stoppers +stopwatch +stopwatch's +stopwatches +storehouse +storehouse's +storehouses +storekeeper +storekeeper's +storekeepers +storeroom +storeroom's +storerooms +stork +stork's +storks +stormed +stormier +stormiest +storming +stormy +stout +stouter +stoutest +stove +stove's +stoves +stow +stowaway +stowaway's +stowaways +stowed +stowing +stows +straddle +straddled +straddles +straddling +straggle +straggled +straggler +stragglers +straggles +straggling +straighted +straighten +straightened +straightening +straightens +straighter +straightest +straightforwardly +straightforwards +straighting +straights +strained +strainer +strainer's +strainers +straining +strait +strait's +straited +straiting +straitjacket +straitjacket's +straitjacketed +straitjacketing +straitjackets +straits +strand +stranded +stranding +strands +strangeness +strangeness's +strangered +strangering +strangers +strangle +strangled +strangles +strangling +strangulation +strangulation's +strap +strap's +strapped +strapping +straps +strata +strata's +stratagem +stratagem's +stratagems +strategics +stratified +stratifies +stratify +stratifying +stratosphere +stratosphere's +stratospheres +stratum +stratum's +strawberries +strawberry +strawberry's +strawed +strawing +straws +strayed +straying +strays +streak +streak's +streaked +streaking +streaks +streamed +streamer +streamer's +streamers +streaming +streaming's +streamline +streamline's +streamlined +streamlines +streamlining +streetcar +streetcar's +streetcars +strengthened +strengthening +strengthens +strengths +strenuous +strenuously +stressful +stretcher +stretcher's +stretchers +strew +strewed +strewing +strewn +strews +stricken +stricter +strictest +strictness +stridden +stride +stride's +strides +striding +strife +strife's +striker +striker's +strikers +strikings +stringier +stringiest +stringing +stringy +stripe +stripe's +striped +stripes +striping +stripper +striven +strives +striving +strode +stroked +strokes +stroking +stroll +strolled +stroller +stroller's +strollers +strolling +strolls +stronghold +stronghold's +strongholds +strove +structuralist +structuralist's +strum +strummed +strumming +strums +strung +strut +struts +strutted +strutting +stub +stub's +stubbed +stubbier +stubbies +stubbiest +stubbing +stubble +stubble's +stubborn +stubborned +stubborner +stubbornest +stubborning +stubborns +stubby +stubs +stud +stud's +studded +studding +studentship +studentship's +studios +studious +studs +stuffier +stuffiest +stuffing's +stuffy +stump +stump's +stumped +stumping +stumps +stung +stunk +stunted +stunting +stunts +stupefied +stupefies +stupefy +stupefying +stupendous +stupider +stupidest +stupidities +stupidly +stupids +stupor +stupor's +stupors +sturdier +sturdiest +sturdy +stutter +stuttered +stuttering +stutters +styled +styling +stylish +stylistic +stylus +stylus's +suave +suaver +suavest +sub +sub's +subbed +subbing +subcommittee +subcommittees +subconscious +subconsciously +subdivide +subdivided +subdivides +subdividing +subdivision +subdivision's +subdivisions +subdue +subdued +subdues +subduing +subgroup +subgroup's +subjectives +subjugate +subjugated +subjugates +subjugating +subjunctive +sublet +sublets +subletting +sublime +sublimed +sublimer +sublimes +sublimest +subliming +submarine +submarine's +submarines +submerge +submerged +submerges +submerging +submersion +submersion's +submissions +submissive +subnormal +subordinate +subordinated +subordinates +subordinating +subprogram +subs +subscribed +subscriber +subscriber's +subscribers +subscribes +subscribing +subscript +subscriptions +subscripts +subsection +subsection's +subsections +subsequents +subservient +subservients +subsets +subside +subsided +subsides +subsidiaries +subsidies +subsiding +subsidy +subsidy's +subsist +subsisted +subsistence +subsistence's +subsisting +subsists +substandard +substantiate +substantiated +substantiates +substantiating +substitutions +subsystem +subterfuge +subterfuge's +subterfuges +subterranean +subtler +subtlest +subtract +subtracted +subtracting +subtraction +subtraction's +subtractions +subtracts +suburb +suburb's +suburban +suburbans +suburbs +subversive +subversives +subvert +subverted +subverting +subverts +successes +successions +successively +successors +succinct +succincter +succinctest +succinctly +succulent +succulents +succumb +succumbed +succumbing +succumbs +suck +sucked +sucker +sucker's +suckered +suckering +suckers +sucking +suckle +suckled +suckles +suckling +sucks +suction +suction's +suctioned +suctioning +suctions +suds +suede +suede's +sufferer's +sufferings +sufficed +suffices +sufficing +suffixed +suffixes +suffixing +suffocate +suffocated +suffocates +suffocating +suffocation +suffrage +suffrage's +sugared +sugarier +sugariest +sugaring +sugars +sugary +suggester +suggester's +suggestive +suicides +suitcase +suitcase's +suitcases +suites +suitor +suitor's +suitors +sulk +sulked +sulkier +sulkies +sulkiest +sulking +sulks +sulky +sullen +sullener +sullenest +sultan +sultan's +sultans +sultrier +sultriest +sultry +summarily +summered +summering +summers +summit +summit's +summits +summon +summoned +summoning +summons +summons's +summonsed +summonses +summonsing +sumptuous +sunbathe +sunbathed +sunbathes +sunbathing +sunburn +sunburn's +sunburned +sunburning +sunburns +sundae +sundae's +sundaes +sundial +sundial's +sundials +sundown +sundown's +sundowns +sundries +sunflower +sunflower's +sunflowers +sunglasses +sunken +sunks +sunlit +sunned +sunnier +sunnies +sunniest +sunning +sunrises +sunrising +suns +sunscreen +sunscreens +sunset +sunset's +sunsets +sunsetting +suntan +suntan's +suntanned +suntanning +suntans +sunup +sunup's +sup +superber +superbest +superbly +supercomputer +supercomputers +supered +superficials +superhuman +superimpose +superimposed +superimposes +superimposing +supering +superintendent +superintendent's +superintendents +superiors +superlative +superlatives +supermarkets +supernaturals +supers +superscript +superscripts +supersede +superseded +supersedes +superseding +supersonic +supersonics +superstar +superstar's +superstars +superstition +superstition's +superstitions +superstitious +superstructure +superstructure's +superstructures +supervisory +supper +supper's +suppers +supplant +supplanted +supplanting +supplants +supple +supplemented +supplementing +supplements +suppler +supplest +supportive +supposition +supposition's +suppositions +supremacy +supremacy's +supremely +supremer +supremest +surcharge +surcharge's +surcharged +surcharges +surcharging +surer +surest +surf +surf's +surfaced +surfacing +surfboard +surfboard's +surfboarded +surfboarding +surfboards +surfed +surfing +surfing's +surfs +surge +surge's +surged +surgeon +surgeon's +surgeons +surgeries +surges +surgical +surging +surlier +surliest +surly +surmise +surmised +surmises +surmising +surmount +surmounted +surmounting +surmounts +surnames +surpass +surpassed +surpasses +surpassing +surpluses +surplussed +surplussing +surreal +surrender +surrendered +surrendering +surrenders +surreptitious +surveillance +surveillance's +surveyed +surveying +surveyor +surveyor's +surveyors +survivals +survivor +survivor's +survivors +suspender +suspenders +suspense +suspense's +suspensions +suspicions +sustainable +sustenance +sustenance's +swab +swab's +swabbed +swabbing +swabs +swagger +swaggered +swaggerer +swaggering +swaggers +swamp's +swampier +swampiest +swampy +swan +swan's +swans +swarm +swarm's +swarmed +swarming +swarms +swarthier +swarthiest +swarthy +swat +swathe +swathed +swathes +swathing +swats +swatted +swatting +sway +swayed +swaying +sways +sweater +sweater's +sweaters +sweaty +sweeper +sweeper's +sweepers +sweepings +sweeps's +sweepstakes +sweeten +sweetened +sweetening +sweetens +sweeter +sweetest +sweetheart +sweetheart's +sweethearts +sweetly +sweetness +sweetness's +sweets +swell +swelled +sweller +swellest +swelling +swelling's +swellings +swells +swerve +swerved +swerves +swerving +swift +swifted +swifter +swiftest +swifting +swiftly +swifts +swig +swig's +swigged +swigging +swigs +swill +swilled +swilling +swills +swindle +swindled +swindler +swindler's +swindlers +swindles +swindling +swine +swine's +swines +swinging +swings +swipe +swiped +swipes +swiping +swirl +swirled +swirling +swirls +swish +swished +swisher +swishes +swishest +swishing +switchable +switchboard +switchboard's +switchboards +switcher +swivel +swivel's +swivels +swollen +swoon +swooned +swooning +swoons +swoop +swooped +swooping +swoops +sworded +swordfish +swordfish's +swordfishes +swording +swords +swung +syllable +syllable's +syllables +syllabus +syllabus's +syllabuses +symbolics +symbolism +symbolism's +symmetrical +sympathetically +sympathetics +symphonic +symptomatic +synagogue +synagogue's +synagogues +synapse +synapses +synchronous +syndicated +syndicates +syndicating +syndromes +synopses +synopsis +synopsis's +syntheses +synthetic +synthetics +syphilis +syphilis's +syphilises +syringe +syringe's +syringed +syringes +syringing +syrup +syrup's +systematically +systematics +tabbed +tabbies +tabbing +tabby +tabernacle +tabernacle's +tabernacles +tablecloth +tablecloth's +tablecloths +tabled +tablespoon +tablespoon's +tablespoonful +tablespoonful's +tablespoonfuls +tablespoons +tablet +tablet's +tablets +tabling +tabloid +tabloid's +tabloids +taboo +tabooed +tabooing +taboos +tabulate +tabulated +tabulates +tabulating +tabulation +tabulation's +tacit +tacitly +taciturn +tackier +tackies +tackiest +tackling's +tacky +taco +taco's +tacos +tact +tact's +tactful +tactfully +tactic's +tactlessly +tadpole +tadpole's +tadpoles +tagged +tagging +tags +tailed +tailgate +tailgate's +tailgated +tailgates +tailgating +tailing +taillight +taillight's +taillights +tailor's +tailspin +tailspin's +tailspins +taint +tainted +tainting +taints +takeoff +takeoff's +takeoffs +takeover +takeover's +talc +talc's +talisman +talisman's +talismans +talkative +talker +talker's +talkers +taller +tallest +tallied +tallies +tallow +tallow's +tally +tallying +talon +talon's +talons +tambourine +tambourine's +tambourines +tamed +tamely +tameness +tamer +tames +tamest +taming +tamper +tampered +tampering +tampers +tan +tan's +tandem +tandem's +tandems +tang +tang's +tangential +tangents +tangerine +tangerine's +tangerines +tangible +tangibles +tangle +tangle's +tangled +tangles +tangling +tango +tango's +tangoed +tangoing +tangos +tangs +tankard +tankard's +tankards +tanked +tanker +tanker's +tankers +tanking +tanned +tanner +tannest +tanning +tans +tantamount +tantrum +tantrum's +tantrums +tap's +taped +taper +tapered +tapering +tapers +tapestries +tapestry +tapestry's +taping +tapped +tapping +tapping's +taps +taps's +tar +tar's +tarantula +tarantula's +tarantulas +tardier +tardies +tardiest +tardiness +tardy +targeted +targeting +tariff +tariff's +tariffs +tarnish +tarnished +tarnishes +tarnishing +tarpaulin +tarpaulin's +tarpaulins +tarred +tarried +tarrier +tarries +tarriest +tarring +tarry +tarrying +tars +tart +tart's +tartan +tartan's +tartans +tartar +tartar's +tartars +tarted +tarter +tartest +tarting +tarts +tasked +tasking +tassel +tassel's +tasteful +tastefully +tastier +tastiest +tasty +tattle +tattled +tattles +tattling +tattoo +tattoo's +tattooed +tattooing +tattoos +tatty +taunt +taunted +taunting +taunts +taut +tauted +tauter +tautest +tauting +tautology +tautology's +tauts +tavern +tavern's +taverns +tawdrier +tawdriest +tawdry +tawnier +tawniest +tawny +tawny's +taxable +taxed +taxicab +taxicab's +taxicabs +taxied +taxiing +taxing +taxis +taxpayer's +teachings +teacup +teacup's +teacups +teaed +teaing +teak +teak's +teaks +teamed +teaming +teammate +teammate's +teammates +teamster +teamster's +teamsters +teamwork +teamwork's +teapots +teardrop +teardrop's +teardrops +tearful +teas +tease +teased +teases +teasing +teaspoon +teaspoon's +teaspoons +teat +teat's +teats +technicalities +technicality +technicality's +technicals +technician +technician's +technicians +technologically +technologies +tediously +tedium +tedium's +tee +tee's +teed +teeing +teem +teemed +teeming +teems +teen +teenager's +teens +tees +teeter +teetered +teetering +teeters +teethe +teethed +teethes +teething +teething's +teetotal +telecommunications +telegram +telegram's +telegrams +telegraph +telegraph's +telegraphed +telegraphing +telegraphs +telepathic +telepathy +telepathy's +telephoned +telephoning +telescoped +telescopes +telescoping +teletype +televise +televised +televises +televising +televisions +teller +teller's +tellered +tellering +tellers +telltale +telltale's +telltales +temperament +temperament's +temperamental +temperaments +temperance +temperance's +temperate +temperated +temperates +temperating +tempered +tempering +tempers +tempest +tempest's +tempests +tempestuous +template +template's +temples +tempo +tempo's +temporal +temporaries +tempos +temptations +tenable +tenacious +tenacity +tenancies +tenancy +tenancy's +tenant +tenant's +tenanted +tenanting +tenants +tendered +tenderer +tenderest +tendering +tenderly +tenderness +tenderness's +tenders +tendon +tendon's +tendons +tendril +tendril's +tendrils +tenement +tenement's +tenements +tenet +tenet's +tenets +tenor +tenor's +tenors +tensed +tenser +tenses +tensest +tensing +tensions +tensors +tent +tent's +tentacle +tentacle's +tentacles +tentatives +tented +tenths +tenting +tents +tenuous +tenure +tenure's +tenured +tenures +tenuring +tepee +tepee's +tepees +tepid +terminators +termini +terminologies +terminus +terminus's +termite +termite's +termites +termly +terrace +terrace's +terraced +terraces +terracing +terrain +terrain's +terrains +terrestrial +terrestrials +terrier +terrier's +terriers +terrific +territorial +territorials +territories +terrors +tersely +terseness +terseness's +terser +tersest +testable +testament +testament's +testaments +tester +testers +testes +testes's +testicle +testicle's +testicles +testified +testifies +testify +testifying +testimonial +testimonial's +testimonials +testimonies +testimony +testimony's +testis +tetanus +tetanus's +tether +tether's +tethered +tethering +tethers +textile +textile's +textiles +textually +texture +texture's +textures +thankfuller +thankfullest +thankless +thatch +thatch's +thatched +thatcher +thatches +thatching +thaw +thawed +thawing +thaws +theatrical +thefts +theist +theists +thence +theologian +theologian's +theologians +theologies +theoretic +theorist +theorist's +theorists +therapeutic +therapies +therapist +therapist's +therapists +thereon +thereupon +thermal +thermals +thermodynamics +thermodynamics's +thermometer +thermometer's +thermometers +thermostat +thermostat's +thermostats +thesauri +thesaurus +thesaurus's +thesauruses +theta +theta's +thicken +thickened +thickening +thickens +thicker +thickest +thicket +thicket's +thickets +thickly +thicknesses +thief's +thigh +thigh's +thighs +thimble +thimble's +thimbled +thimbles +thimbling +thinker +thinkers +thinly +thinned +thinner +thinner's +thinnest +thinning +thins +thirded +thirding +thirds +thirsted +thirstier +thirstiest +thirsting +thirsts +thirsty +thirteen +thirteen's +thirteens +thirteenth +thirteenths +thirties +thirtieth +thirtieths +thistle +thistle's +thistles +thong +thong's +thongs +thorn +thorn's +thornier +thorniest +thorns +thorny +thoroughbred +thoroughbreds +thorougher +thoroughest +thoughtful +thoughtfully +thoughtfulness +thoughtless +thoughtlessly +thousandth +thousandths +thrash +thrashed +thrashes +thrashing +thrashing's +threadbare +threaded +threading +threads +threes +thresh +threshed +thresher +thresher's +threshers +threshes +threshing +thresholds +thrice +thrift +thrift's +thriftier +thriftiest +thrifts +thrifty +thrill +thrill's +thrilled +thriller +thriller's +thrillers +thrilling +thrills +thrive +thrived +thrives +thriving +throb +throbbed +throbbing +throbs +throne +throne's +thrones +throng +throng's +thronged +thronging +throngs +throttle +throttle's +throttled +throttles +throttling +throwaway +throwaway's +throwback +throwback's +throwbacks +thud +thud's +thudded +thudding +thuds +thug +thug's +thugs +thumbed +thumbing +thumbs +thumbtack +thumbtack's +thumbtacks +thump +thump's +thumped +thumping +thumps +thunder +thunder's +thunderbolt +thunderbolt's +thunderbolts +thundered +thundering +thunderous +thunders +thunderstorm +thunderstorm's +thunderstorms +thunderstruck +thwart +thwarted +thwarting +thwarts +thyme +thyme's +thyroid +thyroids +tiara +tiara's +tiaras +ticked +ticketed +ticketing +ticking +ticking's +tickle +tickled +tickles +tickling +ticklish +ticks +tidal +tidbit +tidbit's +tidbits +tide +tided +tides +tidier +tidiest +tiding +tier +tier's +tiers +tiff +tiff's +tiffed +tiffing +tiffs +tigers +tighten +tightened +tightening +tightens +tighter +tightest +tightness +tightness's +tightrope +tightrope's +tightropes +tights +tightwad +tightwad's +tightwads +tilde +tilde's +tile's +tiled +tiling +tilled +tilling +tills +tilt +tilted +tilting +tilts +timber +timber's +timbers +timekeeper +timekeeper's +timekeepers +timeless +timelier +timeliest +timely +timers +timescales +timetabled +timetables +timetabling +timezone +timid +timider +timidest +timidity +timidity's +timidly +timings +tinder +tinder's +ting +tinge +tinged +tingeing +tinges +tinging +tingle +tingled +tingles +tingling +tings +tinier +tiniest +tinker +tinker's +tinkered +tinkering +tinkers +tinkle +tinkled +tinkles +tinkling +tinned +tinnier +tinnies +tinniest +tinning +tinny +tinsel +tinsel's +tinsels +tint +tint's +tinted +tinting +tints +tipped +tipping +tipsier +tipsiest +tipsy +tiptoe +tiptoed +tiptoeing +tiptoes +tirade +tirade's +tirades +tireder +tiredest +tireless +tissue +tissue's +tissues +tit +tit's +titillate +titillated +titillates +titillating +titled +titling +tits +titted +titter +tittered +tittering +titters +titting +toads +toadstool +toadstool's +toadstools +toasted +toaster +toaster's +toasters +toasting +toasts +tobaccos +toboggan +toboggan's +tobogganed +tobogganing +toboggans +toddle +toddled +toddler +toddler's +toddlers +toddles +toddling +toed +toeing +toenail +toenail's +toenails +toffee +toffee's +toffees +toga +toga's +togas +toil +toil's +toiled +toileted +toileting +toiling +toils +tolerable +tolerably +tolerances +tolled +tolling +tolls +tomahawk +tomahawk's +tomahawked +tomahawking +tomahawks +tomato's +tomb +tomb's +tombed +tombing +tomboy +tomboy's +tomboys +tombs +tombstone +tombstone's +tombstones +tomcat +tomcat's +tomcats +tomes +tomorrows +tonal +toned +tong +tongs +tongued +tongues +tonguing +tonic +tonic's +tonics +toning +tonnage +tonnage's +tonnages +tonne +tonnes +tonsil +tonsil's +tonsillitis +tonsillitis's +tonsils +tooled +tooling +toolkit +toot +tooted +toothache +toothache's +toothaches +toothbrush +toothbrush's +toothbrushes +toothpaste +toothpaste's +toothpastes +toothpick +toothpick's +toothpicks +tooting +toots +topaz +topaz's +topazes +topographies +topography +topography's +topology +topology's +topped +topping +topping's +topple +toppled +topples +toppling +torch +torch's +torched +torches +torching +torment +tormented +tormenting +tormentor +tormentor's +tormentors +torments +tornado +tornado's +tornadoes +torpedo +torpedo's +torpedoed +torpedoes +torpedoing +torque +torque's +torrent +torrent's +torrential +torrents +torrid +torrider +torridest +torso +torso's +torsos +tortilla +tortilla's +tortillas +tortoise +tortoise's +tortoises +tortuous +tortured +tortures +torturing +tossed +tosses +tossing +tot +tot's +totalitarian +totalitarianism +totalitarianism's +totalitarians +totalities +totality +totality's +totals +tote +toted +totem +totem's +totems +totes +toting +tots +totted +totter +tottered +tottering +totters +totting +toucan +toucan's +toucans +touchdown +touchdown's +touchdowns +touchier +touchiest +touchings +touchy +toughed +toughen +toughened +toughening +toughens +tougher +toughest +toughing +toughness +toughness's +toughs +toupee +toupee's +toupees +toured +touring +tournament +tournament's +tournaments +tourniquet +tourniquet's +tourniquets +tours +tousle +tousled +tousles +tousling +tout +touted +touting +touts +tow +towed +towel +towel's +towels +towered +towering +towing +townspeople +townspeople's +tows +toxic +toxin +toxin's +toxins +toyed +toying +tract +tract's +traction +traction's +tractor +tractor's +tractors +tracts +trademark +trademark's +trademarked +trademarking +trademarks +trader +trader's +traders +traditionalist +traditionalist's +trafficked +trafficking +traffics +tragedies +tragically +tragics +trailer +trailer's +trailered +trailering +trailers +trainee +trainee's +trainees +trainer +trainer's +trainers +trait +trait's +traitor +traitor's +traitorous +traitors +traits +tramp +tramped +tramping +trample +trampled +tramples +trampling +trampoline +trampoline's +trampolined +trampolines +trampolining +tramps +trance +trance's +trances +tranquil +tranquiler +tranquilest +transact +transacted +transacting +transacts +transatlantic +transcend +transcended +transcending +transcends +transcontinental +transcribe +transcribed +transcribes +transcribing +transcription +transcription's +transcriptions +transcripts +transferable +transformations +transformer +transformer's +transformers +transfusion +transfusion's +transfusions +transgress +transgressed +transgresses +transgressing +transgression +transgression's +transgressions +transients +transistor +transistor's +transistors +transited +transiting +transitional +transitioned +transitioning +transitions +transitive +transitives +transitory +transits +translators +transliteration +translucent +transparencies +transparency +transparency's +transparently +transpire +transpired +transpires +transpiring +transplant +transplanted +transplanting +transplants +transportable +transportation +transportation's +transpose +transposed +transposes +transposing +transverse +transversed +transverses +transversing +trapdoor +trapeze +trapeze's +trapezed +trapezes +trapezing +trapezoid +trapezoid's +trapezoids +trapper +trapper's +trappers +trappings +trashed +trashes +trashier +trashiest +trashing +trashy +trauma +trauma's +traumas +traumatic +traverse +traversed +traverses +traversing +travestied +travesties +travesty +travesty's +travestying +trawl +trawl's +trawled +trawler +trawler's +trawlers +trawling +trawls +trays +treacheries +treacherous +treachery +treachery's +treacle +treacle's +treading +treadmill +treadmill's +treadmills +treads +treason +treason's +treasured +treasurer +treasurer's +treasurers +treasures +treasuries +treasuring +treasury +treasury's +treaties +treatise +treatise's +treatises +treatments +treble +trebled +trebles +trebling +treed +treeing +trekked +trekking +treks +trellis +trellis's +trellised +trellises +trellising +tremble +trembled +trembles +trembling +tremor +tremor's +tremors +trench +trench's +trenched +trenches +trenching +trended +trendier +trendies +trendiest +trending +trepidation +trepidation's +trespass +trespassed +trespasser +trespasser's +trespassers +trespasses +trespassing +trestle +trestle's +trestles +trialled +trialling +triangular +tribal +tribulation +tribulation's +tribulations +tribunal +tribunal's +tribunals +tributaries +tributary +tributary's +tribute +tribute's +tributes +tricked +trickery +trickery's +trickier +trickiest +tricking +trickle +trickled +trickles +trickling +trickster +trickster's +tricksters +tricycle +tricycle's +tricycled +tricycles +tricycling +trifled +trifles +trifling +trigonometry +trigonometry's +trill +trill's +trilled +trilling +trillion +trillion's +trillions +trills +trilogies +trim +trimester +trimester's +trimesters +trimmed +trimmer +trimmest +trimming +trims +trinket +trinket's +trinkets +trio +trio's +trios +tripe +tripe's +tripled +triples +triplet +triplet's +triplets +triplicate +triplicated +triplicates +triplicating +tripling +tripod +tripod's +tripods +tripped +tripping +trite +triter +trites +tritest +triumphant +triumphed +triumphing +triumphs +triviality +triviality's +trod +trodden +trodes +troll +trolled +trolleys +trolling +trolls +trombone +trombone's +trombones +troop's +trooped +trooper +trooper's +troopers +trooping +trophied +trophies +trophy +trophy's +trophying +tropical +tropicals +trot +trots +trotted +trotting +troubled +troublemaker +troublemaker's +troublemakers +troublesome +troubling +trough +trough's +troughs +trounce +trounced +trounces +trouncing +troupe +troupe's +trouped +troupes +trouping +trouser's +trout +trout's +trouts +trowel +trowel's +trowels +truancy +truancy's +truant +truant's +truanted +truanting +truants +truce +truce's +truces +trucked +trucking +trudge +trudged +trudges +trudging +trued +truer +trues +truest +truffle +truffle's +truffles +truing +truism +truism's +truisms +trump +trump's +trumped +trumpeted +trumpeting +trumpets +trumping +trumps +truncation +truncation's +trunked +trunking +trustee +trustee's +trustees +trustful +trustier +trusties +trustiest +trustworthier +trustworthiest +trustworthy +truthful +truthfully +truthfulness +tryings +tryout +tryout's +tryouts +tub +tub's +tuba +tuba's +tubae +tubas +tubed +tuberculosis +tuberculosis's +tubing +tubing's +tubs +tubular +tuck +tucked +tucking +tucks +tuft +tuft's +tufted +tufting +tufts +tug +tugged +tugging +tugs +tuition +tuition's +tulip +tulip's +tulips +tumble +tumbled +tumbler +tumbler's +tumblers +tumbles +tumbling +tummies +tummy +tummy's +tumult +tumult's +tumulted +tumulting +tumults +tumultuous +tuna +tuna's +tunas +tundra +tundra's +tundras +tuneful +tuner +tuner's +tuners +tunic +tunic's +tunics +turban +turban's +turbans +turbine +turbine's +turbines +turbulence +turbulence's +turbulent +tureen +tureen's +tureens +turf +turf's +turfed +turfing +turfs +turgid +turkey +turkey's +turkeys +turmoil +turmoil's +turmoiled +turmoiling +turmoils +turnaround +turnaround's +turner +turner's +turnip +turnip's +turniped +turniping +turnips +turnout +turnout's +turnouts +turnover +turnover's +turnovers +turnpike +turnpike's +turnpikes +turnstile +turnstile's +turnstiles +turntables +turpentine +turpentine's +turquoise +turquoise's +turquoises +turret +turret's +turrets +turtle +turtle's +turtleneck +turtleneck's +turtlenecks +turtles +tusk +tusk's +tusks +tussle +tussled +tussles +tussling +tutored +tutorials +tutoring +tutors +tuxedo +tuxedo's +tuxedos +twang +twang's +twanged +twanging +twangs +tweak +tweaked +tweaking +tweaks +twee +tweed +tweed's +tweet +tweeted +tweeting +tweets +tweezers +twelfth +twelfths +twelves +twenties +twentieths +twiddle +twiddled +twiddles +twiddling +twig +twig's +twigged +twigging +twigs +twilight +twilight's +twine +twine's +twined +twines +twinge +twinge's +twinged +twinges +twinging +twining +twinkle +twinkled +twinkles +twinkling +twinned +twinning +twirl +twirled +twirling +twirls +twister +twister's +twisters +twitch +twitched +twitches +twitching +twitter +twittered +twittering +twitters +twos +tycoon +tycoon's +tycoons +typeface +typeface's +typescript +typescript's +typesetter +typesetter's +typewriters +typhoid +typhoid's +typhoon +typhoon's +typhoons +typhus +typhus's +typified +typifies +typify +typifying +typist +typist's +typists +typographic +typographical +tyrannical +tyrannies +tyranny +tyranny's +tyrant +tyrant's +tyrants +ubiquitous +udder +udder's +udders +uglied +uglier +uglies +ugliest +ugliness +ugliness's +uglying +ulcer +ulcer's +ulcered +ulcering +ulcers +ulterior +ultimated +ultimates +ultimating +ultimatum +ultimatum's +ultimatums +ultra +ultrasonic +ultrasonics +ultraviolet +ultraviolet's +umbrellaed +umbrellaing +umbrellas +umpire +umpire's +umpired +umpires +umpiring +umpteen +unacceptably +unaccepted +unaccountable +unaccountably +unadulterated +unaltered +unambiguously +unanimity +unanimity's +unanimous +unanimously +unanswerable +unanswered +unarmed +unassigned +unassuming +unattached +unattainable +unattractive +unawares +unbearably +unbeatable +unbecoming +unbeliever +unbelievers +unblock +unblocked +unblocking +unblocks +unborn +unbreakable +unbroken +unburden +unburdened +unburdening +unburdens +uncannier +uncanniest +uncanny +unceasing +uncertainties +unchallenged +uncharitable +unchristian +unclean +uncleaner +uncleanest +uncled +uncles +uncling +uncomfortably +uncommoner +uncommonest +uncompromising +unconcerned +unconditional +unconditionally +unconfirmed +unconsciously +unconstitutional +uncontrollable +uncontrolled +uncontroversial +unconventional +unconvinced +uncountable +uncouth +uncover +uncovered +uncovering +uncovers +uncultured +uncut +undamaged +undaunted +undecidable +undecided +undecideds +undemocratic +undeniable +undeniably +underbrush +underbrush's +underbrushed +underbrushes +underbrushing +undercover +undercurrent +undercurrent's +undercurrents +undercut +undercuts +undercutting +underdog +underdog's +underdogs +underestimated +underestimates +underestimating +underflow +underflow's +underfoot +undergarment +undergarment's +undergarments +undergrowth +undergrowth's +underhanded +underlays +undermine +undermined +undermines +undermining +underneaths +undernourished +underpants +underpass +underpass's +underpasses +underprivileged +underrate +underrated +underrates +underrating +underscore +underscored +underscores +underscoring +undershirt +undershirt's +undershirts +underside +underside's +undersides +understandably +understandings +understate +understated +understatement +understatement's +understatements +understates +understating +understudied +understudies +understudy +understudying +undertaker +undertaker's +undertakers +undertaking's +undertakings +undertone +undertone's +undertones +undertow +undertow's +undertows +underwater +underwear +underwear's +underweight +underworld +underworld's +underworlds +underwrite +underwrites +underwriting +underwritten +underwrote +undeserved +undesirables +undetected +undeveloped +undisturbed +undoing's +undoings +undoubted +undress +undressed +undresses +undressing +undue +undying +unearth +unearthed +unearthing +unearthly +unearths +uneasier +uneasiest +uneasily +uneasiness +uneasiness's +uneconomic +uneconomical +uneducated +unemployable +unenlightened +unequal +unequals +unequivocal +unerring +unethical +uneven +unevener +unevenest +unevenly +uneventful +unfailing +unfairer +unfairest +unfairly +unfaithful +unfasten +unfastened +unfastening +unfastens +unfeasible +unfeeling +unfilled +unfit +unfits +unfitted +unfitting +unfold +unfolded +unfolding +unfolds +unforeseen +unforgettable +unforgivable +unfortunates +unfriendlier +unfriendliest +unfunny +unfurl +unfurled +unfurling +unfurls +ungainlier +ungainliest +ungainly +ungodlier +ungodliest +ungodly +ungrammatical +ungrateful +unhappier +unhappiest +unhappily +unhappiness +unhappiness's +unhealthier +unhealthiest +unheard +unhook +unhooked +unhooking +unhooks +unicorn +unicorn's +unicorns +unicycle +unicycle's +unidentified +unification +unification's +uniformed +uniformer +uniformest +uniforming +uniformity +uniformity's +uniforms +unilateral +unilaterally +unimaginative +unimpressed +uninformative +uninformed +uninhibited +uninitiated +uninspired +uninspiring +unintelligent +unintelligible +unintended +unintentional +unintentionally +uninterested +uniqueness +uniquer +uniquest +unison +unison's +unities +universals +universes +unjust +unjustifiable +unjustly +unkempt +unkind +unkinder +unkindest +unkindlier +unkindliest +unkindly +unknowns +unlawful +unleash +unleashed +unleashes +unleashing +unlikelier +unlikeliest +unlikes +unloaded +unloading +unloads +unluckier +unluckiest +unman +unmanned +unmanning +unmans +unmarked +unmarried +unmask +unmasked +unmasking +unmasks +unmistakable +unmistakably +unmitigated +unmodified +unmoved +unnamed +unnerve +unnerved +unnerves +unnerving +unnoticed +unoccupied +unoriginal +unorthodox +unpack +unpacked +unpacking +unpacks +unpaid +unpick +unpleasantly +unpleasantness +unpleasantness's +unpopularity +unpopularity's +unprecedented +unprepared +unprincipled +unprintable +unprivileged +unprotected +unproven +unprovoked +unpublished +unqualified +unquestionable +unquestionably +unravel +unravels +unreal +unreasonably +unrelenting +unreliability +unreliability's +unremarkable +unrepeatable +unrepresentative +unreservedly +unresolved +unrest +unrest's +unrested +unresting +unrestricted +unrests +unruffled +unrulier +unruliest +unruly +unsafer +unsafest +unsaid +unsanitary +unsatisfied +unsay +unsaying +unsays +unscathed +unscheduled +unscientific +unscrew +unscrewed +unscrewing +unscrews +unscrupulous +unseasonable +unseat +unseated +unseating +unseats +unseemlier +unseemliest +unseemly +unsettle +unsettled +unsettles +unsettling +unsightlier +unsightliest +unsightly +unsigned +unskilled +unsolved +unsophisticated +unsounder +unsoundest +unspeakable +unstabler +unstablest +unstructured +unstuck +unsubstantiated +unsuccessfully +unsuited +unsung +unsupportable +untangle +untangled +untangles +untangling +untenable +unthinkable +untidier +untidiest +untie +untied +unties +untiled +untiles +untiling +untiring +untold +untouched +untrained +untruer +untruest +untrustworthy +untying +unveil +unveiled +unveiling +unveils +unwarranted +unwary +unwashed +unwell +unwell's +unwieldier +unwieldiest +unwieldy +unwillingness +unwind +unwinding +unwinds +unwiser +unwisest +unwittingly +unworthy +unwound +unwrap +unwrapped +unwrapping +unwraps +unwritten +upbeat +upbeat's +upbeats +upbringings +upend +upended +upending +upends +upheaval +upheaval's +upheavals +upheld +uphill +uphills +uphold +upholding +upholds +upholster +upholstered +upholsterer +upholsterer's +upholsterers +upholstering +upholsters +upholstery +upholstery's +upkeep +upkeep's +uplift +uplifted +uplifting +uplifts +upload +upped +uppermost +uppers +upping +uprights +uprising +uprising's +uprisings +uproar +uproar's +uproars +uproot +uprooted +uprooting +uproots +upshot +upshot's +upshots +upstanding +upstart +upstart's +upstarted +upstarting +upstarts +upstream +upstreamed +upstreaming +upstreams +uptake +uptake's +uptight +uptown +upturn +upturned +upturning +upturns +upwardly +uranium +uranium's +urbane +urbaner +urbanest +urchin +urchin's +urchins +urinate +urinated +urinates +urinating +urine +urine's +urn +urn's +urned +urning +urns +usages +uselessly +uselessness +uselessness's +usher +usher's +ushered +ushering +ushers +usurp +usurped +usurping +usurps +utensil +utensil's +utensils +uteri +uterus +uterus's +utilitarian +utilitarianism +utilitarianism's +utmost +utterance +utterance's +utterances +uttered +utterer +utterest +uttering +utters +vacancy's +vacant +vacate +vacated +vacates +vacating +vacationed +vacationing +vaccinate +vaccinated +vaccinates +vaccinating +vaccination +vaccination's +vaccinations +vaccine +vaccine's +vaccines +vacillate +vacillated +vacillates +vacillating +vacuous +vacuumed +vacuuming +vacuums +vagabond +vagabond's +vagabonded +vagabonding +vagabonds +vagaries +vagary +vagina +vagina's +vaginae +vaginal +vagrant +vagrant's +vagrants +vagued +vagueing +vagueness +vagueness's +vaguer +vagues +vaguest +vainer +vainest +valentine +valentine's +valentines +valet +valet's +valeted +valeting +valets +valiant +validate +validated +validates +validating +validation +validation's +validly +valise +valise's +valises +valleys +valuables +valueless +valved +valving +vampire +vampire's +vampired +vampires +vampiring +vandal +vandal's +vandals +vane +vane's +vanes +vanguard +vanguard's +vanguards +vanilla +vanilla's +vanillas +vanities +vanity +vanity's +vanned +vanning +vanquish +vanquished +vanquishes +vanquishing +variously +varnish +varnish's +varnished +varnishes +varnishing +varsities +varsity +varsity's +vase +vase's +vases +vaster +vastest +vastness +vastness's +vasts +vats +vatted +vatting +vault +vault's +vaulted +vaulting +vaults +veal +veal's +vealed +vealing +veals +veer +veered +veering +veers +vegetarianism +vegetarianism's +vegetarians +vegetation +vegetation's +vehement +vehemently +veil +veil's +veiled +veiling +veils +veined +veining +veins +velocities +velour's +velvet +velvet's +velveted +velvetier +velvetiest +velveting +velvets +velvety +vendors +veneer +veneer's +veneered +veneering +veneers +venerable +venerate +venerated +venerates +venerating +veneration +veneration's +vengeance +vengeance's +vengeful +venison +venison's +venom +venom's +venomous +vent +vent's +vented +ventilate +ventilated +ventilates +ventilating +ventilation +ventilation's +ventilator +ventilator's +ventilators +venting +ventricle +ventricle's +ventricles +ventriloquist +ventriloquist's +ventriloquists +vents +ventured +ventures +venturing +veracity +veracity's +veranda +veranda's +verandas +verballed +verballing +verbals +verbiage +verbiage's +verbosity +verbosity's +verdicts +verge +verge's +verged +verges +verging +verier +veriest +veritable +vermin +vermin's +vernacular +vernaculars +versatility +versatility's +versed +versing +vertebra +vertebra's +vertebrae +vertebrate +vertebrate's +vertebrates +verticals +vertices's +vertigo +vertigo's +verve +verve's +vessels +vest +vest's +vested +vestibule +vestibule's +vestibules +vestige +vestige's +vestiges +vesting +vestment +vestment's +vestments +vests +veteran +veteran's +veterans +veterinarian +veterinarian's +veterinarians +veterinaries +veterinary +veto +veto's +vetoed +vetoes +vetoing +vets +vetted +vetting +vex +vexation +vexation's +vexations +vexed +vexes +vexing +viability +viability's +viaduct +viaduct's +viaducts +vial +vial's +vials +vibrant +vibrate +vibrated +vibrates +vibrating +vibration +vibration's +vibrations +vicarious +vicariously +vicars +viced +vices +vicing +viciously +victor +victor's +victories +victorious +victors +videoed +videoing +videos +videotape +videotaped +videotapes +videotaping +vie +vied +vies +viewers +vigil +vigil's +vigilance +vigilance's +vigilant +vigilante +vigilante's +vigilantes +vigils +vigorous +viler +vilest +vilified +vilifies +vilify +vilifying +villa +villa's +villager +villager's +villagers +villain +villain's +villainies +villainous +villains +villainy +villainy's +villas +vindicate +vindicated +vindicates +vindicating +vindictive +vine +vine's +vined +vinegar +vinegar's +vines +vineyard +vineyard's +vineyards +vining +vintages +vinyls +viola +viola's +violas +violated +violates +violating +violations +violet +violet's +violets +violins +viper +viper's +vipers +viral +virginity +virginity's +virgins +virile +virility +virility's +virtuoso +virtuoso's +virtuosos +virtuous +virtuously +virulent +visa +visa's +visaed +visaing +visas +vise +vise's +vised +vises +visibility +visibility's +visibly +vising +visionaries +visionary +visioned +visioning +visions +visitation +visitation's +visitations +visor +visor's +visors +vista +vista's +vistaed +vistaing +vistas +visuals +vitality +vitality's +vitally +vitals +vitamin +vitamin's +vitamins +vitriolic +vivacious +vivaciously +vivacity +vivacity's +vivid +vivider +vividest +vividly +vivisection +vivisection's +vocabularies +vocalist +vocalist's +vocalists +vocals +vocation +vocation's +vocational +vocations +vociferous +vociferously +vodka +vodka's +vogue +vogue's +vogued +vogueing +vogues +voguing +voiced +voicing +voided +voiding +voids +volatile +volcanic +volcanics +volcano +volcano's +volcanoes +volition +volition's +volley +volley's +volleyball +volleyball's +volleyballs +volleyed +volleying +volleys +volt +volt's +voltages +volts +volumed +voluming +voluminous +voluntaries +voluptuous +vomited +vomiting +vomits +voodoo +voodoo's +voodooed +voodooing +voodoos +voracious +vortex +vortex's +vortexes +vortices's +voter's +vouched +voucher +voucher's +vouchers +vouches +vouching +vow +vow's +vowed +vowels +vowing +vows +voyage +voyage's +voyaged +voyager +voyager's +voyagers +voyages +voyaging +vulgar +vulgarer +vulgarest +vulgarities +vulgarity +vulgarity's +vulnerabilities +vulnerability +vulture +vulture's +vultures +vying +wad +wad's +wadded +wadding +waddle +waddled +waddles +waddling +wads +wafer +wafer's +wafers +waffled +waffles +waffling +waft +wafted +wafting +wafts +wag +waged +wager +wager's +wagered +wagering +wagers +wagged +wagging +waging +wags +waif +waif's +waifed +waifing +waifs +wail +wailed +wailing +wails +waist +waist's +waisted +waisting +waistline +waistline's +waistlines +waists +waiter +waiter's +waiters +waitress +waitress's +waitresses +waive +waived +waiver +waiver's +waivers +waives +waiving +waken +waken's +wakened +wakening +wakens +walker +walker's +walkers +walkout +walkout's +walkouts +walled +wallets +walling +wallop +walloped +walloping +wallops +wallow +wallowed +wallowing +wallows +wallpaper +wallpaper's +wallpapered +wallpapering +wallpapers +walnut +walnut's +walnuts +walrus +walrus's +walruses +waltz +waltz's +waltzed +waltzes +waltzing +wan +wand +wand's +wanderer +wanderer's +wanderers +wands +wane +waned +wanes +waning +wanna +wanner +wannest +wanton +wantoned +wantoner +wantoning +wantons +warble +warbled +warbles +warbling +warded +warden +warden's +wardened +wardening +wardens +warding +wardrobe +wardrobe's +wardrobes +wards +warehoused +warehouses +warehousing +warfare +warfare's +warhead +warhead's +warheads +warier +wariest +warlike +warmer +warmer's +warmest +warmly +warmth +warmth's +warpath +warpath's +warpaths +warranted +warrantied +warranties +warranting +warrants +warrantying +warred +warren +warren's +warrens +warring +warrior +warrior's +warriors +wart +wart's +warts +wases +washable +washables +washcloth +washcloth's +washcloths +washer +washer's +washered +washering +washers +washout +washout's +washouts +washroom +washroom's +washrooms +wasp +wasp's +wasps +wastage +wastage's +wastebasket +wastebasket's +wastebaskets +wastefully +wasteland +wasteland's +wastelands +watchdog +watchdog's +watchdogs +watchful +watchman +watchman's +watchmen +watchword +watchword's +watchwords +watered +waterfall +waterfall's +waterfalls +waterfront +waterfront's +waterfronts +waterier +wateriest +watering +watering's +waterlogged +watermark +watermark's +watermarked +watermarking +watermarks +watermelon +watermelon's +watermelons +waterproof +waterproofed +waterproofing +waterproofs +watershed +watershed's +watersheds +watertight +waterway +waterway's +waterways +waterworks +waterworks's +watery +watt +watt's +watter +wattest +watts +waveform +waveform's +wavelength +wavelength's +wavelengths +waver +wavered +wavering +wavers +wavier +waviest +wavy +wax +wax's +waxed +waxes +waxier +waxiest +waxing +waxy +waylaid +waylay +waylaying +waylays +wayside +wayside's +waysides +wayward +weaken +weakened +weakening +weakens +weaker +weakest +weaklier +weakliest +weakling +weakling's +weakly +wealthier +wealthiest +wean +weaned +weaning +weans +weaponry +weaponry's +wearied +wearier +wearies +weariest +wearily +weariness +weariness's +wearisome +wearying +weathered +weathering +weathers +weave +weaved +weaver +weaver's +weavers +weaves +weaving +web +web's +webbed +webbing +webs +wedder +weddings +wedge +wedge's +wedged +wedges +wedging +wedlock +wedlock's +weed +weed's +weeded +weedier +weediest +weeding +weeds +weedy +weeing +weekdays +weekended +weekending +weeklies +weep +weeping +weeps +weer +wees +weest +weighed +weighing +weighs +weighted +weightier +weightiest +weighting +weighting's +weights +weighty +weirded +weirder +weirdest +weirding +weirdness +weirdness's +weirdo +weirdo's +weirdos +weirds +weld +welded +welder +welder's +welders +welding +welds +welled +welling +wellington +wells +welt +welt's +welted +welter +weltered +weltering +welters +welting +welts +wept +werewolf +werewolf's +werewolves +wested +westerlies +westerly +westerns +westing +wests +westward +wetter +wettest +whack +whacked +whacking +whacks +whaled +whaler +whaler's +whalers +whaling +wharf +wharf's +wharves +whats +wheat +wheat's +wheedle +wheedled +wheedles +wheedling +wheelbarrow +wheelbarrow's +wheelbarrows +wheelchair +wheelchair's +wheelchairs +wheeled +wheeling +wheeze +wheezed +wheezes +wheezing +whens +whereabouts +wherein +wheres +wherewithal +wherewithal's +whet +whets +whetted +whetting +whew +whewed +whewing +whews +whiff +whiff's +whiffed +whiffing +whiffs +whiled +whiles +whiling +whimmed +whimming +whimper +whimpered +whimpering +whimpers +whims +whimsical +whine +whine's +whined +whines +whining +whinnied +whinnier +whinnies +whinniest +whinny +whinnying +whip +whipped +whipping +whips +whips's +whir +whirl +whirled +whirling +whirlpool +whirlpool's +whirlpools +whirls +whirlwind +whirlwind's +whirlwinds +whirred +whirring +whirs +whisk +whisked +whisker +whisker's +whiskered +whiskers +whisking +whisks +whisper +whispered +whispering +whispers +whistled +whistling +whistling's +whiten +whitened +whitening +whitens +whiter +whitest +whitewash +whitewash's +whitewashed +whitewashes +whitewashing +whittle +whittled +whittles +whittling +whizzed +whizzes +whizzing +whoa +wholehearted +wholes +wholesale +wholesale's +wholesaled +wholesaler +wholesaler's +wholesalers +wholesales +wholesaling +wholesome +whooped +whooping +whopper +whopper's +whoppers +whore +whore's +whores +whys +wick +wick's +wickeder +wickedest +wickedly +wickedness +wickedness's +wicker +wicker's +wickers +wicket +wicket's +wickets +wicks +widen +widened +widening +widens +widow +widow's +widowed +widower +widower's +widowers +widowing +widows +widths +wield +wielded +wielding +wields +wig +wig's +wigged +wigging +wiggle +wiggled +wiggles +wiggling +wigs +wigwam +wigwam's +wigwams +wildcat +wildcats +wildcatted +wildcatting +wilded +wilder +wilderness +wilderness's +wildernesses +wildest +wildfire +wildfire's +wildfires +wilding +wildlife +wildlife's +wildness +wildness's +wilds +wilier +wiliest +willinger +willingest +willingness +willingness's +willow +willow's +willows +willpower +willpower's +wilt +wilted +wilting +wilts +wily +wince +winced +winces +winch +winch's +winched +winches +winching +wincing +windfall +windfall's +windfalls +windier +windiest +windmill +windmill's +windmilled +windmilling +windmills +windowpane +windowpane's +windowpanes +windpipe +windpipe's +windpipes +windscreen +windscreen's +windscreens +windshield +windshield's +windshields +windy +wined +winged +wingers +winging +wining +wink +winked +winking +winks +winnings +winsome +winsomer +winsomest +wintered +wintering +winters +wintertime +wintertime's +wintrier +wintriest +wintry +wiper +wiper's +wipers +wirier +wiriest +wiry +wisecrack +wisecrack's +wisecracked +wisecracking +wisecracks +wiselier +wiseliest +wisely +wises +wishbone +wishbone's +wishbones +wishful +wisp +wisp's +wispier +wispiest +wisps +wispy +wist +wistful +wistfully +witchcraft +witchcraft's +witched +witches +witching +withdrawals +withe +withed +wither +withered +withering +withers +withes +withheld +withhold +withholding +withholds +withing +withs +withstand +withstanding +withstands +withstood +witless +wits +witticism +witticism's +witticisms +wittier +wittiest +witting +wizards +wizened +wobble +wobbled +wobbles +wobblier +wobblies +wobbliest +wobbling +wobbly +woe +woe's +woes +wok +wok's +woks +wolfed +wolfing +wolfs +wolves +wolves's +womanhood +womanhood's +womankind +womankind's +womb +womb's +wombats +wombs +wonderland +wonderland's +wonderlands +woo +woodchuck +woodchuck's +woodchucks +wooded +woodener +woodenest +woodier +woodies +woodiest +wooding +woodland +woodland's +woodlands +woodpecker +woodpecker's +woodpeckers +woodsman +woodsman's +woodsmen +woodwind +woodwinds +woodwork +woodwork's +woody +wooed +woof +woof's +woofed +woofing +woofs +wooing +wool +wool's +woollier +woollies +woolliest +woolly +woos +wordier +wordiest +wordings +wordy +workbench +workbench's +workbenches +workbook +workbook's +workbooks +workforce +workman +workman's +workmanship +workmanship's +workmen +workout +workout's +workouts +workplace +workshops +worldlier +worldliest +worldly +worm's +wormed +wormhole +wormholes +worming +worrisome +worsen +worsened +worsening +worsens +worships +worsted +worsting +worsts +worthier +worthies +worthiest +wost +wot +woulds +wounded +wounder +wounding +wounds +wove +woven +wovens +wowed +wowing +wows +wrangle +wrangled +wrangler +wrangler's +wranglers +wrangles +wrangling +wrapper's +wrappings +wrathed +wrathing +wraths +wreak +wreaked +wreaking +wreaks +wreath +wreath's +wreathe +wreathed +wreathes +wreathing +wreaths +wreckage +wreckage's +wrench +wrench's +wrenched +wrenches +wrenching +wrens +wrest +wrested +wresting +wrestle +wrestled +wrestler +wrestler's +wrestlers +wrestles +wrestling +wrestling's +wrests +wretch +wretch's +wretcheder +wretchedest +wretches +wried +wries +wriggle +wriggled +wriggles +wriggling +wright +wright's +wring +wringer +wringer's +wringers +wringing +wrings +wrinkle +wrinkle's +wrinkled +wrinkles +wrinkling +wrists +wristwatch +wristwatch's +wristwatches +writ +writ's +writable +writhe +writhed +writhes +writhing +writs +wrongdoer +wrongdoer's +wrongdoers +wrongdoing +wrongdoing's +wrongdoings +wronged +wronger +wrongest +wronging +wrought +wrung +wry +wryer +wryest +wrying +xenophobia +xenophobia's +xylophone +xylophone's +xylophones +yacht +yacht's +yachted +yachting +yachts +yak +yak's +yakked +yakking +yaks +yam +yam's +yams +yank +yanked +yanking +yanks +yap +yapped +yapping +yaps +yardstick +yardstick's +yardsticks +yarn +yarn's +yarns +yawned +yawning +yawns +yearlies +yearling +yearling's +yearn +yearned +yearning +yearning's +yearnings +yearns +yeast +yeast's +yeasts +yell +yelled +yelling +yellowed +yellower +yellowest +yellowing +yellows +yells +yelp +yelped +yelping +yelps +yen +yen's +yens +yeses +yessed +yessing +yesterdays +yew +yew's +yews +yielded +yielding +yodel +yodels +yoga +yoga's +yogurt +yogurt's +yogurts +yoke +yoke's +yoked +yokel +yokel's +yokels +yokes +yoking +yolk +yolk's +yolks +yonder +youngster +youngster's +youngsters +yous +youthful +youths +yowl +yowled +yowling +yowls +zanied +zanier +zanies +zaniest +zany +zanying +zeal +zeal's +zealous +zebra +zebra's +zebras +zenith +zenith's +zeniths +zeroed +zeroing +zest +zest's +zests +zeta +zeta's +zigzag +zigzag's +zigzagged +zigzagging +zigzags +zillion +zillion's +zillions +zinc +zinc's +zincked +zincking +zincs +zip +zip's +zipped +zipper +zipper's +zippered +zippering +zippers +zipping +zips +zodiac +zodiac's +zodiacs +zombie +zombie's +zombies +zoned +zoning +zoo +zoo's +zoological +zoologist +zoologist's +zoologists +zoology +zoology's +zoomed +zooming +zooms +zoos +zucchini +zucchini's +zucchinis +clair +clair's +clairs diff --git a/cosmic rage/spell/english-words.40 b/cosmic rage/spell/english-words.40 new file mode 100644 index 0000000..086e006 --- /dev/null +++ b/cosmic rage/spell/english-words.40 @@ -0,0 +1,5909 @@ +abash +abashed +abashes +abashing +abduction +abduction's +abductions +abidings +abolitionist +abolitionist's +abolitionists +aboriginals +abrasively +abruptness +abruptness's +absenteeism +absenteeism's +absently +abstinent +abysmally +acclimation +acclimation's +accreditation +accreditation's +accusingly +acerbic +achier +achiest +achiever +achiever's +achievers +achy +acidic +activation +activation's +activism +activism's +adamantly +adeptly +adequacy +adequacy's +adjectival +adjudicate +adjudicated +adjudicates +adjudicating +adjudicator +adjudicator's +adjudicators +admiringly +adoptive +adrenaline +adrenaline's +advents +advertiser's +advocacy +advocacy's +aerobic +aerobics +aesthetics +aesthetics's +affirmatively +aftershave +aftershaves +aftershock +aftershock's +aftershocks +aggrieve +aggrieved +aggrieves +aggrieving +aha +ahas +airfare +airfares +airily +airings +airless +airspace +airspace's +airwaves +alderman +alderman's +aldermen +alderwoman +alderwomen +alfalfa +alfalfa's +alleviation +alleviation's +aloha +aloha's +alohas +alpine +alpines +alright +altercation +altercation's +altercations +alternations +alumna +alumna's +alumnae +alumni +alumnus +alumnus's +ambassadorial +ambiance +ambiance's +ambiances +ameliorate +ameliorated +ameliorates +ameliorating +amelioration +amelioration's +ammo +ammo's +amnesiac +amnesiac's +amnesiacs +amped +amping +amputee +amputee's +amputees +anachronistic +anagrams +anchorman +anchorman's +anchormen +anchorwoman +anchorwomen +anecdotal +angelically +angling's +anorexia +anorexia's +anorexic +anorexics +antacid +antacid's +antacids +antagonistically +ante's +antebellum +anticlimactic +antihistamine +antihistamine's +antihistamines +antiperspirant +antiperspirant's +antiperspirants +antitrust +antitrust's +anymore +anytime +aperitif +aperitifs +aphrodisiac +aphrodisiac's +aphrodisiacs +apocalypse +apocalypse's +apocalypses +apocalyptic +apolitical +apoplectic +apoplexies +apoplexy +apoplexy's +apostolic +applesauce +applesauce's +apportion +apportioned +apportioning +apportions +appreciatively +apprise +apprised +apprises +apprising +approbation +approbation's +approbations +approvingly +arctic +arctics +armband +armband's +armbands +armful +armful's +armfuls +armhole +armhole's +armholes +arousal +arousal's +arraignment +arraignment's +arraignments +arsonist +arsonist's +arsonists +artsier +artsiest +artsy +artworks +ascendancy +ascendancy's +assemblyman +assemblyman's +assemblymen +assemblywoman +assemblywomen +assertively +assertiveness +assertiveness's +assuredly +asthmatic +asthmatics +astrologer +astrologer's +astrologers +attackers +attainable +attractively +attributions +audiovisual +auspice +auspices +authoritarians +autistic +autistics +autonomously +autoworker +autoworkers +avidly +awakenings +awash +b +baa +baaed +baaing +baas +babysat +babysit +babysits +babysitter +babysitters +babysitting +backbreaking +backdrop +backdrop's +backdrops +backpacker +backpacker's +backpackers +backsides +backstroke +backstroke's +backstroked +backstrokes +backstroking +backup +backup's +backups +backyard +backyard's +backyards +badlands +badmouth +badmouthed +badmouthing +badmouths +bagpipe +bagpipes +bailiff +bailiff's +bailiffs +baleful +balefuller +balefullest +ballistic +ballpark +ballpark's +ballparks +banalities +banality +banality's +bane +bane's +baned +banes +bangle +bangle's +bangles +baning +baptismal +barbarism +barbarism's +barbarisms +barbell +barbell's +barbells +barf +barfed +barfing +barfs +barometric +barrack +barracks +barrio +barrio's +barrios +barroom +barroom's +barrooms +bassist +bassist's +bassists +bate +bated +bates +bathrobe +bathrobe's +bathrobes +bating +battleground +battlegrounds +beatings +bebop +bebop's +bebops +bedpan +bedpan's +bedpans +bedraggle +bedraggled +bedraggles +bedraggling +beeline +beeline's +beelined +beelines +beelining +beep +beep's +beeped +beeper's +beepers +beeping +beeps +beholders +belligerence +belligerence's +bellybutton +bellybutton's +bellybuttons +beltway +beltway's +beltways +benchmark +benchmark's +benchmarks +berate +berated +berates +berating +bestseller +bestsellers +bevel +bevels +bibles +bicep +biceps +biceps's +bidder +bidders +biggie +biggie's +biggies +bigmouth +bigmouth's +bigmouths +bigotries +bigwig +bigwig's +bigwigs +biker +bikers +bilaterally +billionaire +billionaire's +billionaires +billionth +billionths +bimbo +bimbo's +bimbos +bimonthlies +bimonthly +binge +binge's +binged +binges +binging +binocular +binoculars +biopsied +biopsies +biopsy +biopsy's +biopsying +birdbrained +birdseed +birdseed's +birthrate +birthrates +bisection +bisection's +bisections +bitchier +bitchiest +bitchy +biweeklies +biweekly +blabbermouth +blabbermouth's +blabbermouths +blackness +blackness's +blah +blah's +blahed +blahing +blahs +blandly +blankness +blankness's +blastoff +blastoff's +blastoffs +bleacher +bleachers +bleakly +bleakness +bleakness's +blearily +blender +blender's +blenders +bloat +bloated +bloating +bloats +blockages +bloodbath +bloodbaths +bloodless +bloodstain +bloodstain's +bloodstained +bloodstains +bloodstreams +blooper +blooper's +bloopers +blotchier +blotchiest +blotchy +blowup +blowup's +blowups +bluish +blurbs +blurrier +blurriest +blurry +blusher +blusher's +blushers +boardinghouse +boardinghouse's +boardinghouses +boardroom +boardroom's +boardrooms +bodybuilding +bogeyman +bogeyman's +bogeymen +bohemian +bohemians +boilings +bombshell +bombshell's +bombshells +bonanza +bonanza's +bonanzas +bongo +bongo's +bongos +bonkers +boob +boob's +boobed +boobing +boobs +boogie +boogied +boogieing +boogies +bookie +bookie's +bookies +bookmaker +bookmaker's +bookmakers +bookstore's +bookstores +boondocks +bootlegger +bootlegger's +bootleggers +bootstraps +boozed +boozer +boozer's +boozers +boozes +boozing +bopped +bopping +bops +borrower +borrower's +borrowers +bossily +bossiness +bossiness's +bouncer +bouncer's +bouncers +bouncier +bounciest +bouncy +bozo +bozo's +bozos +brainchild +brainchild's +brainchildren +brazenly +breadbasket +breadbasket's +breadbaskets +breakup +breakup's +breakups +breaststroke +breaststroke's +breaststrokes +breathlessly +breathtakingly +brewer +brewer's +brewers +bricklaying +bricklaying's +briefings +broadcaster +broadcaster's +broadcasters +brogue +brogue's +brogues +brokenhearted +brokerage +brokerage's +brokerages +broomstick +broomstick's +broomsticks +brothel +brothel's +brothels +brownish +brownstone +brownstone's +brownstones +browser +browser's +browsers +bucktoothed +buddings +buildup +buildups +bulletproof +bulletproofed +bulletproofing +bulletproofs +bullfighting +bullfighting's +bullish +bullshit +bullshit's +bullshits +bullshitted +bullshitting +bumble +bumbled +bumbles +bumbling +bumblings +bummer's +bummers +buoyantly +burger's +bursars +busboy +busboy's +busboys +businesslike +buster +buster's +busters +busywork +busywork's +butterfingers +butterfingers's +buttock's +buttocked +buttocking +buyout +buyouts +buzzword +buzzwords +bylaw +bylaw's +bylaws +c +cabby's +cachet +cachet's +cacheted +cacheting +cachets +cadaver +cadaver's +cadavers +cadre +cadre's +cadres +cahoot +cahoots +callously +callousness +callousness's +camcorder +camcorders +camellia +camellia's +camellias +cameraman +cameraman's +cameramen +camerawoman +camerawomen +campaigner's +campground +campground's +campgrounds +campsite +campsite's +campsites +candlelight +candlelight's +cannabis +cannabis's +cannabises +cannonball +cannonball's +cannonballed +cannonballing +cannonballs +capitol +capitols +capitulation +capitulation's +capitulations +cappuccino +cappuccino's +cappuccinos +carbonate +carbonated +carbonates +carbonating +cardiology +cardiology's +careen +careened +careening +careens +carjack +carjacked +carjacker +carjackers +carjacking +carjackings +carjacks +carousel +carousel's +carousels +carpeting's +carryout +carryouts +carvings +casework +casework's +caseworker +caseworker's +caseworkers +castigation +castigation's +castration +castration's +castrations +casualness +casualness's +catalyst +catalyst's +catalysts +catamaran +catamaran's +catamarans +caterings +cattier +cattiest +catty +cautionary +caveman +caveman's +cavemen +celluloid +celluloid's +centenaries +centenary +centigrade +ceramics +certifiable +certification +certification's +certifications +cervices +cervix +cervix's +cesarean +cesareans +cesspool +cesspool's +cesspools +chainsawed +chainsawing +chainsaws +chairmanship +chairmanship's +chairwoman +chairwoman's +chairwomen +chalkboard +chalkboard's +chalkboards +changeovers +chaperone's +charade +charade's +charades +charmer +charmer's +charmers +chateaus +chauvinism +chauvinism's +chauvinistic +cheapskate +cheapskate's +cheapskates +cheater +cheater's +cheaters +checklist +checklists +checkmate +checkmate's +checkmated +checkmates +checkmating +checkouts +checkpoints +cheddar +cheekbone +cheekbone's +cheekbones +cheerleader +cheerleader's +cheerleaders +cheerses +cheeseburger +cheeseburger's +cheeseburgers +cheesecake +cheesecake's +cheesecakes +chemotherapy +chemotherapy's +chessboard +chessboard's +chessboards +chickadee +chickadee's +chickadees +chiffon +chiffon's +childbearing +childbearing's +childcare +childishly +childless +childproof +childproofed +childproofing +childproofs +chillings +chino +chinos +chit +chit's +chitchat +chitchat's +chitchats +chitchatted +chitchatting +chits +chive +chives +chlorinate +chlorinated +chlorinates +chlorinating +choppiness +choppiness's +chopstick +chopsticks +choreograph +choreographed +choreographing +choreographs +chump +chump's +chumps +churchgoer +churchgoer's +churchgoers +churlish +chutzpah +chutzpah's +chteau +chteau's +chteaux +cinematographer +cinematographer's +cinematographers +cirrhosis +cirrhosis's +civilly +clampdown +clampdown's +clampdowns +clapboard +clapboard's +clapboarded +clapboarding +clapboards +classically +classier +classiest +classifieds +claustrophobic +cleanings +cleanup +cleanup's +cleanups +clergywoman +clergywomen +cliffhanger +cliffhanger's +cliffhangers +climatic +clinician +clinician's +clinicians +clipper +clippers +clitorises +cloakroom +cloakroom's +cloakrooms +clobber +clobbered +clobbering +clobbers +cloned +cloning +closeout +closeout's +closeouts +clothesline +clothesline's +clotheslined +clotheslines +clotheslining +cloudless +clunk +clunk's +clunked +clunking +clunks +coatings +cobblestone +cobblestone's +cobblestones +cockiness +cockiness's +coed +coed's +coeds +coeducational +coercive +coffeehouse +coffeehouse's +coffeehouses +cogently +cohabit +cohabitation +cohabitation's +cohabited +cohabiting +cohabits +cohesion +cohesion's +cola +cola's +colas +coleslaw +coleslaw's +collectible +collectibles +colloquially +cologne +cologne's +colognes +colonialism +colonialism's +colonist +colonist's +colonists +columnist +columnist's +columnists +comatose +combative +comebacks +comedown +comedown's +comedowns +comeuppance +comeuppance's +comeuppances +comfier +comfiest +comforter +comforter's +comforters +comfy +commemorative +commentate +commentated +commentates +commentating +companionable +compensatory +competitively +competitiveness +competitiveness's +complicity +complicity's +concierge +concierge's +concierges +conciliatory +concretely +condescension +condescension's +conditioner +conditioner's +conditioners +condo +condos +conformist +conformist's +conformists +congenital +congratulatory +congressional +connivance +connivance's +connive +connived +connives +conniving +conscientiously +consecration +consecration's +consecrations +consecutively +conservationist +conservationist's +conservationists +conservatively +conservator +conservator's +conservators +considerately +consortia +conspiratorial +constipate +constipated +constipates +constipating +constructively +consumings +consummation +consummation's +consummations +contentedly +contravened +contravening +contraventions +contrition +contrition's +convivial +cookout +cookout's +cookouts +coolness +coolness's +coordinators +copilot +copilot's +copilots +copter +copter's +copters +copulated +copulates +copulating +cordiality +cordiality's +cornbread +cornerstone +cornerstone's +cornerstones +correctives +corroborations +corrugate +corrugated +corrugates +corrugating +costar +costarred +costarring +costars +counselings +counterfeiter +counterfeiter's +counterfeiters +counterproductive +countrywoman +countrywoman's +countrywomen +coverall +coveralls +coverings +coworker +coworkers +crackdown +crackdown's +crackdowns +craftsmanship +craftsmanship's +crannied +crannies +cranny +cranny's +crannying +crapped +crappie +crappier +crappies +crappiest +crapping +crappy +craps +cravat +cravat's +cravats +cravatted +cravatting +credibly +credo +credo's +credos +crematoria +crematorium +crematorium's +crematoriums +creole +creole's +creoles +crick +crick's +cricked +cricking +cricks +crimp +crimped +crimping +crimps +crinklier +crinklies +crinkliest +crinkly +crispier +crispiest +critter +critter's +critters +croissant +croissant's +croissants +crooner +crooner's +crooners +crosscheck +crosschecked +crosschecking +crosschecks +crossfire +crossfire's +crossfires +crossover +crossover's +crossovers +crosstown +crud +crud's +cruddier +cruddiest +cruddy +crunchier +crunchiest +cryings +cryptically +cuddlier +cuddliest +culpability +culpability's +cupcake +cupcake's +cupcakes +curler +curler's +curlers +curlier +curliest +curseder +cursedest +cursored +cursoring +cursors +curvier +curviest +curvy +cuss +cuss's +cussed +cusses +cussing +custodial +customarily +cutely +cuteness +cuteness's +cutoff +cutoff's +cutoffs +cyberspace +cyclical +cynically +d +damper's +dampers +darkroom +darkroom's +darkrooms +darneder +darnedest +databased +databasing +daydreamer +daydreamer's +daydreamers +dazzlings +deaconess +deaconess's +deaconesses +deadpan +deadpanned +deadpanning +deadpans +deafen +deafened +deafening +deafening's +deafens +dealership +dealership's +dealerships +deathtrap +deathtrap's +deathtraps +debriefings +decaf +decaffeinate +decaffeinated +decaffeinates +decaffeinating +decal +decal's +decals +decathlon +decathlon's +decathlons +deceitfulness +deceitfulness's +deceptively +decor +decors +deductible +deductibles +defeatists +defection +defection's +defections +defector +defector's +defectors +defensively +definitively +deforestation +deforestation's +deformation +deformation's +deformations +defuse +defused +defuses +defusing +degeneration +degeneration's +dehydration +dehydration's +dejectedly +delightfully +delineate +delineated +delineates +delineating +demagogic +demo +demo's +demoed +demographic +demographics +demoing +demonic +demos +denigrated +denigrates +denigrating +denture +dentures +depletion +depletion's +deplorably +deploy +deployed +deploying +deployment +deployment's +deployments +deploys +derbies +derby +derby's +desegregate +desegregated +desegregates +desegregating +deservings +desktops +despondently +detentes +determiner +determiner's +determiners +deterrence +deterrence's +detox +detoxed +detoxes +detoxing +devaluation +devaluation's +devaluations +devalued +devalues +devaluing +deviants +devilish +devotedly +dicey +dichotomies +dichotomy +dichotomy's +dicier +diciest +dick +dick's +dicks +dilapidation +dilapidation's +dipstick +dipstick's +dipsticks +dis +dis's +disaffect +disaffected +disaffecting +disaffects +disappointingly +disapprovingly +disastrously +disavowal +disavowal's +disavowals +disclaimers +discoed +discoing +disconnection +disconnection's +disconnections +discontinuation +discontinuation's +discontinuations +discoverer +discoverer's +discoverers +disenchant +disenchanted +disenchanting +disenchants +disenfranchise +disenfranchised +disenfranchises +disenfranchising +disfigurement +disfigurement's +disfigurements +disgracefully +dishevel +dishevels +dishtowel +dishtowel's +dishtowels +disinterest +disinterest's +disinterests +diskette +diskettes +disorient +disorientation +disorientation's +disoriented +disorienting +disorients +disparates +dispensable +dispirit +dispirited +dispiriting +dispirits +disproportionately +disqualification +disqualification's +disqualifications +disrespectfully +dissed +disses +dissidence +dissidence's +dissing +distastefully +distention +distention's +distentions +distrustfully +diversification +diversification's +divider +divider's +dividers +divinely +docket +docket's +docketed +docketing +dockets +doctorates +doggone +doggoned +doggoner +doggones +doggonest +doggoning +dollhouse +dollhouse's +dollhouses +dollop +dollop's +dolloped +dolloping +dollops +domineer +domineered +domineering +domineers +doodad +doodad's +doodads +doohickey +doohickey's +doohickeys +doomsday +doomsday's +doorbell +doorbell's +doorbells +doorknob +doorknob's +doorknobs +doormat +doormat's +doormats +dork +dorkier +dorkiest +dorks +dorky +dorm +dorm's +dorms +dosage +dosage's +dosages +dossier +dossier's +dossiers +dotings +downer +downer's +downers +download +downloaded +downloading +downloads +downplay +downplayed +downplaying +downplays +downsize +downsized +downsizes +downsizing +downstate +downtime +downtime's +downtrodden +downturn +downturn's +downturns +downwind +drake +drake's +drakes +dramatics's +dreadlocks +drifter +drifter's +drifters +drinkings +drivings +drownings +drowsily +duos +dyke's +dynamism +dynamism's +dysfunction +dysfunction's +dysfunctional +dysfunctions +dyslexic +dyslexics +dtente +e +earlobe +earlobes +earmuff +earmuffs +earphone +earphones +earplug +earplug's +earplugs +earsplitting +earthiness +earthiness's +earthshaking +earwax +earwax's +eastbound +easterner +easterner's +easterners +eastwards +eateries +eaters +eatery +eatery's +eavesdropper +eavesdropper's +eavesdroppers +ebullience +ebullience's +ebullient +edification +edification's +edified +edifies +edify +edifying +educationally +eerily +effervescence +effervescence's +egalitarianism +egalitarianism's +egalitarians +egghead +egghead's +eggheads +eggshell +eggshell's +eggshells +egocentrics +egotistical +egregious +egregiously +elate +elated +elates +elating +elbowroom +elbowroom's +elfin +elitists +elucidated +elucidates +elucidating +emaciate +emaciated +emaciates +emaciating +embarrassingly +embattled +embezzler +embezzler's +embezzlers +emblazon +emblazoned +emblazoning +emblazons +embroil +embroiled +embroiling +embroils +emcee +emcee's +emceed +emceeing +emcees +emeritus +emirate +emirate's +emirates +empowerment +empowerment's +enchilada +enchilada's +enchiladas +enclave +enclave's +enclaves +enforceable +enfranchise +enfranchised +enfranchises +enfranchising +ensconce +ensconced +ensconces +ensconcing +enthuse +enthused +enthuses +enthusing +enticings +entitlement +entitlement's +entitlements +entourage +entourage's +entourages +entrapment +entrapment's +entrepreneur +entrepreneur's +entrepreneurial +entrepreneurs +entryway +entryway's +entryways +environmentalist +environmentalist's +environmentalists +envision +envisioned +envisioning +envisions +epigram +epigram's +epigrams +episodic +epistle +epistle's +epistles +equivalences +eradication +eradication's +erotically +eroticism +eroticism's +erudition +erudition's +es +escalations +escapist +escapists +eschew +eschewed +eschewing +eschews +espouse +espoused +espouses +espousing +espresso +espresso's +espressos +esthetically +estimable +estrange +estranged +estranges +estranging +estuaries +estuary +estuary's +eunuch +eunuch's +eunuchs +euphemistic +euphemistically +euphoria +euphoria's +euphoric +evacuee +evacuee's +evacuees +evenhanded +everyplace +ex +excision +excision's +excisions +excitedly +excruciatingly +exec +exec's +execs +exes +exhaustively +exhibitionism +exhibitionism's +exhibitionist +exhibitionist's +exhibitionists +exhibitor +exhibitor's +exhibitors +exhumation +exhumation's +exhumations +exorcism +exorcism's +exorcisms +exorcist +exorcist's +exorcists +expansionist +expansionist's +expansionists +expectantly +expensively +exploratory +expo +expo's +exportation +exportation's +expos +expropriate +expropriated +expropriates +expropriating +expropriation +expropriation's +expropriations +exquisitely +exterminator +exterminator's +exterminators +extremism +extremism's +extroverted +eyeglass +eyeglasses +eyeliner +eyeliner's +eyeliners +f +facetiously +fag +fag's +fagged +fagging +fags +fairground +fairground's +fairgrounds +falterings +familiarly +famish +famished +famishes +famishing +famously +fanatically +fanaticism +fanaticism's +fannies +fanny +fanny's +farcical +farmhouse +farmhouse's +farmhouses +farmyard +farmyard's +farmyards +farsighted +fart +fart's +farted +farting +farts +fatalism +fatalism's +fattenings +fax +faxed +faxes +faxing +fearlessness +fearlessness's +fecal +federate +federated +federates +federating +feedbag +feedbag's +feedbags +feedings +feistier +feistiest +feisty +fems +fer +fest +fests +fiat +fiat's +fiats +fibrous +fieldwork +fieldwork's +filibuster +filibuster's +filibustered +filibustering +filibusters +filigree +filigree's +filigreed +filigreeing +filigrees +filmmaker +filmmakers +finagle +finagled +finagles +finagling +finder +finder's +finders +firebrand +firebrand's +firebrands +firewall +firewalled +firewalling +firewalls +fishbowl +fishbowl's +fishbowls +fishnet +fishnet's +fishnets +fishtail +fishtail's +fishtailed +fishtailing +fishtails +fizzier +fizziest +fjord +fjord's +fjords +flab +flab's +flabbergast +flabbergasted +flabbergasting +flabbergasts +flaccid +flagging's +flaks +flamenco +flamenco's +flamencos +flamings +flasher's +flashers +flatulence +flatulence's +flextime +floggings +floodgate +floodgate's +floodgates +floodlit +floozies +floozy +floozy's +flophouse +flophouse's +flophouses +flowerbed +flowerbed's +flowerbeds +flowerpot +flowerpot's +flowerpots +flub +flubbed +flubbing +flubs +fluidity +fluidity's +fluoride +fluoride's +fluorides +flyswatter +flyswatters +fogbound +follicle +follicle's +follicles +footbridge +footbridge's +footbridges +footlocker +footlocker's +footlockers +footloose +footsie +footsie's +footsies +foreclose +foreclosed +forecloses +foreclosing +foreclosure +foreclosure's +foreclosures +forehand +forehands +forgivable +forklift +forklift's +forklifts +formaldehyde +formaldehyde's +formidably +fornicate +fornicated +fornicates +fornicating +fourthly +foxhole +foxhole's +foxholes +foxtrot +foxtrot's +foxtrots +foxtrotted +foxtrotting +fractionally +fractious +frankness +frankness's +frat +frat's +frats +freebie +freebie's +freebies +freelanced +freelancer +freelancers +freelances +freelancing +freeload +freeloaded +freeloader +freeloader's +freeloaders +freeloading +freeloads +freethinker +freethinker's +freethinkers +freethinking +freewheel +freewheeled +freewheeling +freewheels +frenetic +fridge +fridge's +fridges +friendless +fries's +frivolously +frizz +frizzed +frizzes +frizzing +fruitcake +fruitcake's +fruitcakes +frumpier +frumpiest +frumpy +fuck +fucked +fucker +fucker's +fuckers +fucking +fucks +fungal +fungals +funk +funk's +funked +funkier +funkiest +funking +funks +funky +futilely +futuristics +g +gabbier +gabbiest +gabby +gaff +gaffe +gaffe's +gaffed +gaffes +gaffing +gaffs +gaggle +gaggles +gallantly +gallbladder +gallbladder's +gallbladders +galosh +galoshes +gangland +gangland's +gapings +gardening's +gargantuan +gassier +gassiest +gassy +gastronomic +gasworks +gasworks's +gatecrasher +gatecrashers +gauche +gaucher +gauchest +gazebo +gazebo's +gazebos +gearshift +gearshift's +gearshifts +geek +geek's +geekier +geekiest +geeks +geeky +geezer +geezer's +geezers +geisha +geisha's +gelled +gelling +gels +genealogist +genealogist's +genealogists +generically +genitalia +genteel +genteeler +genteelest +gentrification +gentrification's +genuflect +genuflected +genuflecting +genuflects +geographer +geographer's +geographers +geologic +geometrically +geriatric +geriatrics +geriatrics's +gerrymander +gerrymandered +gerrymandering +gerrymanders +gerund +gerund's +gerunds +getup +getup's +ghostwriter +ghostwriters +ghoulish +giblet +giblets +gigabyte +gigabytes +gimmicky +giveaway +giveaway's +giveaways +gizmo's +glamorously +gleamings +gleeful +gleefully +glitch +glitches +glitterings +glitz +glitzier +glitziest +glitzy +glob +glob's +globed +globetrotter +globetrotter's +globetrotters +globing +globs +gloomily +gloominess +gloominess's +glowingly +glowworm +glowworm's +glowworms +glumly +gnarlier +gnarliest +gnarly +gnawing's +goalpost +goalposts +gobbledygook +goddamn +godforsaken +gofer +gofer's +gofers +goings +gollies +golly +gorgeously +goshes +gotta +governorship +governorship's +gracefulness +gracefulness's +grad +grad's +grader's +graders +grads +grainier +grainiest +grainy +granddad +granddad's +granddads +grandma +grandma's +grandmas +grandpa +grandpa's +grandparent's +grandpas +granulate +granulated +granulates +granulating +grassland +grassland's +gratis +grayish +greenish +gridlock +gridlocked +gridlocking +gridlocks +gringo +gringo's +gringos +groundhog +groundhogs +groundings +groundlessly +groundswell +groundswells +groupie +groupie's +groupies +grudgings +grunge +grungier +grungiest +grungy +gs +guacamole +guacamole's +guarantied +guaranties +guaranty +guaranty's +guarantying +guardedly +guardrail +guardrail's +guardrails +guesstimate +guesstimate's +guesstimated +guesstimates +guesstimating +guff +guff's +guileless +guitarists +gullibility +gullibility's +gumbo +gumbo's +gumbos +gunboat +gunboat's +gunboats +gunk +gunk's +gunnysack +gunnysack's +gunnysacks +gunpoint +gunpoint's +gunrunner +gunrunner's +gunrunners +gunrunning +gunrunning's +gushier +gushiest +gushy +gusto +gusto's +gutsier +gutsiest +gutsy +guttural +gutturals +guzzler +guzzler's +guzzlers +gyp +gypped +gypping +gyps +gypsies +gypsy +h +haberdasheries +haberdashery +haberdashery's +hairbrush +hairbrush's +hairbrushes +hairnet +hairnet's +hairnets +hairpiece +hairpiece's +hairpieces +hairsplitting +hairsplitting's +hairstyle +hairstyle's +hairstyles +hairstylist +hairstylists +halfhearted +halfheartedly +halftime +halftimes +hallow +hallowed +hallowing +hallows +hallucinate +hallucinated +hallucinates +hallucinating +hallucinogenic +hallucinogenics +haltings +hammerings +handcuffs's +handgun +handgun's +handguns +handlebar's +handpick +handpicked +handpicking +handpicks +handsomely +handstand +handstand's +handstands +handwritten +handyman +handyman's +handymen +hankering's +hankerings +hankie +hankie's +hankies +haphazardly +hardball +hardball's +hardcover +hardcover's +hardcovers +hardheaded +hardhearted +harelip +harelip's +harelips +harmoniously +hashish +hashish's +hatchback +hatchback's +hatchbacks +haunch +haunches +hazelnut +hazelnut's +hazelnuts +hazing's +hazings +headband +headband's +headbands +headgear +headgear's +headhunter +headhunter's +headhunters +headmasters +headmistress +headmistress's +headmistresses +headwind +headwind's +headwinds +healthily +heartland +heartland's +heartlands +heartthrob +heartthrob's +heartthrobs +heartwarming +heck +hedonism +hedonism's +hedonist +hedonist's +hedonistic +hedonists +heiress +heiress's +heiresses +heist +heist's +heisted +heisting +heists +helpfulness +helpfulness's +helplessness +helplessness's +hemline +hemline's +hemlines +hemorrhoid +hemorrhoids +herbal +herbivore +herbivore's +herbivores +hermetic +hermetics +heroically +hertz +hertz's +hesitantly +hickey +hickey's +hickeys +hideout +hideout's +hideouts +hieroglyphics's +highlighter +highlighters +hijacker +hijacker's +hijackers +hijackings +hilariously +hilltop +hilltop's +hilltops +hindquarter +hindquarters +hippo +hippo's +hippos +histrionic +histrionics +histrionics's +hoarsely +hokey +hokier +hokiest +holdings +holdover +holdover's +holdovers +holistic +hologram +hologram's +holograms +homecoming +homecoming's +homecomings +homelessness +homelessness's +homemaker +homemaker's +homemakers +homeowner +homeowners +homer +homer's +homered +homering +homeroom +homeroom's +homerooms +homers +hometown +hometown's +hometowns +homogeneity +homogeneity's +honcho +honchos +hooker +hooker's +hookers +hookey's +hookier +hookiest +hooligan +hooligan's +hooligans +hopefulness +hopefulness's +hopelessness +hopelessness's +hospice +hospice's +hospices +hostilities +hotcake +hotcakes +hotshot +hotshots +housebound +housebreak +housebreaking +housebreaks +housebroke +housebroken +househusband +househusbands +housekeeping +housekeeping's +housewares +howdied +howdies +howdy +howdying +hubcap +hubcap's +hubcaps +huhs +humanists +humanitarianism +humanitarianism's +humankind +humankind's +humblings +hunker +hunkered +hunkering +hunkers +hurdler +hurdler's +hurdlers +hygienically +hype +hype's +hyped +hyper +hyperactive +hyperactives +hyperactivity +hyperactivity's +hypersensitive +hyperventilate +hyperventilated +hyperventilates +hyperventilating +hypes +hyping +hypocritically +hypodermic +hypodermics +hypothermia +hypothermia's +hypothetically +hysterectomies +hysterectomy +hysterectomy's +i +icebox +icebox's +iceboxes +ickier +ickiest +icky +idealism +idealism's +idiotically +idleness +idleness's +idolatrous +idolatry +idolatry's +iffier +iffiest +iffy +illegitimacy +illegitimacy's +illogically +imaginatively +imbalanced +imbibe +imbibed +imbibes +imbibing +imbue +imbued +imbues +imbuing +immediacy +immediacy's +immobility +immobility's +immorally +immutable +impeachment +impeachment's +impeachments +impeccably +imperialists +impersonator +impersonator's +impersonators +implode +imploded +implodes +imploding +impolitely +importer +importer's +importers +impressionistic +impulsiveness +impulsiveness's +inaccessibility +inaccessibility's +inattention +inattention's +inattentive +inaudibly +incineration +incineration's +incompetently +incompletely +inconclusively +inconsistently +inconspicuously +incontinence +incontinence's +incontinent +increasings +incrimination +incrimination's +incurably +indebtedness +indebtedness's +indecently +indecisively +indefinably +indemnified +indemnifies +indemnify +indemnifying +indemnities +indemnity +indemnity's +indescribably +indifferently +indigent +indigents +indirectness +indirectness's +indistinctly +individualistic +inebriate +inebriated +inebriates +inebriating +inebriation +inebriation's +ineffectiveness +ineffectiveness's +ineligibility +ineligibility's +inequities +inequity +inequity's +inessential +inessentials +inevitability +inevitability's +inexpensively +infallibility +infallibility's +infatuate +infatuated +infatuates +infatuating +infertility +infertility's +infielder +infielder's +infielders +infiltrator +infiltrator's +infiltrators +inflatables +inflexibility +inflexibility's +inflexibly +infliction +infliction's +infomercial +infomercials +infrastructures +infuriatingly +inhalation +inhalation's +inhalations +innovate +innovated +innovates +innovating +innovator +innovator's +innovators +inordinately +inorganic +inpatient +inpatient's +inpatients +inroad +inroads +insemination +insemination's +insensitively +insignificantly +insistently +insomniac +insomniacs +inspirational +instinctively +instructively +insufficiency +insufficiency's +insularity +insularity's +insureds +insurgencies +insurgency +insurgency's +intendeds +intensifier +intensifier's +intensifiers +intensively +intently +interchangeably +interconnected +interconnecting +interconnects +internist +internist's +internists +internment +internment's +internship +internship's +internships +interpersonal +interrelate +interrelated +interrelates +interrelating +intestate +intransitively +intricately +introverted +invasive +investigative +irrationality +irrationality's +irregularly +irreparably +irresistibly +irresponsibly +irreverently +itchiness +itchiness's +j +jackhammer +jackhammer's +jackhammered +jackhammering +jackhammers +jazzier +jazziest +jazzy +jeez +jerkily +jigger +jigger's +jiggered +jiggering +jiggers +jive +jive's +jived +jives +jiving +jobless +joblessness +joblessness's +jock +jock's +jocked +jocking +jocks +jockstrap +jockstrap's +jockstraps +jocularity +jocularity's +john +john's +johns +jowl +jowls +joyfulness +joyfulness's +joyridden +joyride +joyride's +joyrider +joyriders +joyrides +joyriding +joyrode +joysticks +jukebox +jukebox's +jukeboxes +jumpsuit +jumpsuits +junkyard +junkyard's +junkyards +k +kW +kaput +kaput's +karma +karma's +keenness +keenness's +kiddie +kiddied +kiddies +kiddo +kiddo's +kiddos +kiddying +kidnappings +kindergrtner +kindergrtner's +kindergrtners +kindhearted +kingpin +kingpin's +kingpins +kleptomaniac +kleptomaniac's +kleptomaniacs +klutz +klutz's +klutzes +klutzier +klutziest +klutzy +knickknack +knickknack's +knickknacks +knobbier +knobbiest +knobby +knowledgeably +ks +l +laminate +laminated +laminates +laminating +lampshade +lampshade's +lampshades +landfill +landfills +landowner's +laptop +laptops +lasso +lasso's +lassoed +lassoing +lassos +lawlessness +lawlessness's +layaway +layoff +layoff's +layoffs +layover +layover's +layovers +lazily +leakier +leakiest +leanings +lecherous +leftover +leftovers +leggier +leggiest +leggy +legit +lender +lender's +lenders +leniently +leprous +lesbianism +lesbianism's +let's +lethally +levelheaded +levitate +levitated +levitates +levitating +levitation +levitation's +liaise +liaised +liaises +liaising +lib +lib's +libbed +libbing +libido +libido's +libidos +libs +licking's +lickings +lien +lien's +liens +lifesaver +lifesaver's +lifesavers +liftoff +liftoff's +liftoffs +lighthearted +limboed +limboing +limbos +limitings +limo +limos +linens +lineup +lineups +linkages +listlessly +lite +lites +litigate +litigated +litigates +litigating +logbook +logbook's +logbooks +logistical +logistics +logjam +logjam's +logjams +logos +loner +loner's +loners +longingly +longtime +lookalike +lookalikes +looter +looter's +looters +loudmouth +loudmouth's +loudmouthed +loudmouths +lovesick +lowbrow +lowbrow's +lowbrows +lowercase +loyally +ls +lucidity +lucidity's +lucidly +lugubrious +lumbering's +lumberyard +lumberyard's +lumberyards +lunchbox +lunchboxes +lunchtimes +luridly +luxuriously +lynching's +lynchings +lyricist +lyricist's +lyricists +macro +macro's +macrocosm +macrocosm's +macrocosms +macros +maddeningly +magnification +magnification's +magnifications +magnificently +mailings +mainstreamed +mainstreaming +mainstreams +majorly +malaise +malaise's +malfunctioned +malfunctioning +malfunctions +malnourished +mandarin +mandarin's +mandarins +manhunt +manhunt's +manhunts +manics +manipulative +manipulative's +mantra +mantra's +mantras +marginals +marinade +marinade's +marinaded +marinades +marinading +markdown +markdown's +markdowns +marketability +marketability's +marketer +marketer's +marketers +markup +markup's +markups +marrieds +masculinity +masculinity's +masochism +masochism's +masochistic +masseur +masseur's +masseurs +masseuse +masseuse's +masseuses +masturbate +masturbated +masturbates +masturbating +matchbox +matchbox's +matchboxes +matchmaking +matchmaking's +matchstick +matchstick's +matchsticks +matriarchies +matriarchy +matriarchy's +matte's +mawkish +maxed +maxes +maxing +mayday +maydays +mayo +mealtime +mealtime's +mealtimes +meaningfully +meatball +meatball's +meatballs +meatier +meatiest +meatloaf +meatloaves +meaty +mecca +meccas +medians +meetinghouse +meetinghouses +meg +meg's +megalomania +megalomania's +megalomaniacs +megs +meld +melded +melding +melds +meltdown +meltdowns +memorabilia +meningitis +meningitis's +menorah +menorah's +menorahs +metallurgist +metallurgists +meteorological +methadone +methadone's +methane +methane's +methodically +methodological +methodologies +meticulously +mi +mi's +microchip +microchips +microcosm +microcosm's +microcosms +microprocessors +midair +midair's +midterm +midterm's +midterms +midweek +midweek's +midweeks +midwinter +midwinter's +miff +miffed +miffing +miffs +mildness +mildness's +milieu +milieu's +milieus +militarism +militarism's +millennium +millennium's +millenniums +minefields +mini +minis +miniseries +miniskirt +miniskirt's +miniskirts +minivan +minivans +mintier +mintiest +minty +miscalculate +miscalculated +miscalculates +miscalculating +miscalculation +miscalculation's +miscalculations +mischievously +misgiving's +misinterpretations +mismanage +mismanaged +mismanages +mismanaging +misogynist +misogynist's +misogynists +misogyny +misogyny's +mispronounce +mispronounced +mispronounces +mispronouncing +mispronunciation +mispronunciation's +mispronunciations +misreadings +misspend +misspending +misspends +misspent +misstep +misstep's +misstepped +misstepping +missteps +mister +mister's +misters +mistreat +mistreated +mistreating +mistreatment +mistreatment's +mistreats +mistrial +mistrial's +mistrials +mitigation +mitigation's +modals +modem +modem's +modems +molestation +molestation's +molester +molester's +molesters +momma +mommas +mommies +mommy +mommy's +moniker +moniker's +monikers +mono +monochromes +monolingual +monolinguals +monolith +monolith's +monoliths +mononucleosis +mononucleosis's +monotone +monotone's +monotoned +monotones +monotoning +monotonously +montage +montage's +montages +mooch +mooched +mooches +mooching +moodiness +moodiness's +moonlighting's +moonlit +mopeds +moralistic +mores +mortarboard +mortarboard's +mortarboards +mortician +mortician's +morticians +moses +mossed +mossing +motherboard +motherboards +motherfucker +motherfucker's +motherfuckers +motorbiked +motorbiking +motorboat +motorboat's +motorboats +motorcyclist +motorcyclist's +motorcyclists +motormouth +motormouths +mottle +mottled +mottles +mottling +mountaineering's +mountainside +mountainside's +mountainsides +mountings +mournfully +mouthwash +mouthwash's +mouthwashes +mudslide +mudslides +mudslinging +mudslinging's +muggings +mulatto +mulatto's +mulattoes +multicultural +multilateral +multimedia +multimillionaire +multimillionaire's +multimillionaires +multiplex +multiplex's +multiplexed +multiplexes +multiplexing +munchies +munition +munitions +musings +mutability +mutability's +mutable +mystique +mystique's +mle +mle's +mles +n +nailbrush +nailbrush's +nailbrushes +nannied +nannies +nanny +nanny's +nannying +nappier +nappiest +narc +narced +narcing +narcissism +narcissism's +narcissist +narcissist's +narcissistic +narcissists +narcs +nasally +navigational +negs +nerd +nerdier +nerdiest +nerds +nerdy +neurological +newlywed +newlywed's +newlyweds +newness +newness's +newsworthier +newsworthiest +newsworthy +nigger +nigger's +niggers +niggle +niggled +niggles +niggling +nigglings +nightie +nightie's +nighties +nightlife +nightlife's +noncommittally +nondairy +nondenominational +nonevent +nonevent's +nonevents +nonexistent +nonfat +nonintervention +nonintervention's +nonplus +nonpluses +nonplussed +nonplussing +nonproliferation +nonproliferation's +nonrefundable +nonrenewable +nonsmoker +nonsmoker's +nonsmokers +nonsmoking +nonstick +nonverbal +nonviolent +nope +nopes +normalcy +normalcy's +northbound +northeastward +northerner +northerners +northernmost +northwesterly +northwestward +nosedive +nosedived +nosedives +nosediving +nostalgically +nudist +nudist's +nudists +nuke +nuke's +nuked +nukes +nuking +nylons +nymphomania +nymphomania's +nymphomaniac +nymphomaniacs +o +oat +oat's +oats +objector's +obligingly +obnoxiously +obsessively +obsessives +obstinately +obstructives +occult +oddness +oddness's +odyssey +odysseys +offensively +oilfield +oilfield's +oilfields +oink +oinked +oinking +oinks +oldie +oldie's +oldies +ombudsman +ombudsman's +ombudsmen +omniscience +omniscience's +onetime +ongoings +oops +oopses +operable +operationally +opportunism +opportunism's +opportunistic +optimistically +optometry +optometry's +opulence +opulence's +orally +ordinal +ordinals +organically +orgasms +orientals +oriole +oriole's +orioles +orthodontics +orthodontics's +orthodoxies +orthodoxy +orthodoxy's +ostentatiously +ostracism +ostracism's +outage +outage's +outages +outback +outback's +outbacks +outbid +outbidding +outbids +outcrop +outcropped +outcropping +outcroppings +outcrops +outfielder +outfielder's +outfielders +outperform +outperformed +outperforming +outperforms +outplacement +outpouring +outpouring's +outpourings +outreach +outreached +outreaches +outreaching +outsource +outsourced +outsources +outsourcing +outspokenness +outspokenness's +outstretch +outstretched +outstretches +outstretching +ovarian +overcompensate +overcompensated +overcompensates +overcompensating +overcompensation +overcompensation's +overextend +overextended +overextending +overextends +overjoy +overjoyed +overjoying +overjoys +overpopulate +overpopulated +overpopulates +overpopulating +oversimplifications +oversimplified +oversimplifies +oversimplify +oversimplifying +overtone's +overviews +ow +p +pacesetter +pacesetter's +pacesetters +padre +padre's +padres +pager's +pagers +painkiller +painkiller's +painkillers +painstakingly +paintbrush +paintbrush's +paintbrushes +painters +panache +panache's +panelist +panelist's +panelists +pantheism +pantheism's +pantyhose +paperboy +paperboy's +paperboys +papergirl +papergirl's +papergirls +paradigms +paralegal +paralegals +paramedic +paramedic's +paramedics +paramilitaries +paramilitary +parquet +parquet's +parqueted +parqueting +parquets +partway +passerby +passersby +patchier +patchiest +paternalistic +pathologically +patriarchies +patriarchy +patriarchy's +patricide +patricide's +patricides +patriotically +patrolman +patrolman's +patrolmen +patrolwoman +patrolwomen +paycheck +paycheck's +paychecks +payday +payday's +paydays +payee +payee's +payees +payloads +peaceably +peacefulness +peacekeeping +peacetime +peacetime's +pedagogical +pedantically +pedigreed +pee +peed +peeing +peekaboo +peekaboo's +peephole +peephole's +peepholes +pees +pejorative +pejoratives +penchants +pepperoni +pepperonis +peppier +peppiest +peppy +percentile +percentile's +percentiles +perceptibly +perceptively +perm +perm's +permed +perming +perms +perquisite +perquisite's +perquisites +personae +persuasiveness +persuasiveness's +perversely +perversity +perversity's +pessimistically +phalli +phallic +phallus +phallus's +pharmacologist +pharmacologist's +pharmacologists +pharmacology +pharmacology's +philistine +philistines +philosophically +phobic +phobics +phoenixes +phonetically +phooey +phooeys +phosphate +phosphate's +phosphates +phrasings +physiotherapy +physiotherapy's +picker +picker's +pickers +pidgin +pidgin's +pidgins +piercings +piggier +piggies +piggiest +piggy +piggy's +piglet +piglet's +piglets +pigmentation +pigmentation's +pigsties +pigsty +pigsty's +pileup +pileup's +pileups +pilings +pimp +pimp's +pimped +pimping +pimps +pincer +pincers +ping +ping's +pinged +pinging +pings +pinkie +pinkie's +pinkies +pinprick +pinprick's +pinpricked +pinpricking +pinpricks +pinstripe +pinstripe's +pinstripes +pinup +pinup's +pinups +piously +pipsqueak +pipsqueak's +pipsqueaks +piquancy +piquancy's +piquant +piss +pissed +pisses +pissing +pixel +pixel's +pixels +pj's +placebo +placebo's +placebos +plainclothes +plannings +plantings +plateful +platefuls +plating's +platonic +playboy +playboy's +playboys +playoff +playoffs +playroom +playroom's +playrooms +plenaries +plenary +ploddings +pluckier +pluckiest +plunk +plunked +plunking +plunks +pluralities +plutocracies +plutocracy +plutocracy's +pocketful +pocketful's +pocketfuls +pocketknife +pocketknife's +pocketknives +podiatrist +podiatrist's +podiatrists +podiatry +podiatry's +poetically +pogrom +pogrom's +pogromed +pogroming +pogroms +poignantly +pointier +pointiest +pointlessness +pointlessness's +pointy +poisonings +polarities +polemical +polyester +polyester's +polyesters +polygamist +polygamist's +polygamists +polygraph +polygraph's +polygraphed +polygraphing +polygraphs +polymer +polymer's +polymers +polytechnics +pompom +pompom's +pompoms +pomposity +pomposity's +pontiff +pontiff's +pontiffs +pontifical +ponytail +ponytail's +ponytails +pooch +pooch's +pooched +pooches +pooching +porn +pornographer +pornographer's +pornographers +posh +poshed +posher +poshes +poshest +poshing +posse +posse's +posses +postdate +postdated +postdates +postdating +postdoc +postdocs +postdoctoral +postmortem +postmortems +postwar +potbellied +potbellies +potbelly +potbelly's +potluck +potluck's +potlucks +potpourri +potpourri's +potpourris +pottier +potties +pottiest +potty +powerboat +powerboat's +powerboats +powerlessness +powerlessness's +pragmatist +pragmatist's +pragmatists +prankster +prankster's +pranksters +precept +precept's +precepts +precondition +precondition's +preconditioned +preconditioning +preconditions +predate +predated +predates +predating +predestine +predestined +predestines +predestining +predetermine +predetermined +predetermines +predetermining +predilection +predilection's +predilections +predispose +predisposed +predisposes +predisposing +preemptive +preexist +preexisted +preexisting +preexists +prefabricate +prefabricated +prefabricates +prefabricating +prehistory +prehistory's +prejudge +prejudged +prejudges +prejudging +premarital +premeditate +premeditated +premeditates +premeditating +preoccupation +preoccupation's +preoccupations +prep +prep's +preparedness +preparedness's +prepped +preppier +preppies +preppiest +prepping +preppy +preps +preregister +preregistered +preregistering +preregisters +preregistration +preregistration's +presage +presage's +presaged +presages +presaging +preschool +preschooler +preschoolers +preschools +prescriptive +presupposition +presuppositions +prettily +prewar +pricey +pricier +priciest +primacy +primacy's +primordial +primordials +princelier +princeliest +princely +prissier +prissies +prissiest +prissy +pristine +problematics +procreate +procreated +procreates +procreating +prof +prof's +professionalism +professionalism's +profitability +profitability's +profitably +profs +promo +promos +promoter +promoter's +promoters +promotional +promptings +pronto +propitious +prosaic +proscribe +proscribed +proscribes +proscribing +proscription +proscription's +proscriptions +prostheses +prosthesis +prosthesis's +protagonist's +protester +protester's +protesters +protraction +protraction's +provident +provost +provost's +provosts +prudently +prurience +prurience's +prurient +psycho +psycho's +psychopathic +psychopathics +psychos +psychosomatic +psychosomatics +psychotherapist +psychotherapist's +psychotherapists +psychotics +pubbed +pubbing +pubescence +pubic +publicist +publicist's +publicists +pubs +puerile +pullout +pullouts +puppeteer +puppeteer's +puppeteers +purchaser's +purgatories +purist +purist's +purists +puritan +puritan's +puritans +purposely +purser +purser's +pursers +purvey +purveyed +purveying +purveyors +purveys +pussycat +pussycats +pussyfoot +pussyfooted +pussyfooting +pussyfoots +pygmies +pygmy +pygmy's +pylon +pylon's +pylons +q +quad +quad's +quads +quantified +quantifiers +quantifies +quantifying +quarks +quarterfinal +quarterfinal's +quarterfinals +queasiness +queasiness's +quiches +quickie +quickie's +quickies +quietness +quietness's +quintessential +quirkier +quirkiest +quixotic +quotable +r +radiologist +radiologist's +radiologists +radiology +radiology's +radiotherapy +radiotherapy's +radon +radon's +ragtag +ragtag's +ragtags +ramblings +rambunctious +rankings +rapprochement +rapprochement's +rapprochements +raspier +raspiest +raspy +raunchier +raunchiest +raunchy +razz +razzed +razzes +razzing +readerships +readjustment +readjustment's +readjustments +reappearance +reappearance's +reappearances +rearrangement's +reasonableness +reasonableness's +reassuringly +recalcitrance +recalcitrance's +receivership +receivership's +reckonings +reconstitute +reconstituted +reconstitutes +reconstituting +recruiter +recruiter's +recruiters +recyclable +recyclables +reddish +redevelop +redeveloped +redeveloping +redevelopment +redevelopment's +redevelopments +redevelops +redneck +redneck's +rednecks +redness +redness's +redouble +redoubled +redoubles +redoubling +redskin +redskin's +redskins +redwood +redwood's +redwoods +reeducate +reeducated +reeducates +reeducating +reeducation +reeducation's +reelection +reelection's +reelections +reenact +reenacted +reenacting +reenactment +reenactment's +reenactments +reenacts +reentries +reentry +reentry's +ref +ref's +reffed +reffing +refinance +refinanced +refinances +refinancing +refinish +refinished +refinishes +refinishing +refreshingly +refs +refundable +refurbishments +reggae +reggae's +regionally +regretfully +regroup +regrouped +regrouping +regroups +regurgitation +regurgitation's +rehab +rehabbed +rehabbing +rehabs +reinvent +reinvented +reinventing +reinvents +reissue +reissued +reissues +reissuing +rejoicings +rekindle +rekindled +rekindles +rekindling +remake's +remarriage +remarriage's +remarriages +remarried +remarries +remarry +remarrying +remoteness +remoteness's +remover +remover's +removers +renderings +renter +renter's +renters +rep +rep's +repatriation +rephrased +rephrases +rephrasing +replaceable +replayed +replaying +replays +replenishment +replications +repossess +repossessed +repossesses +repossessing +reprint's +reprise +reprise's +reprises +reprising +reps +reptilian +reptilians +requiems +reran +rerun +rerunning +reruns +resales +reshuffled +reshuffles +reshuffling +residencies +residency +residency's +resonate +resonated +resonates +resonating +resoundingly +responsiveness +responsiveness's +restate +restated +restatement +restatement's +restatements +restates +restating +restructurings +resurgent +retake +retaken +retakes +retaking +retardation +retardation's +rethinking +rethinks +rethought +retinue +retinue's +retinues +retiree +retiree's +retirees +retook +retractable +retread +retreaded +retreading +retreads +retrial +retrial's +retrials +retroactively +retrod +retrodden +revaluation +revaluation's +revaluations +revalue +revalued +revalues +revaluing +revealings +rewinding +rewinds +reworked +reworking +reworks +rewound +rhetorically +rhinestone +rhinestone's +rhinestones +rhythmically +ribald +rigmarole +rigmarole's +rigmaroles +ringside +ringside's +ritually +ritzier +ritziest +ritzy +riverbed +riverbeds +riverfront +riverfronts +riverside +riversides +roadhouse +roadhouse's +roadhouses +roadkill +roadrunner +roadrunner's +roadrunners +roadway +roadway's +roadways +roadworthy +robotics +rollerskating +rollick +rollicked +rollicking +rollicks +rooftop +rooftops +roomful +roomful's +roomfuls +rootless +roughshod +roundup +roundup's +roundups +rove +roved +roves +roving +roving's +rs +rubberier +rubberiest +rubberneck +rubberneck's +rubbernecked +rubbernecking +rubbernecks +rubbery +rubdown +rubdown's +rubdowns +rubella +rubella's +rudiment +rudiments +runaround +runarounds +rustproof +rustproofed +rustproofing +rustproofs +s +sabbaticals +saccharin +saccharin's +sacrosanct +sadistically +sailboard +sailboarded +sailboarding +sailboards +salesclerk +salesclerk's +salesclerks +salmonella +salmonella's +salmonellae +salsa +salsas +saltwater +sandblast +sandblast's +sandblasted +sandblasting +sandblasts +sandcastle +sandcastles +sardonic +sass +sass's +sassed +sasses +sassing +satanism +satiny +satirically +savers +sax +sax's +saxes +scad +scads +scaldings +scalper +scalper's +scalpers +scam +scammed +scamming +scams +scavenge +scavenged +scavenges +scavenging +schism +schism's +schisms +schizophrenics +schlep +schlepped +schlepping +schleps +schlock +schlock's +schlockier +schlockiest +schlocky +schmaltz +schmaltz's +schmaltzier +schmaltziest +schmaltzy +schmooze +schmoozed +schmoozes +schmoozing +schmuck +schmuck's +schmucks +schoolchild's +schoolgirl +schoolgirl's +schoolgirls +scintillate +scintillated +scintillates +scintillating +scoldings +scoreboard +scoreboard's +scoreboards +scorecard +scorecard's +scorecards +scornfully +scotched +scotches +scotching +scrabbled +scrabbles +scrabbling +scragglier +scraggliest +scraggly +scrappier +scrappiest +scrappy +screenplay +screenplay's +screenplays +screwball +screwball's +screwballs +scrimp +scrimped +scrimping +scrimps +scrooge +scrooges +seamless +secondhand +secretively +secs +sedation +sedation's +seedless +seethings +selfishly +selfless +sellout +sellout's +sellouts +semifinalist +semifinalist's +semifinalists +seminal +semiprecious +senatorial +sensationally +sensitively +separable +sequoia +sequoia's +sequoias +serenely +serrated +servicewoman +servicewomen +servings +setup +setup's +setups +seventieth +seventieths +sexier +sexiest +sexists +sh +shadings +shakedown +shakedowns +shakeup +shakeups +shakily +shallowness +shallowness's +shamelessly +shantytown +shantytown's +shantytowns +shareholder's +she's +shelving's +shenanigan +shenanigans +shinnied +shinnies +shinny +shinny's +shinnying +shipload +shipload's +shiploads +shipyard +shipyard's +shipyards +shirtsleeve +shirtsleeve's +shirtsleeves +shit +shits +shittier +shittiest +shitting +shitty +shoddily +shootings +shoplift +shoplifted +shoplifting +shoplifting's +shoplifts +shortchange +shortchanged +shortchanges +shortchanging +shortcut +shortcut's +shortcuts +shortcutting +shortfalls +shortsighted +shortwave +shortwave's +shortwaves +showbiz +showmanship +showmanship's +showpiece +showpiece's +showpieces +showroom +showroom's +showrooms +shrewdly +shuckses +shush +shushed +shushes +shushing +shutdowns +shuteye +shuteye's +shyly +shyster +shyster's +shysters +sideburns +sidekick +sidekick's +sidekicks +sightings +sightread +sightseeing +sightseer +sightseers +signatories +signatory +signatory's +signings +silencer +silencer's +silencers +silkier +silkies +silkiest +silky +simper +simpered +simpering +simpers +simplifications +simulators +singsong +singsong's +singsonged +singsonging +singsongs +sitcom +sitcom's +sitcoms +sittings +skateboarder +skateboarders +skeptically +skier +skiers +skillfully +skinhead +skinhead's +skinheads +skintight +skullcap +skullcap's +skullcaps +skydive +skydived +skydiver +skydiver's +skydivers +skydives +skydiving +skydiving's +slacker's +slackers +slalom +slalom's +slalomed +slaloming +slaloms +slapdash +slapdashes +slather +slather's +slathered +slathering +slathers +slaughterhouse +slaughterhouse's +slaughterhouses +slayings +sledgehammered +sledgehammering +sledgehammers +sleepily +sleeplessness +sleeplessness's +sleepwalk +sleepwalked +sleepwalking +sleepwalks +sleepyhead +sleepyhead's +sleepyheads +sleuth +sleuth's +sleuths +sloppily +slowdown +slowdown's +slowdowns +slowpoke +slowpoke's +slowpokes +slurp +slurped +slurping +slurps +slushier +slushiest +slushy +slyly +smoggier +smoggiest +smoggy +smooch +smooched +smooches +smooching +smugness +smugness's +smuttier +smuttiest +smutty +smrgsbord +smrgsbord's +smrgsbords +snafu +snafu's +snafus +snazzier +snazziest +snazzy +sniffles's +snit +snit's +snits +snobbier +snobbiest +snobby +snottier +snottiest +snotty +snowboard +snowboarded +snowboarding +snowboards +snowbound +snowman +snowman's +snowmen +snowmobile +snowmobile's +snowmobiled +snowmobiles +snowmobiling +soakings +socialite +socialite's +socialites +socioeconomic +sociopath +sociopath's +sociopaths +softhearted +softies +softy +softy's +soliloquies +soliloquy +soliloquy's +solvable +someway +someways +songwriter +songwriter's +songwriters +soothingly +soothings +sophomoric +soporific +soporifics +soppings +sorbet +sorbet's +sorbets +soreness +sorrowfully +soulful +soundness +soundness's +soundtracks +sourdough +sourdoughs +sourly +sourness +sourness's +southbound +southeasterly +southeastward +southerner's +southwesterly +southwestward +soybean +soybean's +soybeans +spacey +spacier +spaciest +spaciousness +spaciousness's +sparingly +sparseness +spastic +spastics +spates +speckle +speckled +speckles +speckling +spectra's +speedily +speedway +speedway's +speedways +spiel +spiel's +spieled +spieling +spiels +spiffied +spiffier +spiffies +spiffiest +spiffy +spiffying +splashier +splashiest +splashy +splats +splatted +splatting +splay +splayed +splaying +splays +splittings +spoilsport +spoilsport's +spoilsports +sporadically +sportier +sportiest +sportscast +sportscast's +sportscasting +sportscasts +sportsman +sportsman's +sportsmen +sportswear +sportswear's +sporty +spunkier +spunkies +spunkiest +spunky +squatter's +squattered +squattering +squatters +stabbings +stadia's +staffer +staffer's +staffers +staggeringly +staggerings +staging's +stagings +stakeout +stakeout's +stakeouts +stalker +stalker's +stalkers +stalkings +standout +standout's +standouts +starvings +stash +stashed +stashes +stashing +statesmanlike +statewide +stats +steamboat +steamboat's +steamboats +steamroll +steamrolled +steamrolling +steamrolls +steeply +steepness +stepbrother +stepbrother's +stepbrothers +stepchild +stepchild's +stepchildren +stepdaughter +stepdaughter's +stepdaughters +stepfather +stepfather's +stepfathers +stepmother +stepmother's +stepmothers +stepsister +stepsister's +stepsisters +stepson +stepson's +stepsons +stereotypical +sterility +sterility's +steroid +steroid's +steroids +stiflings +stillbirth +stillbirth's +stillbirths +stilt +stilt's +stilts +stinker +stinker's +stinkers +stinkings +stipend +stipend's +stipends +stitching's +stoic +stoic's +stoicism +stoicism's +stoics +stomachache +stomachache's +stomachaches +stonewall +stonewalled +stonewalling +stonewalls +stoplight +stoplight's +stoplights +storyteller +storyteller's +storytellers +stranglehold +stranglehold's +strangleholds +strapless +straplesses +strategically +streakier +streakiest +streaky +streetlight +streetlight's +streetlights +strident +strikingly +stripper's +strippers +striptease +striptease's +stripteased +stripteases +stripteasing +stubbornly +stubbornness +stubbornness's +sturdiness +sturdiness's +stymie +stymied +stymieing +stymies +subculture +subculture's +subcultures +subjectively +subjunctives +subliminal +subordination +subordination's +subpoena +subpoena's +subpoenaed +subpoenaing +subpoenas +subservience +subservience's +subtitle +subtitles +suburbia +suburbia's +suddenness +suddenness's +sufficiency +sufficiency's +suffocatings +suggestible +suggestively +sullenly +summerier +summeriest +summertime +summertime's +summery +sunbathing's +sunblock +sunblocks +superhighway +superhighway's +superhighways +superpower +superpower's +superpowers +supplemental +supposings +surefire +surfer +surfer's +surfers +surgically +surprisings +surrealistic +surreals +surrogate +surrogate's +surrogates +swank +swanked +swanker +swankest +swanking +swanks +swatch +swatch's +swatches +sweatier +sweatiest +sweatpants +sweatshirt +sweatshirts +sweatshop +sweatshop's +sweatshops +sweetener +sweetener's +sweeteners +sweetie +sweetie's +sweeties +swelter +sweltered +sweltering +swelterings +swelters +swimmer +swimmers +swimsuit +swimsuit's +swimsuits +sycamore +sycamore's +sycamores +sycophant +sycophant's +sycophants +syllabi's +symbolically +symmetrically +sync +synced +syncing +syncs +syndication +synod +synod's +synods +synthetically +t +tackiness +tackiness's +tactically +tad +tad's +tads +taffies +taffy +taffy's +tailpipe +tailpipe's +tailpipes +takeout +takeouts +takeovers +takings +tampon +tampon's +tampons +tangier +tangies +tangiest +tangy +tapeworm +tapeworm's +tapeworms +tarmac +tarmacked +tarmacking +tarmacs +tarot +tarot's +tarots +tarp +tarp's +tarps +taster +taster's +tasters +tatter +tattered +tattered's +tattering +tatters +tattletale +tattletale's +tattletales +tautly +taxidermy +taxidermy's +taxings +teakettle +teakettle's +teakettles +teargas +teargases +teargassed +teargassing +teaspoonful +teaspoonful's +teaspoonfuls +technologist +technologist's +technologists +telecommute +telecommuted +telecommuter +telecommuters +telecommutes +telecommuting +telescopic +telethon +telethon's +telethons +temp +temp's +temped +temping +templates +temps +temptings +tenderhearted +tequila +tequila's +tequilas +terminations +testier +testiest +testy +thematic +thematics +theoretician +theoretician's +theoreticians +thereabout +thermonuclear +thingamajig +thingamajigs +thinker's +thirstily +thoroughness +thoroughness's +thoughtlessness +thoughtlessness's +thrashings +threateningly +threatenings +thrivings +throatier +throatiest +throaty +throwaways +thumbnail +thumbnail's +thumbnails +tic +tic's +tics +tiebreaker +tiebreaker's +tiebreakers +tightfisted +tinderbox +tinderbox's +tinderboxes +tinfoil +tinfoil's +tiredness +tirings +tizzies +tizzy +tizzy's +toastier +toasties +toastiest +toasty +tobacconist +tobacconist's +tobacconists +toehold +toehold's +toeholds +tofu +tog +togetherness +togetherness's +toggled +toggles +toggling +togs +toiletries +toiletry +tokenism +tokenism's +tollbooth +tollbooth's +tollbooths +tollgate +tollgate's +tollgates +tomfooleries +tomfoolery +tomfoolery's +toolbar +toolbars +topless +topographer +topographer's +topographers +toppings +tort +tort's +torts +torturer +torturers +touchstone +touchstone's +touchstones +tourism +tourism's +townhouse +townhouses +township +township's +townships +toxicity +toxicity's +toxicology +toxicology's +tracer +tracer's +tracers +traditionalists +trailblazer +trailblazer's +trailblazers +trajectories +trajectory +trajectory's +transcendence +transcendence's +transcendental +translucence +translucence's +transsexual +transsexual's +transsexuals +transvestite +transvestite's +transvestites +treatable +treetop +treetop's +treetops +trenchant +triceps +triceps's +tricepses +trident +trident's +tridents +trike +trike's +triked +trikes +triking +trimmings +triumphantly +tromp +tromped +tromping +tromps +tropic +tropic's +tropics +troubadour +troubadour's +troubadours +troubleshoot +troubleshooted +troubleshooter +troubleshooter's +troubleshooters +troubleshooting +troubleshoots +troubleshot +trucker +trucker's +truckers +trucking's +truckload +truckload's +truckloads +truculent +trumpeter +trumpeter's +trumpeters +trundle +trundled +trundles +trundling +ts +tubbier +tubbiest +tubby +tugboat +tugboat's +tugboats +turd +turd's +turds +turnarounds +turncoat +turncoat's +turncoats +tush +tushed +tushes +tushing +tux +tuxes +twerp +twerp's +twerps +twit +twits +twitted +twitting +tyke +tyke's +tykes +typecast +typecasting +typecasts +typefaces +typewrite +typewrites +typewriting +typewritten +typewrote +typo +typo's +typos +u +ubiquity +uh +ultrasound +ultrasound's +ultrasounds +um +umpteenth +unabashed +unabated +unabridged +unabridgeds +unaccompanied +unaided +unavoidably +unbeaten +unbounded +unbridled +unbutton +unbuttoned +unbuttoning +unbuttons +uncannily +uncertainly +uncharacteristic +uncharacteristically +uncharted +unchecked +unclearer +unclearest +uncommonly +unconscionable +unconsciousness +unconsciousness's +uncontrollably +underage +underclass +underclassman +underclassmen +undergrad +undergrad's +undergrads +underpaid +underpay +underpaying +underpays +understaffed +undetermined +undisclosed +unease +unease's +unending +unequally +unfairness +unfashionable +ungratefully +unholier +unholiest +unholy +uninhabitable +uninsured +unisex +unkindness +unknowingly +unleaded +unlisted +unnaturally +unobtrusive +unofficially +unplug +unplugged +unplugging +unplugs +unproductive +unprofessional +unprofitable +unquestioned +unreserved +unresponsive +unrestrained +unroll +unrolled +unrolling +unrolls +unruliness +unruliness's +unseens +unspoken +unsportsmanlike +unsteadier +unsteadiest +unsteady +unstoppable +unthinking +unthinkingly +untimelier +untimeliest +untimely +untouchable +untouchables +untoward +untried +untruthful +unwitting +unyielding +unzip +unzipped +unzipping +unzips +upchuck +upchucked +upchucking +upchucks +upcoming +upfront +upliftings +uppercase +upperclassman +upperclassman's +upperclassmen +uppity +upscale +upstage +upstaged +upstages +upstaging +upstate +upsurge +upsurged +upsurges +upsurging +upswing +upswing's +upswings +uptakes +utopia +utopias +v +vacantly +vacationer +vacationers +vainly +valedictorian +valedictorian's +valedictorians +valiantly +vanishings +variability +variability's +variances +vasectomies +vasectomy +vasectomy's +vegan +vegan's +vegans +veggie +veggies +vehicular +vendetta +vendetta's +vendettas +ventriloquism +ventriloquism's +vibe +vibes +videocassette +videocassettes +viewings +vindication +vindication's +vindications +violinist +violinist's +violinists +visage +visage's +visages +viscosity +viscosity's +viscous +volatility +volatility's +voled +voling +voracity +voracity's +voyeur +voyeur's +voyeurism +voyeurism's +voyeurs +vs +w +wackier +wackiest +wacky +waistband +waistband's +waistbands +wannabe +wannabes +wantings +ware +ware's +wares +warily +warlock +warlock's +warlocks +warlord +warlord's +warlords +warmonger +warmonger's +warmongering +warmongering's +warmongers +warring's +warship +warship's +warships +washbasin +washbasin's +washbasins +watchmaker +watchmaker's +watchmakers +waxiness +waxiness's +website +websites +weeknight +weeknight's +weeknights +weightless +weightlessness +weightlessness's +weightlifter +weightlifters +weightlifting +weightlifting's +welsh +welshed +welshes +welshing +westbound +westerner +westerner's +westerners +westwards +wetback +wetback's +wetbacks +whaling's +wham +wham's +whammed +whamming +whams +what's +whatchamacallit +whatchamacallits +whiner +whiners +whiplash +whiplash's +whiplashes +whipping's +whippings +who's +whodunit +whodunit's +whodunits +whoosh +whoosh's +whooshed +whooshes +whooshing +wiener +wiener's +wieners +wile +wiles +willowier +willowiest +willowy +wimp +wimped +wimpier +wimpiest +wimping +wimps +wimpy +windbreaker +windbreakers +windowsill +windowsill's +windowsills +windsurf +windsurfed +windsurfing +windsurfs +windswept +wineglass +wineglass's +wineglasses +wingspan +wingspan's +wingspans +wingtip +wingtips +wino +wino's +winos +wiretap +wiretap's +wiretapped +wiretapping +wiretaps +woebegone +woozier +wooziest +woozy +workaholic +workaholics +workfare +workloads +workmanlike +worksheet +worksheets +worryings +wrongful +wrongfully +wryly +x +xenophobic +y +ya +yarmulke +yarmulke's +yarmulkes +yeah +yeahs +yearbook +yearbook's +yearbooks +yellowish +yep +yeps +yest +yippee +yippees +yo +yuck +yucked +yuckier +yuckiest +yucking +yucks +yucky +yum +yummier +yummiest +yummy +yuppie +yuppies +z +zap +zapped +zapping +zaps +zealously +zit +zits diff --git a/cosmic rage/spell/spell.sqlite b/cosmic rage/spell/spell.sqlite new file mode 100644 index 0000000..33b20ff Binary files /dev/null and b/cosmic rage/spell/spell.sqlite differ diff --git a/cosmic rage/spell/userdict.txt b/cosmic rage/spell/userdict.txt new file mode 100644 index 0000000..e69de29 diff --git a/cosmic rage/spellchecker.lua b/cosmic rage/spellchecker.lua new file mode 100644 index 0000000..c9f5d0e --- /dev/null +++ b/cosmic rage/spellchecker.lua @@ -0,0 +1,397 @@ +--[[ + Spell checker for MUSHclient, written by Nick Gammon. + Written: 9th October 2006 + Updated: 11th October 2006 + Updated: 6th March 2007 to make progress bar optional + Updated: 13th April 2007 to added IGNORE_MIXED_CASE, IGNORE_IMBEDDED_NUMBERS + Updated: 15th February 2009 to convert to using SQLite database instead of Lua table + Updated: 21st February 2009 to fix problem where words with 2 metaphones were only stored once. +--]] + +local SHOW_PROGRESS_BAR = true -- show progress bar? true or false + +local METAPHONE_LENGTH = 4 -- how many characters of metaphone to get back +local EDIT_DISTANCE = 4 -- how close a word must be to appear in the list of suggestions +local CASE_SENSITIVE = false -- compare case? true or false +local IGNORE_CAPITALIZED = false -- ignore words starting with a capital? true or false +local IGNORE_MIXED_CASE = false -- ignore words in MixedCase (like that one)? true or false +local IGNORE_IMBEDDED_NUMBERS = false -- ignore words with numbers in them? true or false + +-- this is the pattern we use to find "words" in the text to be spell-checked +local pattern = "%a+'?[%a%d]+" -- regexp to give us a word with a possible single imbedded quote + +-- path to the spell check dictionaries +local directory = utils.info ().app_directory .. "spell\\" +-- file name of the user dictionary, in the above path +local userdict = "userdict.txt" + +-- stuff below used internally +local make_upper -- this becomes the upper-case conversion function, see below +local db -- SQLite3 dictionary database +local cancelmessage = "spell check cancelled" +local previousword --> not used right now +local change, ignore -- tables of change-all, ignore-all words + +-- dictionaries - add new entries along similar lines to add more dictionary files +local files = { + +-- lower-case words + + "english-words.10", + "english-words.20", + "english-words.35", + "english-words.40", + +-- upper case words + + "english-upper.10", + "english-upper.35", + "english-upper.40", + +-- American words + + "american-words.10", + "american-words.20", + +-- contractions (eg. aren't, doesn't) + + "english-contractions.10", + "english-contractions.35", + +-- user dictionary + userdict, + } + + -- trim leading and trailing spaces from a string +local function trim (s) + return (string.gsub (s, "^%s*(.-)%s*$", "%1")) +end -- trim + +-- insert a word into our metaphone table - called by reading dictionaries +-- and also by adding a word during the spellcheck +local function insert_word (word, user) + + if word == "" then + return + end -- empty word + + + -- get both metaphones + local m1, m2 = utils.metaphone (word, METAPHONE_LENGTH) + local fixed_word = string.gsub (word, "'", "''") -- convert ' to '' + + assert (db:execute (string.format ("INSERT INTO words VALUES (NULL, '%s', '%s', %i)", + fixed_word, m1, user))); + + -- do 2nd metaphone, if any + if m2 then + assert (db:execute (string.format ("INSERT INTO words VALUES (NULL, '%s', '%s', %i)", + fixed_word, m2, user))); + end -- having alternative + +end -- insert_word + + +-- sort function for sorting the suggestions into edit-distance order +local function suggestions_compare (word) + return function (a, b) + local diff = utils.edit_distance (make_upper (a), word) - + utils.edit_distance (make_upper (b), word) + if diff == 0 then + return make_upper (a) < make_upper (b) + else + return diff < 0 + end -- differences the same? + end -- compareit +end -- function suggestions_compare + +-- check for one word, called by spellcheck (invokes suggestion dialog) +local function checkword_and_suggest (word) + + if IGNORE_CAPITALIZED then + -- ignore words starting in caps + if string.find (word, "^[A-Z]") then + return word, "ignore" + end -- this round, ignore this word + end -- if IGNORE_CAPITALIZED + + if IGNORE_MIXED_CASE then + -- ignore words in mixed case + if string.find (word, "[A-Z]") and + string.find (word, "[a-z]") then + return word, "ignore" + end -- this round, ignore this word + end -- if IGNORE_MIXED_CASE + + if IGNORE_IMBEDDED_NUMBERS then + -- ignore words with numbers in them + if string.find (word, "%d") then + return word, "ignore" + end -- this round, ignore this word + end -- if IGNORE_IMBEDDED_NUMBERS + + uc_word = make_upper (word) -- convert to upper-case if wanted + + -- if we already did "ignore all" on this particular word, ignore it again + if ignore [word] then + return word, "ignore" + end -- this round, ignore this word + + -- if we said change A to B, change it again + if change [word] then + return change [word], "change" + end -- change to this word + + -- table of suggestions, based on the metaphone + local keyed_suggestions = {} + + -- get both metaphones + local m1, m2 = utils.metaphone (word, METAPHONE_LENGTH) + + local function lookup_metaphone (m) + local found = false + for row in db:rows(string.format ("SELECT name FROM words WHERE metaphone = '%s'", m)) do + local word = row [1] + if make_upper (word) == uc_word then + found = true -- found exact match + break + end -- found + if utils.edit_distance (make_upper (word), uc_word) < EDIT_DISTANCE then + keyed_suggestions [word] = true + end -- close enough + end + return found + end -- lookup_metaphone + + -- look up first metaphone + if lookup_metaphone (m1) then + return word, "ok" + end -- word found + + -- try 2nd metaphone + if m2 then + if lookup_metaphone (m2) then + return word, "ok" + end -- word found + end -- have alternate metaphone + + -- pull into indexed table + local suggestions = {} + for k in pairs (keyed_suggestions) do + table.insert (suggestions, k) + end -- for + + table.sort (suggestions, suggestions_compare (uc_word)) + + -- not found? do spell check dialog + local action, replacement = utils.spellcheckdialog (word, suggestions) + + -- they cancelled? + if not action then + error (cancelmessage) --> forces us out of gsub loop + end -- cancelled + + -- ignore this only - just return + if action == "ignore" then + return word, "ignore" -- use current word + end -- ignore word + + -- ignore all of this word? add to list + if action == "ignoreall" then + ignore [word] = true + return word, "ignore" -- use current word + end -- ignore word + + -- add to user dictionary? + -- add to metaphone table, and rewrite dictionary + if action == "add" then + insert_word (word, 1) + return word, "ok" + end -- adding + + -- change word once? return replacement + if action == "change" then + return checkword_and_suggest (replacement) -- however, re-check it + end -- changing + + -- change all occurrences? add to table, return replacement + if action == "changeall" then + local newword, newaction = checkword_and_suggest (replacement) -- re-check it + if newaction == "ok" then + change [word] = newword + end -- if approved + return newword -- return the new word + end -- changing + + error "unexpected result from dialog" +end -- checkword_and_suggest + +-- exported function to do the spellcheck +function spellcheck (line) + change = {} -- words to change + ignore = {} -- words to ignore + + -- we raise an error if they cancel the spell check dialog + ok, result = xpcall (function () + return string.gsub (line, pattern, checkword_and_suggest) + end, debug.traceback) + + if ok then + return result + end -- not cancelled spell check + + -- whoops! syntax error? + if not string.find (result, cancelmessage, 1, true) then + error (result) + end -- some syntax error + + return nil --> shows they cancelled +end -- spellchecker + +local notfound -- table of not-found words, for spellcheck_string + +-- check for one word, called by spellcheck_string +local function checkword (word) + uc_word = make_upper (word) -- convert to upper-case if wanted + + -- get first metaphone + local m = utils.metaphone (word, METAPHONE_LENGTH) + + local found = false + for row in db:rows(string.format ("SELECT name FROM words WHERE metaphone = '%s'", m)) do + local word = row [1] + if make_upper (word) == uc_word then + found = true -- found exact match + break + end -- found + end + + if found then return end -- do nothing if word found + + -- otherwise insert our word + table.insert (notfound, word) +end -- function checkword + +-- exported function to spellcheck a string +function spellcheck_string (text) + notfound = {} + string.gsub (text, pattern, checkword) + return notfound +end -- spellcheck_string + +-- exported function to add a word to the user dictionary +function spellcheck_add_word (word, action, replacement) + assert (action == "i", "Can only use action 'i' in user dictionary") -- only "i" supported right now + insert_word (word, 1) +end -- spellcheck_string + +-- read one of the dictionaries +local function read_dict (dlg, name) + if SHOW_PROGRESS_BAR then + dlg:step () + dlg:status (directory .. name) + if dlg:checkcancel () then + error "Dictionary loading cancelled" + end -- if cancelled + end -- if SHOW_PROGRESS_BAR + + for line in io.lines (directory .. name) do + insert_word (line, 0) + end +end -- read_dict + +local function init () + + -- make a suitable function depending on whether they want case-sensitive or not + if CASE_SENSITIVE then + make_upper = function (s) return s end -- return original + else + make_upper = function (s) return s:upper () end -- make upper case + end -- case-sensitivity test + + -- if no user dictionary, create it + local f = io.open (directory .. userdict, "r") + if not f then + f = io.output (directory .. userdict) + f:close () + else + f:close () + end -- checking for user dictionary + + -- open database on disk + db = assert (sqlite3.open( directory .. "spell.sqlite")) + local words_table = false + local count = 0 + + -- if database just created, there won't be a words table + for row in db:nrows("SELECT * FROM sqlite_master WHERE type = 'table' AND name = 'words'") do + if string.match (row.sql, "word_id") then -- better be newer version + words_table = true + end -- if + end + + -- enable WAL (Write-Ahead Logging) + assert (db:execute "PRAGMA journal_mode=WAL;") + + -- if no words table, make one + if not words_table then + -- create a table to hold the words + assert (db:execute[[ + DROP TABLE IF EXISTS words; + CREATE TABLE words( + word_id INTEGER NOT NULL PRIMARY KEY autoincrement, + name VARCHAR(10) NOT NULL, + metaphone VARCHAR(10) NOT NULL, + user INT(1) + ); + CREATE INDEX metaphone_index ON words (metaphone); + CREATE INDEX name_index ON words (name); + ]]) + end -- if + + -- check if table empty + for row in db:rows('SELECT COUNT(*) FROM words') do + count = row [1] + end + + -- if empty, populate it + if count == 0 then + + local dlg + + if SHOW_PROGRESS_BAR then + dlg = progress.new ("Loading dictionaries into SQLite database ...") + + dlg:range (0, #files) + dlg:setstep (1) + end -- if SHOW_PROGRESS_BAR + + assert (db:execute "BEGIN TRANSACTION"); + + for k, v in ipairs (files) do + ok, result = pcall (function () + read_dict (dlg, v) + end) + if not ok then + if SHOW_PROGRESS_BAR then + dlg:close () + end -- if SHOW_PROGRESS_BAR + error (result) + end -- not ok + end -- reading each file + + if SHOW_PROGRESS_BAR then + dlg:close () + end -- if SHOW_PROGRESS_BAR + + assert (db:execute "COMMIT"); + + end -- if nothing in database + + +end -- init + +-- when script is loaded, do initialization stuff + +init () + diff --git a/cosmic rage/tips.txt b/cosmic rage/tips.txt new file mode 100644 index 0000000..591ee66 --- /dev/null +++ b/cosmic rage/tips.txt @@ -0,0 +1,81 @@ +You can drag the "game" toolbar alongside the "file" toolbar, to save room at the top of the screen. +You can customise the colours used to show output from your MUD by using: Game > World Configuration > Colours +Use tab-completion to save typing. Type part of a word, and press to have that word completed with one that matches it in recent output. +Aliases can be used to save typing. For example, set up an alias "k *" to expand to "kill %1". Then, if you see a monster, just type "k monster". +You can bookmark interesting lines in the output window. Press SHIFT + CTRL + B to make a bookmark. Press CTRL + B to go back to a bookmark. Make as many bookmarks as you like. +You can store up to 500,000 lines of output from the MUD. The exact number stored is customised in the "output" configuration screen. +You can play a sound (.WAV, .MID or .RMI file) when a trigger fires. +You can colour individual words by making a trigger to match on that word, checking "regular expression" and selecting a custom colour. +You can use regular expressions to match complex things (eg. "fish|chips" will match fish OR chips). +Scripting lets you build in tests and conditional behaviour into your triggers and aliases. +You can copy and paste triggers, timers, aliases and other things from one world to another. +You can match partial commands by entering part of a command and pressing ALT + UP. +You can customise the font used in the output window. +You can customise the text and background colour of the command (input) window by using: Game > World Configuration > Commands +You can customise the font used in the command (input) window by using: Game > World Configuration > Commands. +You can echo what you type into the MUD in a different colour, to make your input stand out. Also, any aliases are expanded so you know exactly what is sent to the MUD. +You can use "speed walking" to quickly move from one location to another. You choose what "prefix" enables speed walking. For example: /w 2N3E will take you North twice and then East three times. +You can use "command stacking" to type multiple commands on one line. You can choose which character is used to stack commands together. For example: take sword; kill dragon +You can use the "notes" tab in the World Configuration screen to keep free-format notes about things of interest in the current world. +You can use the numeric keypad to quickly move around. The actual commands sent by the keypad are customisable by you. +If you use the numeric keypad, or commands on the "Actions" menu, then any command you have typed into the command area is preserved. This way you can use the numeric keypad to walk around, whilst typing in a lengthy command at the same time. +You can automatically log onto a world by specifying a character name and password in the "Connecting" tab of the World Configuration screen. +You can automatically send one or more commands to the MUD when you connect (such as WHO) +You can use the "Activity" window to monitor all worlds (if you are connected to multiple worlds at once) and see if you have received messages from worlds other than the current one. +You can quickly switch to different worlds by using Ctrl+n where "n" is the "world number" in the Activity window. eg. Ctrl+2 will switch to World number 2 in the Activity window. +You can sort the Activity window into alphabetical order of any column by just clicking on that column heading. Click twice on a heading to sort in reverse order. +You can use triggers to highlight incoming messages by setting a trigger to match on a message prefix, and setting it to colour that message. +By turning on "auto-pause" the output window will automatically pause when you scroll back to read a previous message. +You can get the last command you entered to re-appear by turning on "auto-repeat". +You can connect to MUDs that support the MUD Client Compression protocol for faster access. +You can configure Netscape Navigator to call MUSHclient as your "telnet" application. +You can use "Quick Connect" to quickly connect to a new world. +You can use "select all" (Ctrl+A) to select all text in the command or output window. +You can turn loggging on or off from a script. +You can customise keystrokes by using the script command "Accelerator". +Lua scripting is easy to learn and very powerful. +You can use the chat system to chat to other players privately. +You can put variables into trigger and aliases by using @VARIABLE_NAME syntax. +You can use the DoAfter script routine to make a script do something in a few seconds. +You can use scripting to move world and notepad windows around and resize them. +You can do simple scripting by putting script commands into the "send" box for triggers, aliases and timers, and selecting "send to script". +You can use the spell checker to spell-check each command before you send it. +The spell-checker can be customised to only spell-check certain types of commands. +You can use regular expressions to "name" wildcards in your triggers, thus simplifying writing scripts for them. +You can write multi-line triggers to match complex things, like stats rollers, or an inventory list. +You can customise your notepad colours and fonts with a couple of script calls. +You can use plugins to enhance your client. Various plugins are supplied with MUSHclient, and others are available from the web site. +Lua is the recommended scripting language now, as it is easy to learn, and ships with MUSHclient. +Plugins can process "callbacks" which are special functions called at various stages of processing, such as input received from the MUD. +The MUSHclient forum has extensive tips and information: http://www.mushclient.com/forum/ +The "Global Replace" dialog in the built-in Notepad lets you find and replace using regular expressions. +You can edit scripts using an external editor. Crimson Editor is one such editor, and is free: http://www.crimsoneditor.com/ +Crimson Editor can be customised to display help from the MUSHclient help file for the function name that the cursor is over. +Pressing SHIFT + TAB when editing scripts brings up a "function-name completion" menu, to help get script function names correct. +Stuck for a name for your character? Use Edit menu -> Generate Character Name. +Want to find a particular line amongst thousands? Use Display menu -> Recall Text to specify a search criteria. +Trying to manage hundreds of triggers or aliases? You can reduce the number displayed by using the "Filter by" option. +You can use the ImportXML script function to generate triggers, aliases, timers at runtime, specifying all options in a simple format. +Auto-say lets you have lengthy chats without having to type "say" on every line. +All script functions are documented in the help file that ships with MUSHclient. +Some extra script functions are available in Lua only, see the help topic "Lua script extensions". +You can make a context menu from aliases by checking the "Menu" box for some aliases. Then CTRL + LH-CLICK will display that menu. +There is a context menu in both the command and output windows. RH-CLICK to see it. +Use the Plugin Wizard to easily generate a plugin from your triggers, aliases, timers, and scripts. See File menu -> Plugin Wizard. +There is an option in the File -> Global Preferences -> Tray/Taskbar, which lets you have MUSHclient be shown in the System Tray. +Boss coming? Press CTRL + M to minimize the program. +For an immersive experience, use Full Screen mode. Type Ctrl + Alt + F. Type it again to restore normal operation. +In Full Screen mode, all MUSHclient menus are available from the context menu. RH + CLICK to see it. +Double-click to select a word in the output window. +SHIFT + double-click to select an entire paragraph in the output window. +Use the Game menu -> Test Trigger dialog, to simulate input from the MUD, when testing triggers. +Annoyed by the "unable to connect" dialog box? You can disable that in File menu -> Global Preferences -> General tab. +Mis-typed the MUD's address? Stop the world trying to connect by using Connection menu -> Disconnect. +Don't like the colour scheme used by your MUD? Try changing ANSI colour settings for the world. If that fails, there is a script function MapColour that lets you change one colour to another. +For a bit of fun, try "random colours" in the ANSI colour settings for your world. +For a colour notepad, you can make a dummy world which doesn't connect to any MUD, and script ColourNote messages to it. +Extensive documentation about using Regular Expressions is in the file RegularExpressions.txt which ships in the "docs" subdirectory of your MUSHclient installation. +The output from macros (such as ALT + A) are sent through the command processor, so they can do scripting, speedwalks, or invoke aliases. +You can script MUSHclient in Python, JScript, VBscript, Perl, TCL, PHP and Lua. +MUD prompt not being displayed on its own line? Then try enabling World Properties->Output->Convert EOR/GA to newline. +You can use SQL databases from MUSHclient. Look in the plugins directory for examples. diff --git a/cosmic rage/uninstall.exe b/cosmic rage/uninstall.exe new file mode 100644 index 0000000..8de0d5a Binary files /dev/null and b/cosmic rage/uninstall.exe differ diff --git a/cosmic rage/worlds/Cosmic Rage/cosmic rage.MCL b/cosmic rage/worlds/Cosmic Rage/cosmic rage.MCL new file mode 100644 index 0000000..b213029 --- /dev/null +++ b/cosmic rage/worlds/Cosmic Rage/cosmic rage.MCL @@ -0,0 +1,461 @@ + + + + + + + + + + + + + + + + tts_interrupt %1 + + + + + + + + + + + + + + + + + + + up + + + + + down + + + + + north + + + + + south + + + + + east + + + + + west + + + + + examine + + + + + look + + + + + page + + + + + say + + + + + whisper + + + + + DOING + + + + + WHO + + + + + drop + + + + + take + + + + + LOGOUT + + + + + QUIT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + exits + + + + sw + + + + south + + + + se + + + + west + + + + look + + + + east + + + + nw + + + + north + + + + ne + + + + hide + + + + inventory + + + + score + + + + up + + + + down + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +