<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rhet0rica+Resident</id>
	<title>Second Life Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rhet0rica+Resident"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/wiki/Special:Contributions/Rhet0rica_Resident"/>
	<updated>2026-05-15T21:48:47Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Category_talk:LSL_User-Defined_Functions&amp;diff=1217147</id>
		<title>Category talk:LSL User-Defined Functions</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Category_talk:LSL_User-Defined_Functions&amp;diff=1217147"/>
		<updated>2024-08-14T16:29:53Z</updated>

		<summary type="html">&lt;p&gt;Rhet0rica Resident: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Optional (and/or Default) Parameters ==&lt;br /&gt;
&lt;br /&gt;
Hi, just wondering if LSL has the ability to support optional parameters for UDF&#039;s? &lt;br /&gt;
&lt;br /&gt;
As example, I&#039;m wanting to create a function that passes commands between attachments. I want this function to always take a &amp;quot;command&amp;quot; variable, and optionally may also take relevant &amp;quot;parameter&amp;quot; variable(s). Something vaguely like this, for a weapon and HUD...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer ACCESSORY_COMMAND_CHANNEL = 10;&lt;br /&gt;
key OWNER_KEY;&lt;br /&gt;
    &lt;br /&gt;
accessoryCommand(string cmd, string param = &amp;quot;&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
    llRegionSayTo(OWNER_KEY, ACCESSORY_COMMAND_CHANNEL, cmd + &amp;quot;:&amp;quot; + param);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        OWNER_KEY = llGetOwner();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer num) {&lt;br /&gt;
        accessoryCommand(&amp;quot;primary_attached&amp;quot;);&lt;br /&gt;
        accessoryCommand(&amp;quot;ammo&amp;quot;, &amp;quot;30&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Appreciate any help or direction!&lt;br /&gt;
[[User:Takura Thielt|Takura Thielt]] ([[User talk:Takura Thielt|talk]]) 13:46, 26 July 2024 (PDT)&lt;br /&gt;
&lt;br /&gt;
:Edit: I know I could have, and arguably should have just attempted this ISL myself, but I was hoping there might just be some special syntax that I wasn&#039;t thinking of. After some discussion elsewhere, I&#039;ve learned this isn&#039;t available in LSL (as perhaps should have been evidenced by the fact that we sometimes need to pass empty/blank variables to built-in functions.)&lt;br /&gt;
&lt;br /&gt;
:So, for my example above, I&#039;ll just have to do the same - that is, passing the second variable as an empty string, or else, as was suggested, try utilizing [https://wiki.secondlife.com/wiki/Json_usage_in_LSL JSON] functions. (Also, please forgive me as I&#039;m learning Wiki formatting, lol. I suspect I may not be doing this properly.) [[User:Takura Thielt|Takura Thielt]] ([[User talk:Takura Thielt|talk]]) 13:46, 26 July 2024 (PDT)&lt;br /&gt;
&lt;br /&gt;
::No such luck—parameter lists must be finalized at compile time. For some very hairy projects I&#039;ve occasionally used lists, but for a single optional parameter you&#039;ll just have to bite the bullet and write it out every single function call. LSL is little better than structured assembly; the programmer has to write for the machine, rather than expecting the compiler to provide creature comforts. Fortunately, server-side [[Lua_FAQ|Lua]] is on the horizon! [[User:Rhet0rica Resident|rhet0rica]] ([[User talk:Rhet0rica Resident|talk]]) 09:29, 14 August 2024 (PDT)&lt;/div&gt;</summary>
		<author><name>Rhet0rica Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Rhet0rica_Resident/RLVa_Protocol&amp;diff=1217146</id>
		<title>User:Rhet0rica Resident/RLVa Protocol</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Rhet0rica_Resident/RLVa_Protocol&amp;diff=1217146"/>
		<updated>2024-08-14T15:28:20Z</updated>

		<summary type="html">&lt;p&gt;Rhet0rica Resident: added highlighting for RLVa-only behaviors&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are two implementations of the RLV protocol: Marine Kelley&#039;s RLV codebase and Kitty Barnett&#039;s RLVa codebase. As of this writing, RLV is used by RestrainedLove, Cool VL Viewer, and Kokua; RLVa is used by Catznip, Alchemy, Black Dragon, Firestorm, Genesis, and Singularity.&lt;br /&gt;
&lt;br /&gt;
Naturally, whenever there are two or more implementations of anything, there are differences between the two. The main [[LSL_Protocol/RestrainedLoveAPI|RLV documentation]] on this wiki has been around for a long time and is primarily maintained by [[User:Marine Kelley|Marine Kelley]], the creator of the RLV ecosystem. While an invaluable resource for scripters targeting Marine&#039;s viewer and its progeny, it makes little mention of RLVa-specific features. This is &#039;&#039;mostly&#039;&#039; a good thing, as it encourages scripters to focus only on what has universal support, but at the same time there has been a dearth of information around RLVa, and what has been available [https://wiki.catznip.com/index.php?title=Category:RLVa|at the Catznip Wiki] is somewhat incomplete.&lt;br /&gt;
&lt;br /&gt;
The purpose of this page is to document the RLV protocol from an RLVa-centric perspective, both for my own reference and that of others. Behavior names in &#039;&#039;&#039;bold&#039;&#039;&#039; are absent from the RLV documentation and are almost certainly unique to RLVa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;messagebox&amp;quot;&amp;gt;This page describes &#039;&#039;&#039;RLVa 2.4.2.74783&#039;&#039;&#039;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;position: sticky;&amp;quot;| Behavior&lt;br /&gt;
! style=&amp;quot;position: sticky;&amp;quot;| Modifiers&lt;br /&gt;
! style=&amp;quot;position: sticky;&amp;quot;| y/n&lt;br /&gt;
! style=&amp;quot;position: sticky;&amp;quot;| add/rem&lt;br /&gt;
! style=&amp;quot;position: sticky;&amp;quot;| _sec&lt;br /&gt;
! style=&amp;quot;position: sticky;&amp;quot;| exception (y/n)&lt;br /&gt;
! style=&amp;quot;position: sticky;&amp;quot;| info&lt;br /&gt;
! style=&amp;quot;position: sticky;&amp;quot;| ReplyProcessor&lt;br /&gt;
! style=&amp;quot;position: sticky;&amp;quot;| force&lt;br /&gt;
! style=&amp;quot;position: sticky;&amp;quot;| experimental&lt;br /&gt;
! style=&amp;quot;position: sticky;&amp;quot;| extended&lt;br /&gt;
|-&lt;br /&gt;
| acceptpermission ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| accepttp ||  || ✔ ||  || ✔ || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| accepttprequest ||  || ✔ ||  || ✔ || ✔ ||  ||  ||  ||  || ✔&lt;br /&gt;
|-&lt;br /&gt;
| addattach ||  ||  ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| addoutfit ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| addoutfit ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| addoutfitall ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| addoutfitallover ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| addoutfitallthis ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| addoutfitallthisover ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| addoutfitover ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| addoutfitthis ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| addoutfitthisover ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| adjustheight ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| allowidle ||  || ✔ ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| alwaysrun ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attach ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachall ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachallover ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachalloverorreplace ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachallthis ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachallthis ||  ||  ||  ||  ||  || ✔ ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachallthis_except ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachallthisover ||  ||  ||  ||  ||  || ✔ ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachallthisoverorreplace ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachover ||  ||  ||  ||  ||  || ✔ ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachoverorreplace ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachthis ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachthis ||  ||  ||  ||  ||  || ✔ ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachthis_except ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachthisover ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachthisoverorreplace ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;buy&#039;&#039;&#039; ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| camavdist ||  ||  ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| camdistmax ||  ||  ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| camdistmin ||  ||  ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| camtextures ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| camunlock ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| camzoommax ||  ||  ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| camzoommin ||  ||  ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| chatnormal ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| chatshout ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| chatwhisper ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| detach ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| detach ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| detachall ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| detachallthis ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| detachallthis ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| detachallthis_except ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| detachme ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| detachthis ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| detachthis ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| detachthis_except ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| edit ||  || ✔ ||  ||  || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| editattach ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| editobj ||  ||  ||  ||  || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| editworld ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| emote ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fartouch || Fartouch Distance || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| findfolder ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| findfolders ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || ✔&lt;br /&gt;
|-&lt;br /&gt;
| fly ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fly ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;getaddattachnames&#039;&#039;&#039; ||  ||  ||  ||  ||  || ✔ ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;getaddoutfitnames&#039;&#039;&#039; ||  ||  ||  ||  ||  || ✔ ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getattach ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;getattachnames&#039;&#039;&#039; ||  ||  ||  ||  ||  || ✔ ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getcam_avdist ||  ||  ||  ||  ||  ||  || ✔ ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getcam_avdistmax ||  ||  ||  ||  ||  ||  || ✔ ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getcam_avdistmin ||  ||  ||  ||  ||  ||  || ✔ ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getcam_fov ||  ||  ||  ||  ||  ||  || ✔ ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getcam_fovmax ||  ||  ||  ||  ||  ||  || ✔ ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getcam_fovmin ||  ||  ||  ||  ||  ||  || ✔ ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getcam_textures ||  ||  ||  ||  ||  ||  || ✔ ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;getcommand&#039;&#039;&#039; ||  ||  ||  ||  ||  ||  || ✔ ||  ||  || ✔&lt;br /&gt;
|-&lt;br /&gt;
| getgroup ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;getheightoffset&#039;&#039;&#039; ||  ||  ||  ||  ||  ||  || ✔ ||  ||  || ✔&lt;br /&gt;
|-&lt;br /&gt;
| getinv ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| getinvworn ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| getoutfit ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;getoutfitnames&#039;&#039;&#039; ||  ||  ||  ||  ||  || ✔ ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getpath ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| getpathnew ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;getremattachnames&#039;&#039;&#039; ||  ||  ||  ||  ||  || ✔ ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;getremoutfitnames&#039;&#039;&#039; ||  ||  ||  ||  ||  || ✔ ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getsitid ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| getstatus ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| getstatusall ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| interact ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || ✔&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;jump&#039;&#039;&#039; ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| notify ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;pay&#039;&#039;&#039; ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| permissive ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| recvchat ||  || ✔ ||  || ✔ || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| recvchatfrom ||  ||  ||  || ✔ || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| recvemote ||  || ✔ ||  || ✔ || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| recvemotefrom ||  ||  ||  || ✔ || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| recvim || &#039;&#039;&#039;RecvIM Distance (Min), RecvIM Distance (Max)&#039;&#039;&#039; ||  ||  || ✔ ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| recvimfrom ||  ||  ||  || ✔ || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| redirchat ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rediremote ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| remattach ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| remattach ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| remoutfit ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| remoutfit ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rez ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sendchannel ||  ||  ||  || ✔ ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sendchannel_except ||  ||  ||  || ✔ ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| sendchat ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sendgesture ||  || ✔ ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| sendim || &#039;&#039;&#039;SendIM Distance (Min), SendIM Distance (Max)&#039;&#039;&#039; ||  ||  || ✔ ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sendimto ||  ||  ||  || ✔ || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setcam ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_avdist || Camera - Silhouette Distance ||  ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_avdistmax || Camera - Avatar Distance (Max) ||  ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_avdistmin || Camera - Avatar Distance (Min) ||  ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;setcam_eyeoffset&#039;&#039;&#039; || Camera - Eye Offset || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;setcam_eyeoffset&#039;&#039;&#039; ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;setcam_eyeoffsetscale&#039;&#039;&#039; || Camera - Eye Offset Scale ||  ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;setcam_eyeoffsetscale&#039;&#039;&#039; ||  || ✔ ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;setcam_focus&#039;&#039;&#039; ||  || ✔ ||  ||  ||  ||  ||  || ✔ || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;setcam_focusoffset&#039;&#039;&#039; || Camera - Focus Offset ||  ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;setcam_focusoffset&#039;&#039;&#039; ||  || ✔ ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_fov ||  || ✔ ||  ||  ||  ||  ||  || ✔ || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_fovmax || Camera - FOV (Max) || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_fovmin || Camera - FOV (Min) || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;setcam_mode&#039;&#039;&#039; ||  || ✔ ||  ||  ||  ||  ||  || ✔ || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;setcam_mouselook&#039;&#039;&#039; ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;setcam_origindistmax&#039;&#039;&#039; || Camera - Focus Distance (Max) ||  ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;setcam_origindistmin&#039;&#039;&#039; || Camera - Focus Distance (Min) ||  ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_textures || Camera - Forced Texture || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_unlock ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setdebug ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setenv ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setgroup ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setgroup ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;setoverlay&#039;&#039;&#039; ||  ||  || ✔ ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;setoverlay_alpha&#039;&#039;&#039; ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;setoverlay_texture&#039;&#039;&#039; ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;setoverlay_tint&#039;&#039;&#039; ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;setoverlay_touch&#039;&#039;&#039; ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;setoverlay_tween&#039;&#039;&#039; ||  || ✔ ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;setsphere&#039;&#039;&#039; ||  ||  || ✔ ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;setsphere_color&#039;&#039;&#039; ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;setsphere_distextend&#039;&#039;&#039; ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;setsphere_distmax&#039;&#039;&#039; ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;setsphere_distmin&#039;&#039;&#039; ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;setsphere_mode&#039;&#039;&#039; ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;setsphere_origin&#039;&#039;&#039; ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;setsphere_param&#039;&#039;&#039; ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;setsphere_tween&#039;&#039;&#039; ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;setsphere_valuemax&#039;&#039;&#039; ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;setsphere_valuemin&#039;&#039;&#039; ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| share ||  || ✔ ||  || ✔ || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sharedunwear ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || ✔&lt;br /&gt;
|-&lt;br /&gt;
| sharedwear ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || ✔&lt;br /&gt;
|-&lt;br /&gt;
| showhovertext ||  ||  ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| showhovertextall ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| showhovertexthud ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| showhovertextworld ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| showinv ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| showloc ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| showminimap ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| shownames ||  ||  ||  || ✔ ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| shownametags || Name Tags - Visible Distance ||  ||  || ✔ ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| shownearby ||  || ✔ ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| showself ||  || ✔ ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| showselfhead ||  || ✔ ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| showworldmap ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sit ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sit ||  || ✔ ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sitground ||  || ✔ ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sittp || SitTp Distance || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| standtp ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| startim || StartIM Distance (Min), StartIM Distance (Max) ||  ||  || ✔ ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| startimto ||  ||  ||  || ✔ || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| temprun ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| touchall ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| touchattach ||  || ✔ ||  ||  || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| touchattachother ||  || ✔ ||  ||  || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| touchattachself ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| touchfar ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| touchhud ||  || ✔ ||  ||  || ✔ ||  ||  ||  ||  || ✔&lt;br /&gt;
|-&lt;br /&gt;
| touchme ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| touchthis ||  ||  ||  ||  || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| touchworld ||  || ✔ ||  ||  || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tplm ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tploc ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tplocal || Local Teleport Distance || ✔ ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| tplure ||  || ✔ ||  || ✔ || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tprequest ||  || ✔ ||  || ✔ || ✔ ||  ||  ||  ||  || ✔&lt;br /&gt;
|-&lt;br /&gt;
| tpto ||  || ✔ ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| unsharedunwear ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| unsharedwear ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| unsit ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| unsit ||  || ✔ ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| version ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| versionnew ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| versionnum ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| viewnote ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| viewscript ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| viewtexture ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;viewtransparent&#039;&#039;&#039; ||  || ✔ ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;viewwireframe&#039;&#039;&#039; ||  || ✔ ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Rhet0rica Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Rhet0rica_Resident/RLVa_Protocol&amp;diff=1216938</id>
		<title>User:Rhet0rica Resident/RLVa Protocol</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Rhet0rica_Resident/RLVa_Protocol&amp;diff=1216938"/>
		<updated>2024-07-25T10:21:46Z</updated>

		<summary type="html">&lt;p&gt;Rhet0rica Resident: formatting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are two implementations of the RLV protocol: Marine Kelley&#039;s RLV codebase and Kitty Barnett&#039;s RLVa codebase. As of this writing, RLV is used by RestrainedLove, Cool VL Viewer, and Kokua; RLVa is used by Catznip, Alchemy, Black Dragon, Firestorm, Genesis, and Singularity.&lt;br /&gt;
&lt;br /&gt;
Naturally, whenever there are two or more implementations of anything, there are differences between the two. The main [[LSL_Protocol/RestrainedLoveAPI|RLV documentation]] on this wiki has been around for a long time and is primarily maintained by [[User:Marine Kelley|Marine Kelley]], the creator of the RLV ecosystem. While an invaluable resource for scripters targeting Marine&#039;s viewer and its progeny, it makes little mention of RLVa-specific features. This is &#039;&#039;mostly&#039;&#039; a good thing, as it encourages scripters to focus only on what has universal support, but at the same time there has been a dearth of information around RLVa, and what has been available [https://wiki.catznip.com/index.php?title=Category:RLVa|at the Catznip Wiki] is somewhat incomplete.&lt;br /&gt;
&lt;br /&gt;
The purpose of this page is to document the RLV protocol from an RLVa-centric perspective, both for my own reference and that of others.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;messagebox&amp;quot;&amp;gt;This page describes &#039;&#039;&#039;RLVa 2.4.2.74783&#039;&#039;&#039;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! style=&amp;quot;position: sticky;&amp;quot;| Behavior&lt;br /&gt;
! style=&amp;quot;position: sticky;&amp;quot;| Modifiers&lt;br /&gt;
! style=&amp;quot;position: sticky;&amp;quot;| y/n&lt;br /&gt;
! style=&amp;quot;position: sticky;&amp;quot;| add/rem&lt;br /&gt;
! style=&amp;quot;position: sticky;&amp;quot;| _sec&lt;br /&gt;
! style=&amp;quot;position: sticky;&amp;quot;| exception (y/n)&lt;br /&gt;
! style=&amp;quot;position: sticky;&amp;quot;| info&lt;br /&gt;
! style=&amp;quot;position: sticky;&amp;quot;| ReplyProcessor&lt;br /&gt;
! style=&amp;quot;position: sticky;&amp;quot;| force&lt;br /&gt;
! style=&amp;quot;position: sticky;&amp;quot;| experimental&lt;br /&gt;
! style=&amp;quot;position: sticky;&amp;quot;| extended&lt;br /&gt;
|-&lt;br /&gt;
| acceptpermission ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| accepttp ||  || ✔ ||  || ✔ || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| accepttprequest ||  || ✔ ||  || ✔ || ✔ ||  ||  ||  ||  || ✔&lt;br /&gt;
|-&lt;br /&gt;
| addattach ||  ||  ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| addoutfit ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| addoutfit ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| addoutfitall ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| addoutfitallover ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| addoutfitallthis ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| addoutfitallthisover ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| addoutfitover ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| addoutfitthis ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| addoutfitthisover ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| adjustheight ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| allowidle ||  || ✔ ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| alwaysrun ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attach ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachall ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachallover ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachalloverorreplace ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachallthis ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachallthis ||  ||  ||  ||  ||  || ✔ ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachallthis_except ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachallthisover ||  ||  ||  ||  ||  || ✔ ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachallthisoverorreplace ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachover ||  ||  ||  ||  ||  || ✔ ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachoverorreplace ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachthis ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachthis ||  ||  ||  ||  ||  || ✔ ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachthis_except ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachthisover ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachthisoverorreplace ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| buy ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| camavdist ||  ||  ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| camdistmax ||  ||  ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| camdistmin ||  ||  ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| camtextures ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| camunlock ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| camzoommax ||  ||  ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| camzoommin ||  ||  ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| chatnormal ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| chatshout ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| chatwhisper ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| detach ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| detach ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| detachall ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| detachallthis ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| detachallthis ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| detachallthis_except ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| detachme ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| detachthis ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| detachthis ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| detachthis_except ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| edit ||  || ✔ ||  ||  || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| editattach ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| editobj ||  ||  ||  ||  || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| editworld ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| emote ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fartouch || Fartouch Distance || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| findfolder ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| findfolders ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || ✔&lt;br /&gt;
|-&lt;br /&gt;
| fly ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fly ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| getaddattachnames ||  ||  ||  ||  ||  || ✔ ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getaddoutfitnames ||  ||  ||  ||  ||  || ✔ ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getattach ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| getattachnames ||  ||  ||  ||  ||  || ✔ ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getcam_avdist ||  ||  ||  ||  ||  ||  || ✔ ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getcam_avdistmax ||  ||  ||  ||  ||  ||  || ✔ ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getcam_avdistmin ||  ||  ||  ||  ||  ||  || ✔ ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getcam_fov ||  ||  ||  ||  ||  ||  || ✔ ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getcam_fovmax ||  ||  ||  ||  ||  ||  || ✔ ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getcam_fovmin ||  ||  ||  ||  ||  ||  || ✔ ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getcam_textures ||  ||  ||  ||  ||  ||  || ✔ ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getcommand ||  ||  ||  ||  ||  ||  || ✔ ||  ||  || ✔&lt;br /&gt;
|-&lt;br /&gt;
| getgroup ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| getheightoffset ||  ||  ||  ||  ||  ||  || ✔ ||  ||  || ✔&lt;br /&gt;
|-&lt;br /&gt;
| getinv ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| getinvworn ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| getoutfit ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| getoutfitnames ||  ||  ||  ||  ||  || ✔ ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getpath ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| getpathnew ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| getremattachnames ||  ||  ||  ||  ||  || ✔ ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getremoutfitnames ||  ||  ||  ||  ||  || ✔ ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getsitid ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| getstatus ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| getstatusall ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| interact ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || ✔&lt;br /&gt;
|-&lt;br /&gt;
| jump ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| notify ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pay ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| permissive ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| recvchat ||  || ✔ ||  || ✔ || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| recvchatfrom ||  ||  ||  || ✔ || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| recvemote ||  || ✔ ||  || ✔ || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| recvemotefrom ||  ||  ||  || ✔ || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| recvim || RecvIM Distance (Min), RecvIM Distance (Max) ||  ||  || ✔ ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| recvimfrom ||  ||  ||  || ✔ || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| redirchat ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rediremote ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| remattach ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| remattach ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| remoutfit ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| remoutfit ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rez ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sendchannel ||  ||  ||  || ✔ ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sendchannel_except ||  ||  ||  || ✔ ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| sendchat ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sendgesture ||  || ✔ ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| sendim || SendIM Distance (Min), SendIM Distance (Max) ||  ||  || ✔ ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sendimto ||  ||  ||  || ✔ || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setcam ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_avdist || Camera - Silhouette Distance ||  ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_avdistmax || Camera - Avatar Distance (Max) ||  ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_avdistmin || Camera - Avatar Distance (Min) ||  ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_eyeoffset || Camera - Eye Offset || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_eyeoffset ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_eyeoffsetscale || Camera - Eye Offset Scale ||  ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_eyeoffsetscale ||  || ✔ ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_focus ||  || ✔ ||  ||  ||  ||  ||  || ✔ || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_focusoffset || Camera - Focus Offset ||  ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_focusoffset ||  || ✔ ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_fov ||  || ✔ ||  ||  ||  ||  ||  || ✔ || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_fovmax || Camera - FOV (Max) || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_fovmin || Camera - FOV (Min) || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_mode ||  || ✔ ||  ||  ||  ||  ||  || ✔ || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_mouselook ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_origindistmax || Camera - Focus Distance (Max) ||  ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_origindistmin || Camera - Focus Distance (Min) ||  ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_textures || Camera - Forced Texture || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_unlock ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setdebug ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setenv ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setgroup ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setgroup ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setoverlay ||  ||  || ✔ ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setoverlay_alpha ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setoverlay_texture ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setoverlay_tint ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setoverlay_touch ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setoverlay_tween ||  || ✔ ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setsphere ||  ||  || ✔ ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setsphere_color ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setsphere_distextend ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setsphere_distmax ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setsphere_distmin ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setsphere_mode ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setsphere_origin ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setsphere_param ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setsphere_tween ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setsphere_valuemax ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setsphere_valuemin ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| share ||  || ✔ ||  || ✔ || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sharedunwear ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || ✔&lt;br /&gt;
|-&lt;br /&gt;
| sharedwear ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || ✔&lt;br /&gt;
|-&lt;br /&gt;
| showhovertext ||  ||  ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| showhovertextall ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| showhovertexthud ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| showhovertextworld ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| showinv ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| showloc ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| showminimap ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| shownames ||  ||  ||  || ✔ ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| shownametags || Name Tags - Visible Distance ||  ||  || ✔ ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| shownearby ||  || ✔ ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| showself ||  || ✔ ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| showselfhead ||  || ✔ ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| showworldmap ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sit ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sit ||  || ✔ ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sitground ||  || ✔ ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sittp || SitTp Distance || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| standtp ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| startim || StartIM Distance (Min), StartIM Distance (Max) ||  ||  || ✔ ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| startimto ||  ||  ||  || ✔ || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| temprun ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| touchall ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| touchattach ||  || ✔ ||  ||  || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| touchattachother ||  || ✔ ||  ||  || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| touchattachself ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| touchfar ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| touchhud ||  || ✔ ||  ||  || ✔ ||  ||  ||  ||  || ✔&lt;br /&gt;
|-&lt;br /&gt;
| touchme ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| touchthis ||  ||  ||  ||  || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| touchworld ||  || ✔ ||  ||  || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tplm ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tploc ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tplocal || Local Teleport Distance || ✔ ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| tplure ||  || ✔ ||  || ✔ || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tprequest ||  || ✔ ||  || ✔ || ✔ ||  ||  ||  ||  || ✔&lt;br /&gt;
|-&lt;br /&gt;
| tpto ||  || ✔ ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| unsharedunwear ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| unsharedwear ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| unsit ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| unsit ||  || ✔ ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| version ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| versionnew ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| versionnum ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| viewnote ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| viewscript ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| viewtexture ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| viewtransparent ||  || ✔ ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| viewwireframe ||  || ✔ ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Rhet0rica Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Rhet0rica_Resident/RLVa_Protocol&amp;diff=1216934</id>
		<title>User:Rhet0rica Resident/RLVa Protocol</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Rhet0rica_Resident/RLVa_Protocol&amp;diff=1216934"/>
		<updated>2024-07-25T07:21:09Z</updated>

		<summary type="html">&lt;p&gt;Rhet0rica Resident: initial draft of RLVa behavio(u)r data table&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are two implementations of the RLV protocol: Marine Kelley&#039;s RLV codebase and Kitty Barnett&#039;s RLVa codebase. As of this writing, RLV is used by RestrainedLove, Cool VL Viewer, and Kokua; RLVa is used by Catznip, Alchemy, Black Dragon, Firestorm, Genesis, and Singularity.&lt;br /&gt;
&lt;br /&gt;
Naturally, whenever there are two or more implementations of anything, there are differences between the two. The main [[LSL_Protocol/RestrainedLoveAPI|RLV documentation]] on this wiki has been around for a long time and is primarily maintained by [[User:Marine Kelley|Marine Kelley]], the creator of the RLV ecosystem. While an invaluable resource for scripters targeting Marine&#039;s viewer and its progeny, it makes little mention of RLVa-specific features. This is &#039;&#039;mostly&#039;&#039; a good thing, as it encourages scripters to focus only on what has universal support, but at the same time there has been a dearth of information around RLVa, and what has been available [https://wiki.catznip.com/index.php?title=Category:RLVa|at the Catznip Wiki] is somewhat incomplete.&lt;br /&gt;
&lt;br /&gt;
The purpose of this page is to document the RLV protocol from an RLVa-centric perspective, both for my own reference and that of others.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;messagebox&amp;quot;&amp;gt;This page describes &#039;&#039;&#039;RLVa 2.4.2.74783&#039;&#039;&#039;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: auto&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Behavior !! Modifiers !! y/n !! add/rem !! _sec !! exception y/n !! info !! ReplyProcessor !! force !! experimental !! extended&lt;br /&gt;
|-&lt;br /&gt;
| acceptpermission ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| accepttp ||  || ✔ ||  || ✔ || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| accepttprequest ||  || ✔ ||  || ✔ || ✔ ||  ||  ||  ||  || ✔&lt;br /&gt;
|-&lt;br /&gt;
| addattach ||  ||  ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| addoutfit ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| addoutfit ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| addoutfitall ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| addoutfitallover ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| addoutfitallthis ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| addoutfitallthisover ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| addoutfitover ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| addoutfitthis ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| addoutfitthisover ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| adjustheight ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| allowidle ||  || ✔ ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| alwaysrun ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attach ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachall ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachallover ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachalloverorreplace ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachallthis ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachallthis ||  ||  ||  ||  ||  || ✔ ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachallthis_except ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachallthisover ||  ||  ||  ||  ||  || ✔ ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachallthisoverorreplace ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachover ||  ||  ||  ||  ||  || ✔ ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachoverorreplace ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachthis ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachthis ||  ||  ||  ||  ||  || ✔ ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachthis_except ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachthisover ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| attachthisoverorreplace ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| buy ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| camavdist ||  ||  ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| camdistmax ||  ||  ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| camdistmin ||  ||  ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| camtextures ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| camunlock ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| camzoommax ||  ||  ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| camzoommin ||  ||  ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| chatnormal ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| chatshout ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| chatwhisper ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| detach ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| detach ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| detachall ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| detachallthis ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| detachallthis ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| detachallthis_except ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| detachme ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| detachthis ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| detachthis ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| detachthis_except ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| edit ||  || ✔ ||  ||  || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| editattach ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| editobj ||  ||  ||  ||  || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| editworld ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| emote ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fartouch || Fartouch Distance || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| findfolder ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| findfolders ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || ✔&lt;br /&gt;
|-&lt;br /&gt;
| fly ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| fly ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| getaddattachnames ||  ||  ||  ||  ||  || ✔ ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getaddoutfitnames ||  ||  ||  ||  ||  || ✔ ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getattach ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| getattachnames ||  ||  ||  ||  ||  || ✔ ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getcam_avdist ||  ||  ||  ||  ||  ||  || ✔ ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getcam_avdistmax ||  ||  ||  ||  ||  ||  || ✔ ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getcam_avdistmin ||  ||  ||  ||  ||  ||  || ✔ ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getcam_fov ||  ||  ||  ||  ||  ||  || ✔ ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getcam_fovmax ||  ||  ||  ||  ||  ||  || ✔ ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getcam_fovmin ||  ||  ||  ||  ||  ||  || ✔ ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getcam_textures ||  ||  ||  ||  ||  ||  || ✔ ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getcommand ||  ||  ||  ||  ||  ||  || ✔ ||  ||  || ✔&lt;br /&gt;
|-&lt;br /&gt;
| getgroup ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| getheightoffset ||  ||  ||  ||  ||  ||  || ✔ ||  ||  || ✔&lt;br /&gt;
|-&lt;br /&gt;
| getinv ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| getinvworn ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| getoutfit ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| getoutfitnames ||  ||  ||  ||  ||  || ✔ ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getpath ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| getpathnew ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| getremattachnames ||  ||  ||  ||  ||  || ✔ ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getremoutfitnames ||  ||  ||  ||  ||  || ✔ ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| getsitid ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| getstatus ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| getstatusall ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| interact ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || ✔&lt;br /&gt;
|-&lt;br /&gt;
| jump ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| notify ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| pay ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| permissive ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| recvchat ||  || ✔ ||  || ✔ || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| recvchatfrom ||  ||  ||  || ✔ || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| recvemote ||  || ✔ ||  || ✔ || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| recvemotefrom ||  ||  ||  || ✔ || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| recvim || RecvIM Distance (Min), RecvIM Distance (Max) ||  ||  || ✔ ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| recvimfrom ||  ||  ||  || ✔ || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| redirchat ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rediremote ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| remattach ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| remattach ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| remoutfit ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| remoutfit ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| rez ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sendchannel ||  ||  ||  || ✔ ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sendchannel_except ||  ||  ||  || ✔ ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| sendchat ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sendgesture ||  || ✔ ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| sendim || SendIM Distance (Min), SendIM Distance (Max) ||  ||  || ✔ ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sendimto ||  ||  ||  || ✔ || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setcam ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_avdist || Camera - Silhouette Distance ||  ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_avdistmax || Camera - Avatar Distance (Max) ||  ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_avdistmin || Camera - Avatar Distance (Min) ||  ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_eyeoffset || Camera - Eye Offset || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_eyeoffset ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_eyeoffsetscale || Camera - Eye Offset Scale ||  ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_eyeoffsetscale ||  || ✔ ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_focus ||  || ✔ ||  ||  ||  ||  ||  || ✔ || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_focusoffset || Camera - Focus Offset ||  ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_focusoffset ||  || ✔ ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_fov ||  || ✔ ||  ||  ||  ||  ||  || ✔ || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_fovmax || Camera - FOV (Max) || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_fovmin || Camera - FOV (Min) || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_mode ||  || ✔ ||  ||  ||  ||  ||  || ✔ || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_mouselook ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_origindistmax || Camera - Focus Distance (Max) ||  ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_origindistmin || Camera - Focus Distance (Min) ||  ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_textures || Camera - Forced Texture || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setcam_unlock ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setdebug ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setenv ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setgroup ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setgroup ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setoverlay ||  ||  || ✔ ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setoverlay_alpha ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setoverlay_texture ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setoverlay_tint ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setoverlay_touch ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setoverlay_tween ||  || ✔ ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setsphere ||  ||  || ✔ ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setsphere_color ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setsphere_distextend ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setsphere_distmax ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setsphere_distmin ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setsphere_mode ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setsphere_origin ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setsphere_param ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setsphere_tween ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setsphere_valuemax ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| setsphere_valuemin ||  ||  ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| share ||  || ✔ ||  || ✔ || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sharedunwear ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || ✔&lt;br /&gt;
|-&lt;br /&gt;
| sharedwear ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || ✔&lt;br /&gt;
|-&lt;br /&gt;
| showhovertext ||  ||  ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| showhovertextall ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| showhovertexthud ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| showhovertextworld ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| showinv ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| showloc ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| showminimap ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| shownames ||  ||  ||  || ✔ ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| shownametags || Name Tags - Visible Distance ||  ||  || ✔ ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| shownearby ||  || ✔ ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| showself ||  || ✔ ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| showselfhead ||  || ✔ ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| showworldmap ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sit ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sit ||  || ✔ ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sitground ||  || ✔ ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| sittp || SitTp Distance || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| standtp ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| startim || StartIM Distance (Min), StartIM Distance (Max) ||  ||  || ✔ ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| startimto ||  ||  ||  || ✔ || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| temprun ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| touchall ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| touchattach ||  || ✔ ||  ||  || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| touchattachother ||  || ✔ ||  ||  || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| touchattachself ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| touchfar ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| touchhud ||  || ✔ ||  ||  || ✔ ||  ||  ||  ||  || ✔&lt;br /&gt;
|-&lt;br /&gt;
| touchme ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| touchthis ||  ||  ||  ||  || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| touchworld ||  || ✔ ||  ||  || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tplm ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tploc ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tplocal || Local Teleport Distance || ✔ ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| tplure ||  || ✔ ||  || ✔ || ✔ ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| tprequest ||  || ✔ ||  || ✔ || ✔ ||  ||  ||  ||  || ✔&lt;br /&gt;
|-&lt;br /&gt;
| tpto ||  || ✔ ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| unsharedunwear ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| unsharedwear ||  ||  || ✔ ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| unsit ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| unsit ||  || ✔ ||  ||  ||  ||  ||  || ✔ ||  || &lt;br /&gt;
|-&lt;br /&gt;
| version ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| versionnew ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| versionnum ||  ||  ||  ||  ||  || ✔ ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| viewnote ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| viewscript ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| viewtexture ||  || ✔ ||  ||  ||  ||  ||  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| viewtransparent ||  || ✔ ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
| viewwireframe ||  || ✔ ||  ||  ||  ||  ||  ||  || ✔ || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Rhet0rica Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Talk:LlGetNotecardLineSync&amp;diff=1216928</id>
		<title>Talk:LlGetNotecardLineSync</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Talk:LlGetNotecardLineSync&amp;diff=1216928"/>
		<updated>2024-07-23T07:10:26Z</updated>

		<summary type="html">&lt;p&gt;Rhet0rica Resident: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Some explanations are in order, I think... ==&lt;br /&gt;
&lt;br /&gt;
I understand that there is (now?) some sort of caching mechanism being employed locally at the region&#039;s simulator, which ought to speed up reading notecards (and re-reading them!) quite considerably.&lt;br /&gt;
&lt;br /&gt;
As far as I can understand, the purpose of this function is merely to read the &#039;&#039;whole&#039;&#039; notecard in a tight loop inside a single [[dataserver]] event, as opposed to continually polling the database server for each line at the time?...&lt;br /&gt;
&lt;br /&gt;
If so, that should be made a bit more explicit, because, from the perspective of someone not intrinsically familiar with how the SL Grid operates, the difference between both approaches is not instantly obvious (I had to re-read this article several times until it finally &#039;&#039;clicked&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
It is a further step towards the full implementation of [http://opensimulator.org/wiki/OsGetNotecard the OpenSimulator equivalent that reads the entire notecard in a single call], bypassing database server events entirely. The option to have &#039;&#039;one&#039;&#039; dataserver event (as opposed to &#039;&#039;none&#039;&#039;, as in OpenSimulator) is probably just to allow the actual notecard reading to be run in parallel (a different thread?) without blocking, thus allowing the object to continue to be responding interactively while it&#039;s simultaneously loading a &#039;&#039;huge&#039;&#039; notecard. That approach might make more sense if it cannot be predicted if a notecard is already on the simulator&#039;s cache or not (and, if not, it requires loading it first from the central asset servers).&lt;br /&gt;
&lt;br /&gt;
But I&#039;m just speculating. I did &#039;&#039;not&#039;&#039; read anything about the origin and/or proposal of this new function (because I&#039;m lazy and didn&#039;t bothered to search for it); my point here is just that I believe that &#039;&#039;some&#039;&#039; additional explanations about this function are required, and how it relates to the older [[LlGetNotecardLine]], and publishing some sort of comparative analysis regarding the difference between the two mechanisms, both in raw speed and impact on the simulator...&lt;br /&gt;
&lt;br /&gt;
— [[User:Gwyneth Llewelyn|Gwyneth Llewelyn]] ([[User talk:Gwyneth Llewelyn|talk]]) 02:27, 17 January 2024 (PST)&lt;br /&gt;
&lt;br /&gt;
:This is &amp;quot;dataserver-less&amp;quot; reading of notecards. The dataserver is still part of it, but you don&#039;t need to asynchronously loop through it anymore. Like with the old function, you can random-access a single line. Like with the old function, you can loop through the lines until you reach EOF. IF the notecard is known to the simulator, you get the single line right away. If the dataserver does NOT know the notecard, you get &amp;quot;NAK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:So best practive would be to request the LAST line of a notecard via the old dataserver method, thus ensuring the notecard is cached in its entirety, and then enjoy datserver-less reading of any line you want to have.&lt;br /&gt;
&lt;br /&gt;
:Best best pratice would be to check for NAK and have a fallback for every query you make: First the fast methid, and if it returns NAK, the dataserver method. The beauty with this new function is that we don&#039;t need the async approach anymore, and can random access a (cached) notecard.&lt;br /&gt;
&lt;br /&gt;
:Reality these days is that modern scripts parse configuration data only once and store it to LSD - but this would go way faster even. &lt;br /&gt;
&lt;br /&gt;
:[[User:Peter Stindberg|Peter Stindberg]] ([[User talk:Peter Stindberg|talk]]) 08:52, 17 January 2024 (PST)&lt;br /&gt;
&lt;br /&gt;
::Reading any line of a notecard will cache the entire notecard into the buffer. In my testing, a single [[llGetNotecardLine]] call to the first line will consistently load the whole notecard, and any remaining lines can be read using [[llGetNotecardLineSync]] - although your suggested best practice is how I end up doing it (call [[llGetNotecardLineSync]], and if it returns [[NAK]], call [[llGetNotecardLine]]; repeat until [[EOF]]).&lt;br /&gt;
&lt;br /&gt;
::edit: Also, considering this function can blow through your whole 64k of memory in a fraction of a second, I added a note about garbage collection and how to avoid a stack-heap collision; I don&#039;t expect a llGetTheWholeNotecardAtOnce function for obvious reasons, either.&lt;br /&gt;
&lt;br /&gt;
::— [[User:Nelson Jenkins|Nelson Jenkins]] ([[User talk:Nelson Jenkins|talk]]) 17:56, 3 July 2024 (PDT)&lt;br /&gt;
&lt;br /&gt;
Nelson, in my apps that use llGetNotecardLineSync(), I have yet to experience memory leaks anywhere near the level that you have eluded to.&lt;br /&gt;
&lt;br /&gt;
Can you please file a bug report with a bare bones repro script at https://feedback.secondlife.com/scripting-bugs ? Thanks. Lucia Nightfire&lt;br /&gt;
&lt;br /&gt;
I don&#039;t use the Talk portion of this wiki so I don&#039;t know how to reply to comments. Bear with me.&lt;br /&gt;
&lt;br /&gt;
:I believe Nelson was referring to the thoughtless caching of llGetNotecardLineSync() return values in a string or list, not a memory leak. The salient observation is that its misuse can lead to memory exhaustion &#039;&#039;quickly,&#039;&#039; rather than through some new or unusual route.&lt;br /&gt;
&lt;br /&gt;
:— [[User:Rhet0rica Resident|rhet0rica]] ([[User talk:Rhet0rica Resident|talk]]) 00:10, 23 July 2024 (PDT)&lt;/div&gt;</summary>
		<author><name>Rhet0rica Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Rhet0rica_Resident/glob_match&amp;diff=1216890</id>
		<title>User:Rhet0rica Resident/glob match</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Rhet0rica_Resident/glob_match&amp;diff=1216890"/>
		<updated>2024-07-04T00:32:35Z</updated>

		<summary type="html">&lt;p&gt;Rhet0rica Resident: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSLC|User-Defined Functions}}&lt;br /&gt;
{{LSL_Function&lt;br /&gt;
|func=glob_match&lt;br /&gt;
|func_desc=Ported by [[User:Rhet0rica Resident|rhet0rica]] from [https://github.com/torvalds/linux/blob/master/lib/glob.c the Linux kernel], this function takes a pattern string and a query string as input and returns [[TRUE]] or [[FALSE]] depending on whether the query satisfies the pattern. This is the same method used by POSIX systems to match wildcards in filenames. License: Dual MIT and GPL 2.0. &amp;lt;syntaxhighlight lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * glob_match - Shell-style pattern matching, like !fnmatch(pat, str, 0)&lt;br /&gt;
 * @pat: Shell-style pattern to match, e.g. &amp;quot;*.[ch]&amp;quot;.&lt;br /&gt;
 * @str: String to match.  The pattern must match the entire string.&lt;br /&gt;
 *&lt;br /&gt;
 * Perform shell-style glob matching, returning true (1) if the match&lt;br /&gt;
 * succeeds, or false (0) if it fails.  Equivalent to !fnmatch(@pat, @str, 0).&lt;br /&gt;
 *&lt;br /&gt;
 * Pattern metacharacters are ?, *, [ and \.&lt;br /&gt;
 * (And, inside character classes, !, - and ].)&lt;br /&gt;
 *&lt;br /&gt;
 * This is small and simple implementation intended for device blacklists&lt;br /&gt;
 * where a string is matched against a number of patterns.  Thus, it&lt;br /&gt;
 * does not preprocess the patterns.  It is non-recursive, and run-time&lt;br /&gt;
 * is at most quadratic: strlen(@str)*strlen(@pat).&lt;br /&gt;
 *&lt;br /&gt;
 * An example of the worst case is glob_match(&amp;quot;*aaaaa&amp;quot;, &amp;quot;aaaaaaaaaa&amp;quot;);&lt;br /&gt;
 * it takes 6 passes over the pattern before matching the string.&lt;br /&gt;
 *&lt;br /&gt;
 * Like !fnmatch(@pat, @str, 0) and unlike the shell, this does NOT&lt;br /&gt;
 * treat / or leading . specially; it isn&#039;t actually used for pathnames.&lt;br /&gt;
 *&lt;br /&gt;
 * Note that according to glob(7) (and unlike bash), character classes&lt;br /&gt;
 * are complemented by a leading !; this does not support the regex-style&lt;br /&gt;
 * [^a-z] syntax.&lt;br /&gt;
 *&lt;br /&gt;
 * An opening bracket without a matching close is matched literally.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
integer glob_match(string pat, string str)&lt;br /&gt;
{&lt;br /&gt;
	/*&lt;br /&gt;
	 * Backtrack to previous * on mismatch and retry starting one&lt;br /&gt;
	 * character later in the string.  Because * matches all characters&lt;br /&gt;
	 * (no exception for /), it can be easily proved that there&#039;s&lt;br /&gt;
	 * never a need to backtrack multiple levels.&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	integer back_pat = NOWHERE;&lt;br /&gt;
	integer back_str;&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 * Loop over each token (character or class) in pat, matching&lt;br /&gt;
	 * it against the remaining unmatched tail of str.  Return false&lt;br /&gt;
	 * on mismatch, or true after matching the trailing nul bytes.&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	integer str_i;&lt;br /&gt;
	integer pat_i;&lt;br /&gt;
		&lt;br /&gt;
	while (TRUE) {&lt;br /&gt;
		integer c = llOrd(str, str_i++);&lt;br /&gt;
		integer d = llOrd(pat, pat_i++);&lt;br /&gt;
		&lt;br /&gt;
		/* Wildcard: anything but nul */&lt;br /&gt;
		if (d == 0x3f) { // &#039;?&#039;&lt;br /&gt;
			if (c == 0x00) // EOL&lt;br /&gt;
				return FALSE;&lt;br /&gt;
			jump skip_default;&lt;br /&gt;
		/* Any-length wildcard */&lt;br /&gt;
		} else if (d == 0x2a) { // &#039;*&#039;&lt;br /&gt;
			/* Optimize trailing * case */&lt;br /&gt;
			if (llOrd(pat, pat_i) == 0x00)&lt;br /&gt;
				return TRUE;&lt;br /&gt;
			back_pat = pat_i;&lt;br /&gt;
			/* Allow zero-length match */&lt;br /&gt;
			back_str = --str_i;&lt;br /&gt;
			jump skip_default;&lt;br /&gt;
		/* Character class */&lt;br /&gt;
		} else if (d == 0x5b) { // &#039;[&#039;&lt;br /&gt;
			integer match = FALSE;&lt;br /&gt;
			integer inverted = (llOrd(pat, pat_i) == 0x21); // &#039;!&#039;&lt;br /&gt;
			integer class_i = pat_i + inverted;&lt;br /&gt;
			integer a = llOrd(pat, class_i++);&lt;br /&gt;
&lt;br /&gt;
			/*&lt;br /&gt;
			 * Iterate over each span in the character class.&lt;br /&gt;
			 * A span is either a single character a, or a&lt;br /&gt;
			 * range a-b.  The first span may begin with &#039;]&#039;.&lt;br /&gt;
			 */&lt;br /&gt;
			do {&lt;br /&gt;
				integer b = a;&lt;br /&gt;
&lt;br /&gt;
				/* Malformed */&lt;br /&gt;
				if (a == 0x00)&lt;br /&gt;
					jump literal; // FIXME&lt;br /&gt;
&lt;br /&gt;
				if (llOrd(pat, class_i + 0) == 0x2d &amp;amp;&amp;amp; llOrd(pat, class_i + 1) != 0x5d) {&lt;br /&gt;
					b = llOrd(pat, class_i + 1);&lt;br /&gt;
&lt;br /&gt;
					if(b == 0x00)&lt;br /&gt;
						jump literal;&lt;br /&gt;
&lt;br /&gt;
					class_i += 2;&lt;br /&gt;
					/* Any special action if a &amp;gt; b? */&lt;br /&gt;
				}&lt;br /&gt;
				match = match | (a &amp;lt;= c &amp;amp;&amp;amp; c &amp;lt;= b);&lt;br /&gt;
			} while ((a = llOrd(pat, class_i++)) != 0x5d);&lt;br /&gt;
&lt;br /&gt;
			if (match == inverted)&lt;br /&gt;
				jump backtrack;&lt;br /&gt;
			pat_i = class_i;&lt;br /&gt;
			jump skip_default;&lt;br /&gt;
		} else if (d == 0x5c) { // &#039;\\&#039;&lt;br /&gt;
			d = llOrd(pat, pat_i++);&lt;br /&gt;
		}&lt;br /&gt;
		/* Literal character */&lt;br /&gt;
		@literal;&lt;br /&gt;
			if (c == d) {&lt;br /&gt;
				if (d == 0x00)&lt;br /&gt;
					return TRUE;&lt;br /&gt;
				jump skip_default;&lt;br /&gt;
			}&lt;br /&gt;
		@backtrack;&lt;br /&gt;
			if (c == 0x00 || !~back_pat)&lt;br /&gt;
				/* No point continuing */&lt;br /&gt;
				return FALSE;&lt;br /&gt;
			/* Try again from last *, one character later in str. */&lt;br /&gt;
			pat_i = back_pat;&lt;br /&gt;
			str_i = ++back_str;&lt;br /&gt;
			jump skip_default;&lt;br /&gt;
		@skip_default;&lt;br /&gt;
	}&lt;br /&gt;
	return FALSE; // unreachable, but the LSL compiler complains&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|func_footnote&lt;br /&gt;
|return_type=integer&lt;br /&gt;
|return_text=[[TRUE]] or [[FALSE]].&lt;br /&gt;
|p1_type=string&lt;br /&gt;
|p1_name=pat&lt;br /&gt;
|p1_desc=The string to use as a template. &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; matches zero or more characters, &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; matches exactly one character, &amp;lt;code&amp;gt;[abc]&amp;lt;/code&amp;gt; matches a, b, or c, and &amp;lt;code&amp;gt;[!abc]&amp;lt;/code&amp;gt; matches any character but a, b, or c. Other characters are interpreted as literals.&lt;br /&gt;
|p1_hover=Pattern string.&lt;br /&gt;
|p2_type=string&lt;br /&gt;
|p2_name=str&lt;br /&gt;
|p2_desc=The query string to evaluate.&lt;br /&gt;
|p2_hover=Query string.&lt;br /&gt;
|constants&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=* An unmatched &amp;lt;code&amp;gt;[&amp;lt;/code&amp;gt; in {{LSLP|pat}} will be interpreted as a literal left square bracket.&lt;br /&gt;
* This is not a full regular expression implementation. Hyphens in character classes (square brackets) are not supported.&lt;br /&gt;
|examples=&amp;lt;syntaxhighlight lang=&amp;quot;lsl&amp;quot;&amp;gt;glob_match(&amp;quot;a*c&amp;quot;, &amp;quot;ac&amp;quot;); // TRUE - * can match zero characters&lt;br /&gt;
glob_match(&amp;quot;a*can*&amp;quot;, &amp;quot;alpha centauri cantina&amp;quot;); // TRUE - glob_match() supports full backtracking&lt;br /&gt;
glob_match(&amp;quot;a?c&amp;quot;, &amp;quot;ac&amp;quot;); // FALSE - ? always matches exactly 1 character&lt;br /&gt;
glob_match(&amp;quot;*a*c?&amp;quot;, &amp;quot;space&amp;quot;); // TRUE - mixture of the above&lt;br /&gt;
glob_match(&amp;quot;gr[ae]y&amp;quot;, &amp;quot;grey&amp;quot;); // TRUE - [ae] allows exactly one of &amp;quot;a&amp;quot; or &amp;quot;e&amp;quot;&lt;br /&gt;
glob_match(&amp;quot;gr[ae]y&amp;quot;, &amp;quot;gray&amp;quot;); // TRUE - [ae] allows exactly one of &amp;quot;a&amp;quot; or &amp;quot;e&amp;quot;&lt;br /&gt;
glob_match(&amp;quot;gr[!ae]y&amp;quot;, &amp;quot;grXy&amp;quot;); // TRUE - [!ae] expects exactly one character but forbids &amp;quot;a&amp;quot; or &amp;quot;e&amp;quot;&lt;br /&gt;
glob_match(&amp;quot;gr[!ae]y&amp;quot;, &amp;quot;gry&amp;quot;); // FALSE - character classes must match exactly once&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_header&lt;br /&gt;
|also_functions&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|also_footer&lt;br /&gt;
|notes=* For case-insensitive match, use [[llToLower]] on {{LSLP|str}} first.&lt;br /&gt;
|mode&lt;br /&gt;
|deprecated&lt;br /&gt;
|location&lt;br /&gt;
|cat1&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|cat5&lt;br /&gt;
|cat6&lt;br /&gt;
|haiku={{Haiku|Characters align;|patterns match in hidden files;|[[LSL Portal Poetry Project|haiku makes me cringe]].}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Rhet0rica Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Rhet0rica_Resident/glob_match&amp;diff=1216889</id>
		<title>User:Rhet0rica Resident/glob match</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Rhet0rica_Resident/glob_match&amp;diff=1216889"/>
		<updated>2024-07-04T00:30:56Z</updated>

		<summary type="html">&lt;p&gt;Rhet0rica Resident: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSLC|User-Defined Functions}}&lt;br /&gt;
{{LSL_Function&lt;br /&gt;
|func=glob_match&lt;br /&gt;
|func_desc=Ported by [[User:Rhet0rica Resident|rhet0rica]] from [https://github.com/torvalds/linux/blob/master/lib/glob.c the Linux kernel], this function takes a pattern string and a query string as input and returns [[TRUE]] or [[FALSE]] depending on whether the query satisfies the pattern. This is the same method used by POSIX systems to match wildcards in filenames. License: Dual MIT and GPL 2.0. &amp;lt;syntaxhighlight lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * glob_match - Shell-style pattern matching, like !fnmatch(pat, str, 0)&lt;br /&gt;
 * @pat: Shell-style pattern to match, e.g. &amp;quot;*.[ch]&amp;quot;.&lt;br /&gt;
 * @str: String to match.  The pattern must match the entire string.&lt;br /&gt;
 *&lt;br /&gt;
 * Perform shell-style glob matching, returning true (1) if the match&lt;br /&gt;
 * succeeds, or false (0) if it fails.  Equivalent to !fnmatch(@pat, @str, 0).&lt;br /&gt;
 *&lt;br /&gt;
 * Pattern metacharacters are ?, *, [ and \.&lt;br /&gt;
 * (And, inside character classes, !, - and ].)&lt;br /&gt;
 *&lt;br /&gt;
 * This is small and simple implementation intended for device blacklists&lt;br /&gt;
 * where a string is matched against a number of patterns.  Thus, it&lt;br /&gt;
 * does not preprocess the patterns.  It is non-recursive, and run-time&lt;br /&gt;
 * is at most quadratic: strlen(@str)*strlen(@pat).&lt;br /&gt;
 *&lt;br /&gt;
 * An example of the worst case is glob_match(&amp;quot;*aaaaa&amp;quot;, &amp;quot;aaaaaaaaaa&amp;quot;);&lt;br /&gt;
 * it takes 6 passes over the pattern before matching the string.&lt;br /&gt;
 *&lt;br /&gt;
 * Like !fnmatch(@pat, @str, 0) and unlike the shell, this does NOT&lt;br /&gt;
 * treat / or leading . specially; it isn&#039;t actually used for pathnames.&lt;br /&gt;
 *&lt;br /&gt;
 * Note that according to glob(7) (and unlike bash), character classes&lt;br /&gt;
 * are complemented by a leading !; this does not support the regex-style&lt;br /&gt;
 * [^a-z] syntax.&lt;br /&gt;
 *&lt;br /&gt;
 * An opening bracket without a matching close is matched literally.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
integer glob_match(string pat, string str)&lt;br /&gt;
{&lt;br /&gt;
	/*&lt;br /&gt;
	 * Backtrack to previous * on mismatch and retry starting one&lt;br /&gt;
	 * character later in the string.  Because * matches all characters&lt;br /&gt;
	 * (no exception for /), it can be easily proved that there&#039;s&lt;br /&gt;
	 * never a need to backtrack multiple levels.&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	integer back_pat = NOWHERE;&lt;br /&gt;
	integer back_str;&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 * Loop over each token (character or class) in pat, matching&lt;br /&gt;
	 * it against the remaining unmatched tail of str.  Return false&lt;br /&gt;
	 * on mismatch, or true after matching the trailing nul bytes.&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	integer str_i;&lt;br /&gt;
	integer pat_i;&lt;br /&gt;
		&lt;br /&gt;
	while (TRUE) {&lt;br /&gt;
		integer c = llOrd(str, str_i++);&lt;br /&gt;
		integer d = llOrd(pat, pat_i++);&lt;br /&gt;
		&lt;br /&gt;
		/* Wildcard: anything but nul */&lt;br /&gt;
		if (d == 0x3f) { // &#039;?&#039;&lt;br /&gt;
			if (c == 0x00) // EOL&lt;br /&gt;
				return FALSE;&lt;br /&gt;
			jump skip_default;&lt;br /&gt;
		/* Any-length wildcard */&lt;br /&gt;
		} else if (d == 0x2a) { // &#039;*&#039;&lt;br /&gt;
			/* Optimize trailing * case */&lt;br /&gt;
			if (llOrd(pat, pat_i) == 0x00)&lt;br /&gt;
				return TRUE;&lt;br /&gt;
			back_pat = pat_i;&lt;br /&gt;
			/* Allow zero-length match */&lt;br /&gt;
			back_str = --str_i;&lt;br /&gt;
			jump skip_default;&lt;br /&gt;
		/* Character class */&lt;br /&gt;
		} else if (d == 0x5b) { // &#039;[&#039;&lt;br /&gt;
			integer match = FALSE;&lt;br /&gt;
			integer inverted = (llOrd(pat, pat_i) == 0x21); // &#039;!&#039;&lt;br /&gt;
			integer class_i = pat_i + inverted;&lt;br /&gt;
			integer a = llOrd(pat, class_i++);&lt;br /&gt;
&lt;br /&gt;
			/*&lt;br /&gt;
			 * Iterate over each span in the character class.&lt;br /&gt;
			 * A span is either a single character a, or a&lt;br /&gt;
			 * range a-b.  The first span may begin with &#039;]&#039;.&lt;br /&gt;
			 */&lt;br /&gt;
			do {&lt;br /&gt;
				integer b = a;&lt;br /&gt;
&lt;br /&gt;
				/* Malformed */&lt;br /&gt;
				if (a == 0x00)&lt;br /&gt;
					jump literal; // FIXME&lt;br /&gt;
&lt;br /&gt;
				if (llOrd(pat, class_i + 0) == 0x2d &amp;amp;&amp;amp; llOrd(pat, class_i + 1) != 0x5d) {&lt;br /&gt;
					b = llOrd(pat, class_i + 1);&lt;br /&gt;
&lt;br /&gt;
					if(b == 0x00)&lt;br /&gt;
						jump literal;&lt;br /&gt;
&lt;br /&gt;
					class_i += 2;&lt;br /&gt;
					/* Any special action if a &amp;gt; b? */&lt;br /&gt;
				}&lt;br /&gt;
				match = match | (a &amp;lt;= c &amp;amp;&amp;amp; c &amp;lt;= b);&lt;br /&gt;
			} while ((a = llOrd(pat, class_i++)) != 0x5d);&lt;br /&gt;
&lt;br /&gt;
			if (match == inverted)&lt;br /&gt;
				jump backtrack;&lt;br /&gt;
			pat_i = class_i;&lt;br /&gt;
			jump skip_default;&lt;br /&gt;
		} else if (d == 0x5c) { // &#039;\\&#039;&lt;br /&gt;
			d = llOrd(pat, pat_i++);&lt;br /&gt;
		}&lt;br /&gt;
		/* Literal character */&lt;br /&gt;
		@literal;&lt;br /&gt;
			if (c == d) {&lt;br /&gt;
				if (d == 0x00)&lt;br /&gt;
					return TRUE;&lt;br /&gt;
				jump skip_default;&lt;br /&gt;
			}&lt;br /&gt;
		@backtrack;&lt;br /&gt;
			if (c == 0x00 || !~back_pat)&lt;br /&gt;
				/* No point continuing */&lt;br /&gt;
				return FALSE;&lt;br /&gt;
			/* Try again from last *, one character later in str. */&lt;br /&gt;
			pat_i = back_pat;&lt;br /&gt;
			str_i = ++back_str;&lt;br /&gt;
			jump skip_default;&lt;br /&gt;
		@skip_default;&lt;br /&gt;
	}&lt;br /&gt;
	return FALSE; // unreachable, but the LSL compiler complains&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|func_footnote&lt;br /&gt;
|return_type=integer&lt;br /&gt;
|return_text=[[TRUE]] or [[FALSE]].&lt;br /&gt;
|p1_type=string&lt;br /&gt;
|p1_name=pat&lt;br /&gt;
|p1_desc=The string to use as a template. &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; matches zero or more characters, &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; matches exactly one character, &amp;lt;code&amp;gt;[abc]&amp;lt;/code&amp;gt; matches a, b, or c, and &amp;lt;code&amp;gt;[!abc]&amp;lt;/code&amp;gt; matches any character but a, b, or c. Other characters are interpreted as literals.&lt;br /&gt;
|p1_hover=Pattern string.&lt;br /&gt;
|p2_type=string&lt;br /&gt;
|p2_name=str&lt;br /&gt;
|p2_desc=The query string to evaluate.&lt;br /&gt;
|p2_hover=Query string.&lt;br /&gt;
|constants&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=* An unmatched &amp;lt;code&amp;gt;[&amp;lt;/code&amp;gt; in {{LSLP|pat}} will be interpreted as a literal left square bracket.&lt;br /&gt;
* This is not a full regular expression implementation. Hyphens in character classes (square brackets) are not supported.&lt;br /&gt;
|examples=&amp;lt;syntaxhighlight lang=&amp;quot;lsl&amp;quot;&amp;gt;glob_match(&amp;quot;a*c&amp;quot;, &amp;quot;ac&amp;quot;); // TRUE - * can match zero characters&lt;br /&gt;
glob_match(&amp;quot;a*can*&amp;quot;, &amp;quot;alpha centauri cantina&amp;quot;); // TRUE - glob_match() supports full backtracking&lt;br /&gt;
glob_match(&amp;quot;a?c&amp;quot;, &amp;quot;ac&amp;quot;); // FALSE - ? always matches exactly 1 character&lt;br /&gt;
glob_match(&amp;quot;*a*c?&amp;quot;, &amp;quot;space&amp;quot;); // TRUE - mixture of the above&lt;br /&gt;
glob_match(&amp;quot;gr[ae]y&amp;quot;, &amp;quot;grey&amp;quot;); // TRUE - [ae] allows exactly one of &amp;quot;a&amp;quot; or &amp;quot;e&amp;quot;&lt;br /&gt;
glob_match(&amp;quot;gr[ae]y&amp;quot;, &amp;quot;gray&amp;quot;); // TRUE - [ae] allows exactly one of &amp;quot;a&amp;quot; or &amp;quot;e&amp;quot;&lt;br /&gt;
glob_match(&amp;quot;gr[!ae]y&amp;quot;, &amp;quot;grXy&amp;quot;); // TRUE - [!ae] expects exactly one character but forbids &amp;quot;a&amp;quot; or &amp;quot;e&amp;quot;&lt;br /&gt;
glob_match(&amp;quot;gr[!ae]y&amp;quot;, &amp;quot;gry&amp;quot;); // FALSE - character classes must match exactly once&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_header&lt;br /&gt;
|also_functions&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|also_footer&lt;br /&gt;
|notes=* For case-insensitive match, use [[llToLower]] on {{LSLP|str}} first.&lt;br /&gt;
|mode&lt;br /&gt;
|deprecated&lt;br /&gt;
|location&lt;br /&gt;
|cat1&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|cat5&lt;br /&gt;
|cat6&lt;br /&gt;
|haiku={{Haiku|Wildcards align;|patterns match in hidden files;|[[LSL Portal Poetry Project|haiku makes me cringe]].}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Rhet0rica Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Rhet0rica_Resident/glob_match&amp;diff=1216888</id>
		<title>User:Rhet0rica Resident/glob match</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Rhet0rica_Resident/glob_match&amp;diff=1216888"/>
		<updated>2024-07-04T00:25:48Z</updated>

		<summary type="html">&lt;p&gt;Rhet0rica Resident: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSLC|User-Defined Functions}}&lt;br /&gt;
{{LSL_Function&lt;br /&gt;
|func=glob_match&lt;br /&gt;
|func_desc=Ported by [[User:Rhet0rica Resident|rhet0rica]] from [https://github.com/torvalds/linux/blob/master/lib/glob.c the Linux kernel], this function takes a pattern string and a query string as input and returns [[TRUE]] or [[FALSE]] depending on whether the query satisfies the pattern. This is the same method used by POSIX systems to match wildcards in filenames. License: Dual MIT and GPL 2.0. &amp;lt;syntaxhighlight lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * glob_match - Shell-style pattern matching, like !fnmatch(pat, str, 0)&lt;br /&gt;
 * @pat: Shell-style pattern to match, e.g. &amp;quot;*.[ch]&amp;quot;.&lt;br /&gt;
 * @str: String to match.  The pattern must match the entire string.&lt;br /&gt;
 *&lt;br /&gt;
 * Perform shell-style glob matching, returning true (1) if the match&lt;br /&gt;
 * succeeds, or false (0) if it fails.  Equivalent to !fnmatch(@pat, @str, 0).&lt;br /&gt;
 *&lt;br /&gt;
 * Pattern metacharacters are ?, *, [ and \.&lt;br /&gt;
 * (And, inside character classes, !, - and ].)&lt;br /&gt;
 *&lt;br /&gt;
 * This is small and simple implementation intended for device blacklists&lt;br /&gt;
 * where a string is matched against a number of patterns.  Thus, it&lt;br /&gt;
 * does not preprocess the patterns.  It is non-recursive, and run-time&lt;br /&gt;
 * is at most quadratic: strlen(@str)*strlen(@pat).&lt;br /&gt;
 *&lt;br /&gt;
 * An example of the worst case is glob_match(&amp;quot;*aaaaa&amp;quot;, &amp;quot;aaaaaaaaaa&amp;quot;);&lt;br /&gt;
 * it takes 6 passes over the pattern before matching the string.&lt;br /&gt;
 *&lt;br /&gt;
 * Like !fnmatch(@pat, @str, 0) and unlike the shell, this does NOT&lt;br /&gt;
 * treat / or leading . specially; it isn&#039;t actually used for pathnames.&lt;br /&gt;
 *&lt;br /&gt;
 * Note that according to glob(7) (and unlike bash), character classes&lt;br /&gt;
 * are complemented by a leading !; this does not support the regex-style&lt;br /&gt;
 * [^a-z] syntax.&lt;br /&gt;
 *&lt;br /&gt;
 * An opening bracket without a matching close is matched literally.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
integer glob_match(string pat, string str)&lt;br /&gt;
{&lt;br /&gt;
	/*&lt;br /&gt;
	 * Backtrack to previous * on mismatch and retry starting one&lt;br /&gt;
	 * character later in the string.  Because * matches all characters&lt;br /&gt;
	 * (no exception for /), it can be easily proved that there&#039;s&lt;br /&gt;
	 * never a need to backtrack multiple levels.&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	integer back_pat = NOWHERE;&lt;br /&gt;
	integer back_str;&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 * Loop over each token (character or class) in pat, matching&lt;br /&gt;
	 * it against the remaining unmatched tail of str.  Return false&lt;br /&gt;
	 * on mismatch, or true after matching the trailing nul bytes.&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	integer str_i;&lt;br /&gt;
	integer pat_i;&lt;br /&gt;
		&lt;br /&gt;
	while (TRUE) {&lt;br /&gt;
		integer c = llOrd(str, str_i++);&lt;br /&gt;
		integer d = llOrd(pat, pat_i++);&lt;br /&gt;
		&lt;br /&gt;
		/* Wildcard: anything but nul */&lt;br /&gt;
		if (d == 0x3f) { // &#039;?&#039;&lt;br /&gt;
			if (c == 0x00) // EOL&lt;br /&gt;
				return FALSE;&lt;br /&gt;
			jump skip_default;&lt;br /&gt;
		/* Any-length wildcard */&lt;br /&gt;
		} else if (d == 0x2a) { // &#039;*&#039;&lt;br /&gt;
			/* Optimize trailing * case */&lt;br /&gt;
			if (llOrd(pat, pat_i) == 0x00)&lt;br /&gt;
				return TRUE;&lt;br /&gt;
			back_pat = pat_i;&lt;br /&gt;
			/* Allow zero-length match */&lt;br /&gt;
			back_str = --str_i;&lt;br /&gt;
			jump skip_default;&lt;br /&gt;
		/* Character class */&lt;br /&gt;
		} else if (d == 0x5b) { // &#039;[&#039;&lt;br /&gt;
			integer match = FALSE;&lt;br /&gt;
			integer inverted = (llOrd(pat, pat_i) == 0x21); // &#039;!&#039;&lt;br /&gt;
			integer class_i = pat_i + inverted;&lt;br /&gt;
			integer a = llOrd(pat, class_i++);&lt;br /&gt;
&lt;br /&gt;
			/*&lt;br /&gt;
			 * Iterate over each span in the character class.&lt;br /&gt;
			 * A span is either a single character a, or a&lt;br /&gt;
			 * range a-b.  The first span may begin with &#039;]&#039;.&lt;br /&gt;
			 */&lt;br /&gt;
			do {&lt;br /&gt;
				integer b = a;&lt;br /&gt;
&lt;br /&gt;
				/* Malformed */&lt;br /&gt;
				if (a == 0x00)&lt;br /&gt;
					jump literal; // FIXME&lt;br /&gt;
&lt;br /&gt;
				if (llOrd(pat, class_i + 0) == 0x2d &amp;amp;&amp;amp; llOrd(pat, class_i + 1) != 0x5d) {&lt;br /&gt;
					b = llOrd(pat, class_i + 1);&lt;br /&gt;
&lt;br /&gt;
					if(b == 0x00)&lt;br /&gt;
						jump literal;&lt;br /&gt;
&lt;br /&gt;
					class_i += 2;&lt;br /&gt;
					/* Any special action if a &amp;gt; b? */&lt;br /&gt;
				}&lt;br /&gt;
				match = match | (a &amp;lt;= c &amp;amp;&amp;amp; c &amp;lt;= b);&lt;br /&gt;
			} while ((a = llOrd(pat, class_i++)) != 0x5d);&lt;br /&gt;
&lt;br /&gt;
			if (match == inverted)&lt;br /&gt;
				jump backtrack;&lt;br /&gt;
			pat_i = class_i;&lt;br /&gt;
			jump skip_default;&lt;br /&gt;
		} else if (d == 0x5c) { // &#039;\\&#039;&lt;br /&gt;
			d = llOrd(pat, pat_i++);&lt;br /&gt;
		}&lt;br /&gt;
		/* Literal character */&lt;br /&gt;
		@literal;&lt;br /&gt;
			if (c == d) {&lt;br /&gt;
				if (d == 0x00)&lt;br /&gt;
					return TRUE;&lt;br /&gt;
				jump skip_default;&lt;br /&gt;
			}&lt;br /&gt;
		@backtrack;&lt;br /&gt;
			if (c == 0x00 || !~back_pat)&lt;br /&gt;
				/* No point continuing */&lt;br /&gt;
				return FALSE;&lt;br /&gt;
			/* Try again from last *, one character later in str. */&lt;br /&gt;
			pat_i = back_pat;&lt;br /&gt;
			str_i = ++back_str;&lt;br /&gt;
			jump skip_default;&lt;br /&gt;
		@skip_default;&lt;br /&gt;
	}&lt;br /&gt;
	return FALSE; // unreachable, but the LSL compiler complains&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|func_footnote&lt;br /&gt;
|return_type=integer&lt;br /&gt;
|return_text=[[TRUE]] or [[FALSE]].&lt;br /&gt;
|p1_type=string&lt;br /&gt;
|p1_name=pat&lt;br /&gt;
|p1_desc=The string to use as a template. &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; matches zero or more characters, &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; matches exactly one character, &amp;lt;code&amp;gt;[abc]&amp;lt;/code&amp;gt; matches a, b, or c, and &amp;lt;code&amp;gt;[!abc]&amp;lt;/code&amp;gt; matches any character but a, b, or c. Other characters are interpreted as literals.&lt;br /&gt;
|p1_hover=Pattern string.&lt;br /&gt;
|p2_type=string&lt;br /&gt;
|p2_name=str&lt;br /&gt;
|p2_desc=The query string to evaluate.&lt;br /&gt;
|p2_hover=Query string.&lt;br /&gt;
|constants&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=* An unmatched &amp;lt;code&amp;gt;[&amp;lt;/code&amp;gt; in {{LSLP|pat}} will be interpreted as a literal left square bracket.&lt;br /&gt;
* This is not a full regular expression implementation. Hyphens in character classes (square brackets) are not supported.&lt;br /&gt;
|examples=&amp;lt;syntaxhighlight lang=&amp;quot;lsl&amp;quot;&amp;gt;glob_match(&amp;quot;a*c&amp;quot;, &amp;quot;ac&amp;quot;); // TRUE - * can match zero characters&lt;br /&gt;
glob_match(&amp;quot;a*can*&amp;quot;, &amp;quot;alpha centauri cantina&amp;quot;); // TRUE - glob_match() supports full backtracking&lt;br /&gt;
glob_match(&amp;quot;a?c&amp;quot;, &amp;quot;ac&amp;quot;); // FALSE - ? always matches exactly 1 character&lt;br /&gt;
glob_match(&amp;quot;*a*c?&amp;quot;, &amp;quot;space&amp;quot;); // TRUE - mixture of the above&lt;br /&gt;
glob_match(&amp;quot;gr[ae]y&amp;quot;, &amp;quot;grey&amp;quot;); // TRUE - [ae] allows exactly one of &amp;quot;a&amp;quot; or &amp;quot;e&amp;quot;&lt;br /&gt;
glob_match(&amp;quot;gr[ae]y&amp;quot;, &amp;quot;gray&amp;quot;); // TRUE - [ae] allows exactly one of &amp;quot;a&amp;quot; or &amp;quot;e&amp;quot;&lt;br /&gt;
glob_match(&amp;quot;gr[!ae]y&amp;quot;, &amp;quot;grXy&amp;quot;); // TRUE - [!ae] expects exactly one character but forbids &amp;quot;a&amp;quot; or &amp;quot;e&amp;quot;&lt;br /&gt;
glob_match(&amp;quot;gr[!ae]y&amp;quot;, &amp;quot;gry&amp;quot;); // FALSE - character classes must match exactly once&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_header&lt;br /&gt;
|also_functions&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|also_footer&lt;br /&gt;
|notes=* For case-insensitive match, use [[llToLower]] on {{LSLP|str}} first.&lt;br /&gt;
|mode&lt;br /&gt;
|deprecated&lt;br /&gt;
|location&lt;br /&gt;
|cat1&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|cat5&lt;br /&gt;
|cat6&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Rhet0rica Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Rhet0rica_Resident/glob&amp;diff=1216887</id>
		<title>User:Rhet0rica Resident/glob</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Rhet0rica_Resident/glob&amp;diff=1216887"/>
		<updated>2024-07-04T00:14:56Z</updated>

		<summary type="html">&lt;p&gt;Rhet0rica Resident: Rhet0rica Resident moved page User:Rhet0rica Resident/glob to User:Rhet0rica Resident/glob match: Changed name from original filename to match function name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[User:Rhet0rica Resident/glob match]]&lt;/div&gt;</summary>
		<author><name>Rhet0rica Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Rhet0rica_Resident/glob_match&amp;diff=1216886</id>
		<title>User:Rhet0rica Resident/glob match</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Rhet0rica_Resident/glob_match&amp;diff=1216886"/>
		<updated>2024-07-04T00:14:55Z</updated>

		<summary type="html">&lt;p&gt;Rhet0rica Resident: Rhet0rica Resident moved page User:Rhet0rica Resident/glob to User:Rhet0rica Resident/glob match: Changed name from original filename to match function name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSLC|User-Defined Functions}}&lt;br /&gt;
{{LSL_Function&lt;br /&gt;
|func=glob_match&lt;br /&gt;
|func_desc=Ported by [[User:Rhet0rica Resident|rhet0rica]] from [https://github.com/torvalds/linux/blob/master/lib/glob.c the Linux kernel], this function takes a pattern string and a query string as input and returns [[TRUE]] or [[FALSE]] depending on whether the query satisfies the pattern. This is the same method used by POSIX systems to match wildcards in filenames. License: Dual MIT/GPL. &amp;lt;syntaxhighlight lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * glob_match - Shell-style pattern matching, like !fnmatch(pat, str, 0)&lt;br /&gt;
 * @pat: Shell-style pattern to match, e.g. &amp;quot;*.[ch]&amp;quot;.&lt;br /&gt;
 * @str: String to match.  The pattern must match the entire string.&lt;br /&gt;
 *&lt;br /&gt;
 * Perform shell-style glob matching, returning true (1) if the match&lt;br /&gt;
 * succeeds, or false (0) if it fails.  Equivalent to !fnmatch(@pat, @str, 0).&lt;br /&gt;
 *&lt;br /&gt;
 * Pattern metacharacters are ?, *, [ and \.&lt;br /&gt;
 * (And, inside character classes, !, - and ].)&lt;br /&gt;
 *&lt;br /&gt;
 * This is small and simple implementation intended for device blacklists&lt;br /&gt;
 * where a string is matched against a number of patterns.  Thus, it&lt;br /&gt;
 * does not preprocess the patterns.  It is non-recursive, and run-time&lt;br /&gt;
 * is at most quadratic: strlen(@str)*strlen(@pat).&lt;br /&gt;
 *&lt;br /&gt;
 * An example of the worst case is glob_match(&amp;quot;*aaaaa&amp;quot;, &amp;quot;aaaaaaaaaa&amp;quot;);&lt;br /&gt;
 * it takes 6 passes over the pattern before matching the string.&lt;br /&gt;
 *&lt;br /&gt;
 * Like !fnmatch(@pat, @str, 0) and unlike the shell, this does NOT&lt;br /&gt;
 * treat / or leading . specially; it isn&#039;t actually used for pathnames.&lt;br /&gt;
 *&lt;br /&gt;
 * Note that according to glob(7) (and unlike bash), character classes&lt;br /&gt;
 * are complemented by a leading !; this does not support the regex-style&lt;br /&gt;
 * [^a-z] syntax.&lt;br /&gt;
 *&lt;br /&gt;
 * An opening bracket without a matching close is matched literally.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
integer glob_match(string pat, string str)&lt;br /&gt;
{&lt;br /&gt;
	/*&lt;br /&gt;
	 * Backtrack to previous * on mismatch and retry starting one&lt;br /&gt;
	 * character later in the string.  Because * matches all characters&lt;br /&gt;
	 * (no exception for /), it can be easily proved that there&#039;s&lt;br /&gt;
	 * never a need to backtrack multiple levels.&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	integer back_pat = NOWHERE;&lt;br /&gt;
	integer back_str;&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 * Loop over each token (character or class) in pat, matching&lt;br /&gt;
	 * it against the remaining unmatched tail of str.  Return false&lt;br /&gt;
	 * on mismatch, or true after matching the trailing nul bytes.&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	integer str_i;&lt;br /&gt;
	integer pat_i;&lt;br /&gt;
		&lt;br /&gt;
	while (TRUE) {&lt;br /&gt;
		integer c = llOrd(str, str_i++);&lt;br /&gt;
		integer d = llOrd(pat, pat_i++);&lt;br /&gt;
		&lt;br /&gt;
		/* Wildcard: anything but nul */&lt;br /&gt;
		if(d == 0x3f) { // &#039;?&#039;&lt;br /&gt;
			if (c == 0x00) // EOL&lt;br /&gt;
				return FALSE;&lt;br /&gt;
			jump skip_default;&lt;br /&gt;
		/* Any-length wildcard */&lt;br /&gt;
		} else if(d == 0x2a) { // &#039;*&#039;&lt;br /&gt;
			/* Optimize trailing * case */&lt;br /&gt;
			if(llOrd(pat, pat_i) == 0x00)&lt;br /&gt;
				return TRUE;&lt;br /&gt;
			back_pat = pat_i;&lt;br /&gt;
			/* Allow zero-length match */&lt;br /&gt;
			back_str = --str_i;&lt;br /&gt;
			jump skip_default;&lt;br /&gt;
		/* Character class */&lt;br /&gt;
		} else if(d == 0x5b) { // &#039;[&#039;&lt;br /&gt;
			integer match = FALSE;&lt;br /&gt;
			integer inverted = (llOrd(pat, pat_i) == 0x21); // &#039;!&#039;&lt;br /&gt;
			integer class_i = pat_i + inverted;&lt;br /&gt;
			integer a = llOrd(pat, class_i++);&lt;br /&gt;
&lt;br /&gt;
			/*&lt;br /&gt;
			 * Iterate over each span in the character class.&lt;br /&gt;
			 * A span is either a single character a, or a&lt;br /&gt;
			 * range a-b.  The first span may begin with &#039;]&#039;.&lt;br /&gt;
			 */&lt;br /&gt;
			do {&lt;br /&gt;
				integer b = a;&lt;br /&gt;
&lt;br /&gt;
				/* Malformed */&lt;br /&gt;
				if(a == 0x00)&lt;br /&gt;
					jump literal; // FIXME&lt;br /&gt;
&lt;br /&gt;
				if(llOrd(pat, class_i + 0) == 0x2d &amp;amp;&amp;amp; llOrd(pat, class_i + 1) != 0x5d) {&lt;br /&gt;
					b = llOrd(pat, class_i + 1);&lt;br /&gt;
&lt;br /&gt;
					if(b == 0x00)&lt;br /&gt;
						jump literal;&lt;br /&gt;
&lt;br /&gt;
					class_i += 2;&lt;br /&gt;
					/* Any special action if a &amp;gt; b? */&lt;br /&gt;
				}&lt;br /&gt;
				match = match | (a &amp;lt;= c &amp;amp;&amp;amp; c &amp;lt;= b);&lt;br /&gt;
			} while((a = llOrd(pat, class_i++)) != 0x5d);&lt;br /&gt;
&lt;br /&gt;
			if (match == inverted)&lt;br /&gt;
				jump backtrack;&lt;br /&gt;
			pat_i = class_i;&lt;br /&gt;
			jump skip_default;&lt;br /&gt;
		} else if(d == 0x5c) { // &#039;\\&#039;&lt;br /&gt;
			d = llOrd(pat, pat_i++);&lt;br /&gt;
		}&lt;br /&gt;
		//default:	/* Literal character */&lt;br /&gt;
		@literal;&lt;br /&gt;
			if (c == d) {&lt;br /&gt;
				if(d == 0x00)&lt;br /&gt;
					return TRUE;&lt;br /&gt;
				jump skip_default;&lt;br /&gt;
			}&lt;br /&gt;
		@backtrack;&lt;br /&gt;
			if(c == 0x00 || !~back_pat)&lt;br /&gt;
				/* No point continuing */&lt;br /&gt;
				return FALSE;&lt;br /&gt;
			/* Try again from last *, one character later in str. */&lt;br /&gt;
			pat_i = back_pat;&lt;br /&gt;
			str_i = ++back_str;&lt;br /&gt;
			jump skip_default;&lt;br /&gt;
		@skip_default;&lt;br /&gt;
		#ifdef DEBUG_GLOB&lt;br /&gt;
		last_d = d;&lt;br /&gt;
		last_c = c;&lt;br /&gt;
		last_str_i = str_i;&lt;br /&gt;
		last_pat_i = pat_i;&lt;br /&gt;
		#endif&lt;br /&gt;
	}&lt;br /&gt;
	return FALSE; // unreachable&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|func_footnote&lt;br /&gt;
|return_type=integer&lt;br /&gt;
|return_text=[[TRUE]] or [[FALSE]].&lt;br /&gt;
|p1_type=string&lt;br /&gt;
|p1_name=pat&lt;br /&gt;
|p1_desc=The string to use as a template. &amp;lt;samp&amp;gt;*&amp;lt;/samp&amp;gt; matches zero or more characters, &amp;lt;samp&amp;gt;?&amp;lt;/samp&amp;gt; matches exactly one character, &amp;lt;samp&amp;gt;[abc]&amp;lt;/samp&amp;gt; matches a, b, or c, and &amp;lt;samp&amp;gt;[!abc]&amp;lt;/samp&amp;gt; matches any character but a, b, or c. Other characters are interpreted as literals.&lt;br /&gt;
|p1_hover=Pattern string.&lt;br /&gt;
|p2_type=string&lt;br /&gt;
|p2_name=str&lt;br /&gt;
|p2_desc=The query string to evaluate.&lt;br /&gt;
|p2_hover=Query string.&lt;br /&gt;
|constants&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=* An unmatched &amp;lt;samp&amp;gt;[&amp;lt;/samp&amp;gt; in the pattern string will be interpreted as a literal left square bracket.&lt;br /&gt;
* This is not a full regular expression implementation. Hyphens in character classes (square brackets) are not supported.&lt;br /&gt;
|examples=&amp;lt;syntaxhighlight lang=&amp;quot;lsl&amp;quot;&amp;gt;glob_match(&amp;quot;a*c&amp;quot;, &amp;quot;ac&amp;quot;); // TRUE&lt;br /&gt;
glob_match(&amp;quot;a*c*&amp;quot;, &amp;quot;alpha centauri&amp;quot;); // TRUE&lt;br /&gt;
glob_match(&amp;quot;a?c&amp;quot;, &amp;quot;ac&amp;quot;); // FALSE&lt;br /&gt;
glob_match(&amp;quot;*a*c?&amp;quot;, &amp;quot;space&amp;quot;); // TRUE&lt;br /&gt;
glob_match(&amp;quot;gr[ae]y&amp;quot;, &amp;quot;grey&amp;quot;); // TRUE&lt;br /&gt;
glob_match(&amp;quot;gr[ae]y&amp;quot;, &amp;quot;gray&amp;quot;); // TRUE&lt;br /&gt;
glob_match(&amp;quot;gr[!ae]y&amp;quot;, &amp;quot;grXy&amp;quot;); // TRUE&lt;br /&gt;
glob_match(&amp;quot;gr[!ae]y&amp;quot;, &amp;quot;gry&amp;quot;); // FALSE&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_header&lt;br /&gt;
|also_functions&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|also_footer&lt;br /&gt;
|notes=* For case-insensitive match, use [[llToLower]] first.&lt;br /&gt;
|mode&lt;br /&gt;
|deprecated&lt;br /&gt;
|location&lt;br /&gt;
|cat1&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|cat5&lt;br /&gt;
|cat6&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Rhet0rica Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Rhet0rica_Resident/glob_match&amp;diff=1216885</id>
		<title>User:Rhet0rica Resident/glob match</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Rhet0rica_Resident/glob_match&amp;diff=1216885"/>
		<updated>2024-07-04T00:14:25Z</updated>

		<summary type="html">&lt;p&gt;Rhet0rica Resident: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSLC|User-Defined Functions}}&lt;br /&gt;
{{LSL_Function&lt;br /&gt;
|func=glob_match&lt;br /&gt;
|func_desc=Ported by [[User:Rhet0rica Resident|rhet0rica]] from [https://github.com/torvalds/linux/blob/master/lib/glob.c the Linux kernel], this function takes a pattern string and a query string as input and returns [[TRUE]] or [[FALSE]] depending on whether the query satisfies the pattern. This is the same method used by POSIX systems to match wildcards in filenames. License: Dual MIT/GPL. &amp;lt;syntaxhighlight lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * glob_match - Shell-style pattern matching, like !fnmatch(pat, str, 0)&lt;br /&gt;
 * @pat: Shell-style pattern to match, e.g. &amp;quot;*.[ch]&amp;quot;.&lt;br /&gt;
 * @str: String to match.  The pattern must match the entire string.&lt;br /&gt;
 *&lt;br /&gt;
 * Perform shell-style glob matching, returning true (1) if the match&lt;br /&gt;
 * succeeds, or false (0) if it fails.  Equivalent to !fnmatch(@pat, @str, 0).&lt;br /&gt;
 *&lt;br /&gt;
 * Pattern metacharacters are ?, *, [ and \.&lt;br /&gt;
 * (And, inside character classes, !, - and ].)&lt;br /&gt;
 *&lt;br /&gt;
 * This is small and simple implementation intended for device blacklists&lt;br /&gt;
 * where a string is matched against a number of patterns.  Thus, it&lt;br /&gt;
 * does not preprocess the patterns.  It is non-recursive, and run-time&lt;br /&gt;
 * is at most quadratic: strlen(@str)*strlen(@pat).&lt;br /&gt;
 *&lt;br /&gt;
 * An example of the worst case is glob_match(&amp;quot;*aaaaa&amp;quot;, &amp;quot;aaaaaaaaaa&amp;quot;);&lt;br /&gt;
 * it takes 6 passes over the pattern before matching the string.&lt;br /&gt;
 *&lt;br /&gt;
 * Like !fnmatch(@pat, @str, 0) and unlike the shell, this does NOT&lt;br /&gt;
 * treat / or leading . specially; it isn&#039;t actually used for pathnames.&lt;br /&gt;
 *&lt;br /&gt;
 * Note that according to glob(7) (and unlike bash), character classes&lt;br /&gt;
 * are complemented by a leading !; this does not support the regex-style&lt;br /&gt;
 * [^a-z] syntax.&lt;br /&gt;
 *&lt;br /&gt;
 * An opening bracket without a matching close is matched literally.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
integer glob_match(string pat, string str)&lt;br /&gt;
{&lt;br /&gt;
	/*&lt;br /&gt;
	 * Backtrack to previous * on mismatch and retry starting one&lt;br /&gt;
	 * character later in the string.  Because * matches all characters&lt;br /&gt;
	 * (no exception for /), it can be easily proved that there&#039;s&lt;br /&gt;
	 * never a need to backtrack multiple levels.&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	integer back_pat = NOWHERE;&lt;br /&gt;
	integer back_str;&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 * Loop over each token (character or class) in pat, matching&lt;br /&gt;
	 * it against the remaining unmatched tail of str.  Return false&lt;br /&gt;
	 * on mismatch, or true after matching the trailing nul bytes.&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	integer str_i;&lt;br /&gt;
	integer pat_i;&lt;br /&gt;
		&lt;br /&gt;
	while (TRUE) {&lt;br /&gt;
		integer c = llOrd(str, str_i++);&lt;br /&gt;
		integer d = llOrd(pat, pat_i++);&lt;br /&gt;
		&lt;br /&gt;
		/* Wildcard: anything but nul */&lt;br /&gt;
		if(d == 0x3f) { // &#039;?&#039;&lt;br /&gt;
			if (c == 0x00) // EOL&lt;br /&gt;
				return FALSE;&lt;br /&gt;
			jump skip_default;&lt;br /&gt;
		/* Any-length wildcard */&lt;br /&gt;
		} else if(d == 0x2a) { // &#039;*&#039;&lt;br /&gt;
			/* Optimize trailing * case */&lt;br /&gt;
			if(llOrd(pat, pat_i) == 0x00)&lt;br /&gt;
				return TRUE;&lt;br /&gt;
			back_pat = pat_i;&lt;br /&gt;
			/* Allow zero-length match */&lt;br /&gt;
			back_str = --str_i;&lt;br /&gt;
			jump skip_default;&lt;br /&gt;
		/* Character class */&lt;br /&gt;
		} else if(d == 0x5b) { // &#039;[&#039;&lt;br /&gt;
			integer match = FALSE;&lt;br /&gt;
			integer inverted = (llOrd(pat, pat_i) == 0x21); // &#039;!&#039;&lt;br /&gt;
			integer class_i = pat_i + inverted;&lt;br /&gt;
			integer a = llOrd(pat, class_i++);&lt;br /&gt;
&lt;br /&gt;
			/*&lt;br /&gt;
			 * Iterate over each span in the character class.&lt;br /&gt;
			 * A span is either a single character a, or a&lt;br /&gt;
			 * range a-b.  The first span may begin with &#039;]&#039;.&lt;br /&gt;
			 */&lt;br /&gt;
			do {&lt;br /&gt;
				integer b = a;&lt;br /&gt;
&lt;br /&gt;
				/* Malformed */&lt;br /&gt;
				if(a == 0x00)&lt;br /&gt;
					jump literal; // FIXME&lt;br /&gt;
&lt;br /&gt;
				if(llOrd(pat, class_i + 0) == 0x2d &amp;amp;&amp;amp; llOrd(pat, class_i + 1) != 0x5d) {&lt;br /&gt;
					b = llOrd(pat, class_i + 1);&lt;br /&gt;
&lt;br /&gt;
					if(b == 0x00)&lt;br /&gt;
						jump literal;&lt;br /&gt;
&lt;br /&gt;
					class_i += 2;&lt;br /&gt;
					/* Any special action if a &amp;gt; b? */&lt;br /&gt;
				}&lt;br /&gt;
				match = match | (a &amp;lt;= c &amp;amp;&amp;amp; c &amp;lt;= b);&lt;br /&gt;
			} while((a = llOrd(pat, class_i++)) != 0x5d);&lt;br /&gt;
&lt;br /&gt;
			if (match == inverted)&lt;br /&gt;
				jump backtrack;&lt;br /&gt;
			pat_i = class_i;&lt;br /&gt;
			jump skip_default;&lt;br /&gt;
		} else if(d == 0x5c) { // &#039;\\&#039;&lt;br /&gt;
			d = llOrd(pat, pat_i++);&lt;br /&gt;
		}&lt;br /&gt;
		//default:	/* Literal character */&lt;br /&gt;
		@literal;&lt;br /&gt;
			if (c == d) {&lt;br /&gt;
				if(d == 0x00)&lt;br /&gt;
					return TRUE;&lt;br /&gt;
				jump skip_default;&lt;br /&gt;
			}&lt;br /&gt;
		@backtrack;&lt;br /&gt;
			if(c == 0x00 || !~back_pat)&lt;br /&gt;
				/* No point continuing */&lt;br /&gt;
				return FALSE;&lt;br /&gt;
			/* Try again from last *, one character later in str. */&lt;br /&gt;
			pat_i = back_pat;&lt;br /&gt;
			str_i = ++back_str;&lt;br /&gt;
			jump skip_default;&lt;br /&gt;
		@skip_default;&lt;br /&gt;
		#ifdef DEBUG_GLOB&lt;br /&gt;
		last_d = d;&lt;br /&gt;
		last_c = c;&lt;br /&gt;
		last_str_i = str_i;&lt;br /&gt;
		last_pat_i = pat_i;&lt;br /&gt;
		#endif&lt;br /&gt;
	}&lt;br /&gt;
	return FALSE; // unreachable&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|func_footnote&lt;br /&gt;
|return_type=integer&lt;br /&gt;
|return_text=[[TRUE]] or [[FALSE]].&lt;br /&gt;
|p1_type=string&lt;br /&gt;
|p1_name=pat&lt;br /&gt;
|p1_desc=The string to use as a template. &amp;lt;samp&amp;gt;*&amp;lt;/samp&amp;gt; matches zero or more characters, &amp;lt;samp&amp;gt;?&amp;lt;/samp&amp;gt; matches exactly one character, &amp;lt;samp&amp;gt;[abc]&amp;lt;/samp&amp;gt; matches a, b, or c, and &amp;lt;samp&amp;gt;[!abc]&amp;lt;/samp&amp;gt; matches any character but a, b, or c. Other characters are interpreted as literals.&lt;br /&gt;
|p1_hover=Pattern string.&lt;br /&gt;
|p2_type=string&lt;br /&gt;
|p2_name=str&lt;br /&gt;
|p2_desc=The query string to evaluate.&lt;br /&gt;
|p2_hover=Query string.&lt;br /&gt;
|constants&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=* An unmatched &amp;lt;samp&amp;gt;[&amp;lt;/samp&amp;gt; in the pattern string will be interpreted as a literal left square bracket.&lt;br /&gt;
* This is not a full regular expression implementation. Hyphens in character classes (square brackets) are not supported.&lt;br /&gt;
|examples=&amp;lt;syntaxhighlight lang=&amp;quot;lsl&amp;quot;&amp;gt;glob_match(&amp;quot;a*c&amp;quot;, &amp;quot;ac&amp;quot;); // TRUE&lt;br /&gt;
glob_match(&amp;quot;a*c*&amp;quot;, &amp;quot;alpha centauri&amp;quot;); // TRUE&lt;br /&gt;
glob_match(&amp;quot;a?c&amp;quot;, &amp;quot;ac&amp;quot;); // FALSE&lt;br /&gt;
glob_match(&amp;quot;*a*c?&amp;quot;, &amp;quot;space&amp;quot;); // TRUE&lt;br /&gt;
glob_match(&amp;quot;gr[ae]y&amp;quot;, &amp;quot;grey&amp;quot;); // TRUE&lt;br /&gt;
glob_match(&amp;quot;gr[ae]y&amp;quot;, &amp;quot;gray&amp;quot;); // TRUE&lt;br /&gt;
glob_match(&amp;quot;gr[!ae]y&amp;quot;, &amp;quot;grXy&amp;quot;); // TRUE&lt;br /&gt;
glob_match(&amp;quot;gr[!ae]y&amp;quot;, &amp;quot;gry&amp;quot;); // FALSE&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_header&lt;br /&gt;
|also_functions&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|also_footer&lt;br /&gt;
|notes=* For case-insensitive match, use [[llToLower]] first.&lt;br /&gt;
|mode&lt;br /&gt;
|deprecated&lt;br /&gt;
|location&lt;br /&gt;
|cat1&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|cat5&lt;br /&gt;
|cat6&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Rhet0rica Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Rhet0rica_Resident/glob_match&amp;diff=1216884</id>
		<title>User:Rhet0rica Resident/glob match</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Rhet0rica_Resident/glob_match&amp;diff=1216884"/>
		<updated>2024-07-03T23:06:20Z</updated>

		<summary type="html">&lt;p&gt;Rhet0rica Resident: Created page with &amp;quot;{{LSLC|User-Defined Functions}} {{LSL_Function |func=glob |func_desc=Ported by rhet0rica from [https://github.com/torvalds/linux/blob/master/lib/gl...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSLC|User-Defined Functions}}&lt;br /&gt;
{{LSL_Function&lt;br /&gt;
|func=glob&lt;br /&gt;
|func_desc=Ported by [[User:Rhet0rica Resident|rhet0rica]] from [https://github.com/torvalds/linux/blob/master/lib/glob.c the Linux kernel], this function takes a pattern string and a query string as input and returns [[TRUE]] or [[FALSE]] depending on whether the query satisfies the pattern. This is the same method used by POSIX systems to match wildcards in filenames. License: Dual MIT/GPL. &amp;lt;syntaxhighlight lang=&amp;quot;lsl&amp;quot;&amp;gt;integer glob_match(string pat, string str)&lt;br /&gt;
{&lt;br /&gt;
	/*&lt;br /&gt;
	 * Backtrack to previous * on mismatch and retry starting one&lt;br /&gt;
	 * character later in the string.  Because * matches all characters&lt;br /&gt;
	 * (no exception for /), it can be easily proved that there&#039;s&lt;br /&gt;
	 * never a need to backtrack multiple levels.&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	integer back_pat = NOWHERE;&lt;br /&gt;
	integer back_str;&lt;br /&gt;
	&lt;br /&gt;
	/*&lt;br /&gt;
	 * Loop over each token (character or class) in pat, matching&lt;br /&gt;
	 * it against the remaining unmatched tail of str.  Return false&lt;br /&gt;
	 * on mismatch, or true after matching the trailing nul bytes.&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	integer str_i;&lt;br /&gt;
	integer pat_i;&lt;br /&gt;
		&lt;br /&gt;
	while (TRUE) {&lt;br /&gt;
		integer c = llOrd(str, str_i++);&lt;br /&gt;
		integer d = llOrd(pat, pat_i++);&lt;br /&gt;
		&lt;br /&gt;
		/* Wildcard: anything but nul */&lt;br /&gt;
		if(d == 0x3f) { // &#039;?&#039;&lt;br /&gt;
			if (c == 0x00) // EOL&lt;br /&gt;
				// return false;&lt;br /&gt;
				return FALSE;&lt;br /&gt;
			//break;&lt;br /&gt;
			jump skip_default;&lt;br /&gt;
		/* Any-length wildcard */&lt;br /&gt;
		} else if(d == 0x2a) { // &#039;*&#039;&lt;br /&gt;
			/* Optimize trailing * case */&lt;br /&gt;
			if(llOrd(pat, pat_i) == 0x00)&lt;br /&gt;
				return TRUE;&lt;br /&gt;
			back_pat = pat_i;&lt;br /&gt;
			/* Allow zero-length match */&lt;br /&gt;
			back_str = --str_i;&lt;br /&gt;
			jump skip_default;&lt;br /&gt;
		/* Character class */&lt;br /&gt;
		} else if(d == 0x5b) { // &#039;[&#039;&lt;br /&gt;
			integer match = FALSE;&lt;br /&gt;
			integer inverted = (llOrd(pat, pat_i) == 0x21); // &#039;!&#039;&lt;br /&gt;
			integer class_i = pat_i + inverted;&lt;br /&gt;
			integer a = llOrd(pat, class_i++);&lt;br /&gt;
&lt;br /&gt;
			/*&lt;br /&gt;
			 * Iterate over each span in the character class.&lt;br /&gt;
			 * A span is either a single character a, or a&lt;br /&gt;
			 * range a-b.  The first span may begin with &#039;]&#039;.&lt;br /&gt;
			 */&lt;br /&gt;
			do {&lt;br /&gt;
				integer b = a;&lt;br /&gt;
&lt;br /&gt;
				/* Malformed */&lt;br /&gt;
				if(a == 0x00)&lt;br /&gt;
					// goto literal;&lt;br /&gt;
					jump literal; // FIXME&lt;br /&gt;
&lt;br /&gt;
				if(llOrd(pat, class_i + 0) == 0x2d &amp;amp;&amp;amp; llOrd(pat, class_i + 1) != 0x5d) {&lt;br /&gt;
					b = llOrd(pat, class_i + 1);&lt;br /&gt;
&lt;br /&gt;
					if(b == 0x00)&lt;br /&gt;
						jump literal;&lt;br /&gt;
&lt;br /&gt;
					class_i += 2;&lt;br /&gt;
					/* Any special action if a &amp;gt; b? */&lt;br /&gt;
				}&lt;br /&gt;
				match = match | (a &amp;lt;= c &amp;amp;&amp;amp; c &amp;lt;= b);&lt;br /&gt;
			} while((a = llOrd(pat, class_i++)) != 0x5d);&lt;br /&gt;
&lt;br /&gt;
			if (match == inverted)&lt;br /&gt;
				jump backtrack;&lt;br /&gt;
			pat_i = class_i;&lt;br /&gt;
			jump skip_default;&lt;br /&gt;
		} else if(d == 0x5c) { // &#039;\\&#039;&lt;br /&gt;
			// d = *pat++;&lt;br /&gt;
			d = llOrd(pat, pat_i++);&lt;br /&gt;
			// fallthrough;&lt;br /&gt;
		}&lt;br /&gt;
		//default:	/* Literal character */&lt;br /&gt;
		@literal;&lt;br /&gt;
			if (c == d) {&lt;br /&gt;
				//if (d == &#039;\0&#039;)&lt;br /&gt;
				if(d == 0x00)&lt;br /&gt;
					return TRUE;&lt;br /&gt;
				jump skip_default;&lt;br /&gt;
			}&lt;br /&gt;
		@backtrack;&lt;br /&gt;
			if(c == 0x00 || !~back_pat)&lt;br /&gt;
				/* No point continuing */&lt;br /&gt;
				return FALSE;&lt;br /&gt;
			/* Try again from last *, one character later in str. */&lt;br /&gt;
			pat_i = back_pat;&lt;br /&gt;
			str_i = ++back_str;&lt;br /&gt;
			jump skip_default;&lt;br /&gt;
		@skip_default;&lt;br /&gt;
		#ifdef DEBUG_GLOB&lt;br /&gt;
		last_d = d;&lt;br /&gt;
		last_c = c;&lt;br /&gt;
		last_str_i = str_i;&lt;br /&gt;
		last_pat_i = pat_i;&lt;br /&gt;
		#endif&lt;br /&gt;
	}&lt;br /&gt;
	return FALSE; // unreachable&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|func_footnote&lt;br /&gt;
|return_type=integer&lt;br /&gt;
|return_text=[[TRUE]] or [[FALSE]].&lt;br /&gt;
|p1_type=string&lt;br /&gt;
|p1_name=pat&lt;br /&gt;
|p1_desc=The string to use as a template. &amp;lt;samp&amp;gt;*&amp;lt;/samp&amp;gt; matches zero or more characters, &amp;lt;samp&amp;gt;?&amp;lt;/samp&amp;gt; matches exactly one character, &amp;lt;samp&amp;gt;[abc]&amp;lt;/samp&amp;gt; matches a, b, or c, and &amp;lt;samp&amp;gt;[!abc]&amp;lt;/samp&amp;gt; matches any character but a, b, or c. Other characters are interpreted as literals.&lt;br /&gt;
|p1_hover=Pattern string.&lt;br /&gt;
|p2_type=string&lt;br /&gt;
|p2_name=str&lt;br /&gt;
|p2_desc=The query string to evaluate.&lt;br /&gt;
|p2_hover=Query string.&lt;br /&gt;
|constants&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=* An unmatched &amp;lt;samp&amp;gt;[&amp;lt;/samp&amp;gt; in the pattern string will be interpreted as a literal left square bracket.&lt;br /&gt;
* This is not a full regular expression implementation. Hyphens in character classes (square brackets) are not supported.&lt;br /&gt;
|examples&lt;br /&gt;
|helpers&lt;br /&gt;
|also_header&lt;br /&gt;
|also_functions&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|also_footer&lt;br /&gt;
|notes&lt;br /&gt;
|mode&lt;br /&gt;
|deprecated&lt;br /&gt;
|location&lt;br /&gt;
|cat1&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|cat5&lt;br /&gt;
|cat6&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Rhet0rica Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Rhet0rica_Resident&amp;diff=1216883</id>
		<title>User:Rhet0rica Resident</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Rhet0rica_Resident&amp;diff=1216883"/>
		<updated>2024-07-03T21:27:37Z</updated>

		<summary type="html">&lt;p&gt;Rhet0rica Resident: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hi. I&#039;m [https://my.secondlife.com/rhet0rica rhet0rica], lead developer for [http://nanite-systems.com/ Nanite Systems] with my business partner and RL spouse, [http://my.secondlife.com/tammypeluso133 Tamara]. I occasionally stick my nose in here with the intention of improving LSL-related pages. I am also a profligate protocol architect, and a heavy user of [[LSL_Protocol/RestrainedLoveAPI]].&lt;br /&gt;
&lt;br /&gt;
Apologies in advance if I sometimes seem rude or arrogant—what little social grace I have is hard-earned.&lt;/div&gt;</summary>
		<author><name>Rhet0rica Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Rhet0rica_Resident&amp;diff=1216882</id>
		<title>User:Rhet0rica Resident</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Rhet0rica_Resident&amp;diff=1216882"/>
		<updated>2024-07-03T21:27:01Z</updated>

		<summary type="html">&lt;p&gt;Rhet0rica Resident: Created page with &amp;quot;Hi. I&amp;#039;m [https://my.secondlife.com/rhet0rica rhet0rica], lead developer for [http://nanite-systems.com/ Nanite Systems] with my business partner and RL spouse, [http://my.seco...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hi. I&#039;m [https://my.secondlife.com/rhet0rica rhet0rica], lead developer for [http://nanite-systems.com/ Nanite Systems] with my business partner and RL spouse, [http://my.secondlife.com/tammypeluso133 Tamara]. I occasionally stick my nose in here with the intention of improving LSL-related pages. I am also a profligate protocol architect, and a heavy user of [LSL_Protocol/RestrainedLoveAPI the RLV protocol].&lt;br /&gt;
&lt;br /&gt;
Apologies in advance if I sometimes seem rude or arrogant—what little social grace I have is hard-earned.&lt;/div&gt;</summary>
		<author><name>Rhet0rica Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlFindNotecardTextSync&amp;diff=1216881</id>
		<title>LlFindNotecardTextSync</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlFindNotecardTextSync&amp;diff=1216881"/>
		<updated>2024-07-03T21:20:01Z</updated>

		<summary type="html">&lt;p&gt;Rhet0rica Resident: removed obsolete warning about large return data (that was fast!)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{LSL_Function/negative_index|false|line}}{{LSL_Function/notecard|name|uuid=true}}&lt;br /&gt;
|func_id=|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|sort=FindNotecardTextSync&lt;br /&gt;
|func=llFindNotecardTextSync&lt;br /&gt;
|return_type=list&lt;br /&gt;
|p1_type=string|p1_name=name&lt;br /&gt;
|p2_type=string|p2_name=pattern|p2_desc=The regex pattern to search for&lt;br /&gt;
|p3_type=integer|p3_name=start|p3_desc=The first line in the notecard to start the search&lt;br /&gt;
|p4_type=integer|p4_name=count|p4_desc=The maximum number of search results to return&lt;br /&gt;
|p5_type=list|p5_name=options|p5_desc=A list of options to pass into the search. (unused at this time, should be [])&lt;br /&gt;
|func_desc=Returns a list of lines and columns where the search pattern is found in the notecard.&lt;br /&gt;
|Return_text=containing a list of integers containing the locations of the found text.&lt;br /&gt;
|func_footnote=Returns a list containing only [[NAK]] if the notecard is not cached.&lt;br /&gt;
|spec=&lt;br /&gt;
Searches the text of a cached notecard for lines containing the given pattern. It returns a list of any found occurrences of pattern in the notecard. If the notecard is not in&lt;br /&gt;
the cache it returns a list containing a single entry of NAK. If no matches are found, or the notecard contains embedded items, an empty list is returned.&lt;br /&gt;
&lt;br /&gt;
Every match in the notecard is represented as a sequence of three integers [the row #, the column #, the length of the match]. In other words the returned list has a stride of 3.&lt;br /&gt;
&lt;br /&gt;
If the notecard does not exist it returns a list with a single [[NAK]] constant and will shout a message to the debug channel.  If the notecard has not been previously cached on the simulator it will return a list containing [[NAK]].&lt;br /&gt;
&lt;br /&gt;
If there is an error in the regular expression this function returns an empty list and shouts a message to the debug channel. &lt;br /&gt;
&lt;br /&gt;
Notecards are cached into a fixed-size buffer, with the oldest (least-recently read) notecard getting removed first. It is not safe to assume a notecard has been previously cached. Data for a previously cached notecard may be dropped from the cache at any time, especially on a busy server.&lt;br /&gt;
&lt;br /&gt;
|caveats=* If notecard contains embedded inventory items (such as textures and landmarks), an empty list will be returned, regardless of the search string.&lt;br /&gt;
|constants&lt;br /&gt;
|examples&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llGetNumberOfNotecardLines]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llGetNotecardLine]]|}}&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|also_tests&lt;br /&gt;
|permission&lt;br /&gt;
|notes=&lt;br /&gt;
{{LSL Regular Expressions}}&lt;br /&gt;
|cat1=Notecard&lt;br /&gt;
|cat2=&lt;br /&gt;
|cat3=&lt;br /&gt;
|cat4=&lt;br /&gt;
|history=&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Rhet0rica Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Talk:LlFindNotecardTextSync&amp;diff=1216880</id>
		<title>Talk:LlFindNotecardTextSync</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Talk:LlFindNotecardTextSync&amp;diff=1216880"/>
		<updated>2024-07-03T20:29:10Z</updated>

		<summary type="html">&lt;p&gt;Rhet0rica Resident: /* Return type of NAK */ new section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Oh, fancy. We&#039;re getting slowly to the point where we can sensibly use notecards as ROM.&lt;br /&gt;
&lt;br /&gt;
-- [[User:Peter Stindberg|Peter Stindberg]] ([[User talk:Peter Stindberg|talk]]) 13:32, 1 July 2024 (PDT)&lt;br /&gt;
&lt;br /&gt;
== Return type of NAK ==&lt;br /&gt;
&lt;br /&gt;
The article lists [[NAK]] as the return value, which seems implausible since it&#039;s a string and this function returns a list. Maybe [ [[NAK]] ] was intended? [[User:Rhet0rica Resident|rhet0rica]] ([[User talk:Rhet0rica Resident|talk]]) 13:29, 3 July 2024 (PDT)&lt;/div&gt;</summary>
		<author><name>Rhet0rica Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlFindNotecardTextSync&amp;diff=1216878</id>
		<title>LlFindNotecardTextSync</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlFindNotecardTextSync&amp;diff=1216878"/>
		<updated>2024-07-03T20:27:44Z</updated>

		<summary type="html">&lt;p&gt;Rhet0rica Resident: Added caveat about large return data&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{LSL_Function/negative_index|false|line}}{{LSL_Function/notecard|name|uuid=true}}&lt;br /&gt;
|func_id=|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|sort=FindNotecardTextSync&lt;br /&gt;
|func=llFindNotecardTextSync&lt;br /&gt;
|return_type=list&lt;br /&gt;
|p1_type=string|p1_name=name&lt;br /&gt;
|p2_type=string|p2_name=pattern|p2_desc=The regex pattern to search for&lt;br /&gt;
|func_desc=Returns a list of lines and columns where the search pattern is found in the notecard.&lt;br /&gt;
|Return_text=containing a list of integers containing the locations of the found text.&lt;br /&gt;
|func_footnote=Returns [[NAK]] if the notecard is not cached.&lt;br /&gt;
|spec=&lt;br /&gt;
Searches the text of a cached notecard for lines containing the given pattern. It returns a list of line numbers and column where a match is found. If the notecard is not in&lt;br /&gt;
the cache it returns a list containing a single entry of NAK. If no matches are found, or the notecard contains embedded items, an empty list is returned.&lt;br /&gt;
&lt;br /&gt;
If the notecard does not exist it returns a list with a single [[NAK]] constant and will shout a message to the debug channel.  If the notecard has not been previously cached on the simulator it will return a list containing [[NAK]].&lt;br /&gt;
&lt;br /&gt;
Notecards are cached into a fixed-size buffer, with the oldest (least-recently read) notecard getting removed first. It is not safe to assume a notecard has been previously cached. Data for a previously cached notecard may be dropped from the cache at any time, especially on a busy server.&lt;br /&gt;
&lt;br /&gt;
|caveats=* If notecard contains embedded inventory items (such as textures and landmarks), an empty list will be returned, regardless of the search string.&lt;br /&gt;
* Unlike [[llLinksetDataFindKeys]], this function has no count parameter, meaning it will always return all possible matches. Make sure your script has lots of free memory available to avoid stack-heap collision errors.&lt;br /&gt;
|constants&lt;br /&gt;
|examples&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llGetNumberOfNotecardLines]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llGetNotecardLine]]|}}&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|also_tests&lt;br /&gt;
|permission&lt;br /&gt;
|notes=&lt;br /&gt;
{{LSL Regular Expressions}}&lt;br /&gt;
|cat1=Notecard&lt;br /&gt;
|cat2=&lt;br /&gt;
|cat3=&lt;br /&gt;
|cat4=&lt;br /&gt;
|history=&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Rhet0rica Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlGetNotecardLineSync&amp;diff=1216787</id>
		<title>LlGetNotecardLineSync</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlGetNotecardLineSync&amp;diff=1216787"/>
		<updated>2024-06-07T23:38:15Z</updated>

		<summary type="html">&lt;p&gt;Rhet0rica Resident: Added an optimal (self-recovering) implementation.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{LSL_Function/negative_index|false|line}}{{LSL_Function/notecard|name|uuid=true}}&lt;br /&gt;
|func_id=|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|sort=GetNotecardLineSync&lt;br /&gt;
|func=llGetNotecardLineSync&lt;br /&gt;
|return_type=string&lt;br /&gt;
|p1_type=string|p1_name=name&lt;br /&gt;
|p2_type=integer|p2_name=line|p2_desc=Line number in a notecard (the index starts at zero).&lt;br /&gt;
|func_desc=Gets the {{LSLP|line}} of the notecard {{LSLP|name}} from the region&#039;s notecard cache immediately without raising a dataserver event.&lt;br /&gt;
|Return_text=containing the text of the requested line from the notecard.&lt;br /&gt;
|func_footnote=Returns [[EOF]] if {{LSLP|line}} is past the end of the notecard.&lt;br /&gt;
|spec=&lt;br /&gt;
This function returns a string containing the requested line from a notecard in prim inventory, without the need for an asynchronous dataserver event, if the notecard is cached/known in its entirety by the simulator. This speeds up acessing notecard lines tremendously, and allows for near instantaneous random access.&lt;br /&gt;
&lt;br /&gt;
If the notecard does not exist it returns the constant [[NAK]] and will shout a message to the debug channel.  If the notecard has not been previously cached on the simulator it will return the [[NAK]] constant.&lt;br /&gt;
&lt;br /&gt;
Notecards are cached into a fixed-size buffer, with the oldest (least-recently read) notecard getting removed first. It is not safe to assume a notecard has been previously cached. Data for a previously cached notecard may be dropped from the cache at any time, especially on a busy server.&lt;br /&gt;
&lt;br /&gt;
|caveats=* If notecard contains embedded inventory items (such as textures and landmarks), [[EOF]] will be returned, regardless of the line requested.&lt;br /&gt;
*If the requested line is longer than 1024 bytes the returned string will be truncated to the first 1024 bytes of the line.&lt;br /&gt;
*A dataserver event does &#039;&#039;&#039;not&#039;&#039;&#039; get raised. Therefore, other scripts in the linkset are unaware of the processed notecard lines.&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
string NOTECARD_NAME = &amp;quot;notecard&amp;quot;;&lt;br /&gt;
key READ_KEY = NULL_KEY;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        READ_KEY = llGetNumberOfNotecardLines(NOTECARD_NAME);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    dataserver(key request, string data)&lt;br /&gt;
    {&lt;br /&gt;
        if (request == READ_KEY)&lt;br /&gt;
        {&lt;br /&gt;
            integer count = (integer)data;&lt;br /&gt;
            integer index;&lt;br /&gt;
            &lt;br /&gt;
            for (index = 0; index &amp;lt; (count+1); ++index)&lt;br /&gt;
            {&lt;br /&gt;
                string line = llGetNotecardLineSync(NOTECARD_NAME, index);&lt;br /&gt;
                if (line == NAK)&lt;br /&gt;
                {&lt;br /&gt;
                    llOwnerSay(&amp;quot;---NAK---&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                else if (line == EOF)&lt;br /&gt;
                {&lt;br /&gt;
                    llOwnerSay(&amp;quot;---EOF---&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    llOwnerSay(line);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Following example to call a normal [[dataserver]] notecard read using [[llGetNotecardLine]] if llGetNotecardlineSync fails with a NAK.  Keep in mind to clear any lists you are reading data into when using the following example to keep from corrupting the integrity of the list data.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// llGetNotecardLineSync example with fall back to the old dataserver read&lt;br /&gt;
// if llGetNotecardLineSync fails with a NAK.&lt;br /&gt;
&lt;br /&gt;
string  NOTECARD_NAME = &amp;quot;notecard&amp;quot;;&lt;br /&gt;
key     READ_KEY = NULL_KEY;&lt;br /&gt;
&lt;br /&gt;
key     noteCard_qry;&lt;br /&gt;
integer noteCard_line;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // read the notecards number of lines to the&lt;br /&gt;
        // simulators cache memory&lt;br /&gt;
        READ_KEY = llGetNumberOfNotecardLines(NOTECARD_NAME);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    dataserver(key request, string data)&lt;br /&gt;
    {&lt;br /&gt;
        // read notecards using the new llGetNotecardLineSync function&lt;br /&gt;
        // from simulator cache.&lt;br /&gt;
        if (request == READ_KEY)&lt;br /&gt;
        {&lt;br /&gt;
            integer count = (integer)data;&lt;br /&gt;
            integer index;&lt;br /&gt;
            &lt;br /&gt;
            for (index = 0; index &amp;lt; (count+1); ++index)&lt;br /&gt;
            {&lt;br /&gt;
                string line = llGetNotecardLineSync(NOTECARD_NAME, index);&lt;br /&gt;
                if (line == NAK)&lt;br /&gt;
                {&lt;br /&gt;
                    // Got a notecard NAK meaning llGetNotecardLineSync had and error.&lt;br /&gt;
                    // falling back to the old dataserver event to read notecards.&lt;br /&gt;
                    llOwnerSay(&amp;quot;---NAK---&amp;quot;);&lt;br /&gt;
                    noteCard_qry = llGetNotecardLine(NOTECARD_NAME, noteCard_line);&lt;br /&gt;
                    return;  // return is needed to break the for/next loop once the NAK is encountered.&lt;br /&gt;
                }&lt;br /&gt;
                else if (line == EOF)&lt;br /&gt;
                {&lt;br /&gt;
                    // End of notecard.&lt;br /&gt;
                    llOwnerSay(&amp;quot;---EOF---&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    // do work here.&lt;br /&gt;
                    llOwnerSay(line);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // old system takes over if a NAK is encountered.&lt;br /&gt;
        if(request == noteCard_qry)&lt;br /&gt;
        {&lt;br /&gt;
            if(data == EOF)&lt;br /&gt;
            {&lt;br /&gt;
                // End of notecard encountered.&lt;br /&gt;
                llOwnerSay(&amp;quot;EOF encountered&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                // process normal notecard line, then read the next line&lt;br /&gt;
                // of the notecard.&lt;br /&gt;
                llOwnerSay(data);&lt;br /&gt;
                noteCard_qry = llGetNotecardLine(NOTECARD_NAME, ++noteCard_line);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is a more compact implementation that returns to using llGetNotecardLineSync whenever possible:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
string file_name;&lt;br /&gt;
integer file_line_number;&lt;br /&gt;
key file_request;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        file_name = llGetInventoryName(INVENTORY_NOTECARD, 0); // get the name of the first notecard in the object&#039;s inventory&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer n) {&lt;br /&gt;
        // start reading text when the object is touched (you&#039;ll probably want to move these lines to another place depending on your needs):&lt;br /&gt;
        file_line_number = 0;&lt;br /&gt;
        file_request = llGetNotecardLine(file_name, file_line_number);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    dataserver(key id, string message) {&lt;br /&gt;
        if (id == file_request) {&lt;br /&gt;
            while (message != EOF &amp;amp;&amp;amp; message != NAK) {&lt;br /&gt;
                llOwnerSay(message); // do useful things with the text here&lt;br /&gt;
                message = llGetNotecardLineSync(file_name, ++file_line_number);&lt;br /&gt;
            }&lt;br /&gt;
            if (message == NAK)&lt;br /&gt;
                file_request = llGetNotecardLine(file_name, file_line_number);&lt;br /&gt;
            if (message == EOF)&lt;br /&gt;
                llOwnerSay(&amp;quot;End of file.&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llGetNumberOfNotecardLines]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llGetNotecardLine]]|}}&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|also_tests&lt;br /&gt;
|permission&lt;br /&gt;
|cat1=Notecard&lt;br /&gt;
|cat2=&lt;br /&gt;
|cat3=&lt;br /&gt;
|cat4=&lt;br /&gt;
|history=&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Rhet0rica Resident</name></author>
	</entry>
</feed>