Difference between revisions of "CcFixListDatatypes"
(New page: Walks a list, casts the elements to the appropriate types, and returns a fixed list. Useful for things like llSetPrimitiveParams when you've parsed your data out of a string. Does not cu...) |
(not the best but better) |
||
Line 50: | Line 50: | ||
{ | { | ||
//Liandra Ceawlin 2008-09-20 | //Liandra Ceawlin 2008-09-20 | ||
integer | integer i = ~llGetListLength(l); | ||
string c; | |||
@next1; | |||
@next2; | |||
while( ++i ) | |||
{ | { | ||
integer | integer test = TRUE; | ||
integer | integer j = 0; | ||
string s = llStringTrim( llList2String(l, i), STRING_TRIM); | |||
if( s ) | |||
string s = llStringTrim(llList2String(l,i),STRING_TRIM); | |||
if( s | |||
{ | { | ||
list n; | |||
if( ( | if( (llGetSubString(s, 0, 0) == "<") && (llGetSubString(s, -1, -1) == ">") ) | ||
{ | { | ||
list tl = llParseString2List(llDeleteSubString(s, -1, 0), [","], []); | |||
if( c ! | j = ~llGetListLength(tl); | ||
test = (j == -4);//TRUE if vector | |||
if( test || (j == -5) ) | |||
{ | |||
while( ++j ) | |||
{ | |||
string ts = llStringTrim(llList2String(tl, j), STRING_TRIM); | |||
integer k = ~llStringLength(ts); | |||
while( ++k ) | |||
{ | |||
c = llGetSubString(ts, k, k); | |||
if( !(integer)c && !~llSubStringIndex("0.-", c)) | |||
jump next1; | |||
} | |||
} | |||
if( test ) | |||
n = [(vector)s]; | |||
else | |||
n = [(rotation)s]; | |||
l = llListReplaceList(l, n, i, i); | |||
} | |||
} | } | ||
else | else | ||
{ | { | ||
j = ~llStringLength(s); | |||
while( ++j ) | |||
{ | { | ||
c = llGetSubString(s, j, j); | |||
if( (integer) | if( !(integer)c && c!="0" ) | ||
{ | { | ||
test = (c != "."); | |||
if(test) | |||
jump next2; | |||
} | } | ||
} | } | ||
if( test ) | |||
n = [(integer)s]; | |||
else | |||
n = [(float)s]; | |||
l = llListReplaceList(l, n, i, i); | |||
} | } | ||
} | } | ||
} | } | ||
return l; | return l; | ||
Line 143: | Line 128: | ||
for( i=0; i<llGetListLength(shape); i++ ) | for( i=0; i<llGetListLength(shape); i++ ) | ||
shape = llListReplaceList( shape, [llList2String(shape,i)], i, i ); | shape = llListReplaceList( shape, [llList2String(shape,i)], i, i ); | ||
llSay( DEBUG_CHANNEL, "This will cause an error." ); | llSay( DEBUG_CHANNEL, "This will cause an error." ); | ||
llSetPrimitiveParams( shape ); | llSetPrimitiveParams( shape ); | ||
Line 153: | Line 138: | ||
llSay( DEBUG_CHANNEL, "Done." ); | llSay( DEBUG_CHANNEL, "Done." ); | ||
} | } | ||
} | } | ||
</lsl> | </lsl> |
Revision as of 10:04, 10 October 2008
Walks a list, casts the elements to the appropriate types, and returns a fixed list. Useful for things like llSetPrimitiveParams when you've parsed your data out of a string.
Does not currently cast keys to keys. It casts them to strings.
<lsl> /////////////////////////////////////////////////////////////////////////////// // // ccFixListDatatypes // Walks a list and casts the data to the appropriate type, then returns // the cast list. Useful for things like llSetPrimitiveParams when data is // parsed from strings. // // v3 - Initial public release // v4 - Fixes parsing of negative elements in vectors and rotations. // /////////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2008, Ceawlin Creations // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // * Neither the name of Ceawlin Creations, Liandra Ceawlin, or A. J. // Taylor, nor the names of its contributors may be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // ///////////////////////////////////////////////////////////////////////////////
// This code is far from optimal, lol. list ccFixListDatatypes( list l ) {
//Liandra Ceawlin 2008-09-20 integer i = ~llGetListLength(l); string c; @next1; @next2; while( ++i ) { integer test = TRUE; integer j = 0; string s = llStringTrim( llList2String(l, i), STRING_TRIM); if( s ) { list n; if( (llGetSubString(s, 0, 0) == "<") && (llGetSubString(s, -1, -1) == ">") ) { list tl = llParseString2List(llDeleteSubString(s, -1, 0), [","], []); j = ~llGetListLength(tl); test = (j == -4);//TRUE if vector if( test || (j == -5) ) { while( ++j ) { string ts = llStringTrim(llList2String(tl, j), STRING_TRIM); integer k = ~llStringLength(ts); while( ++k ) { c = llGetSubString(ts, k, k); if( !(integer)c && !~llSubStringIndex("0.-", c)) jump next1; } } if( test ) n = [(vector)s]; else n = [(rotation)s]; l = llListReplaceList(l, n, i, i); } } else { j = ~llStringLength(s); while( ++j ) { c = llGetSubString(s, j, j); if( !(integer)c && c!="0" ) { test = (c != "."); if(test) jump next2; } } if( test ) n = [(integer)s]; else n = [(float)s]; l = llListReplaceList(l, n, i, i); } } } return l;
}
default {
on_rez( integer param ) { llSay( 0, "Open your script error/warning window and touch me to run the test." ); } touch_start(integer det) { llSay( DEBUG_CHANNEL, "Testing..." ); list shape= llGetPrimitiveParams([PRIM_TYPE]); // cast shape to all strings, like we just parsed it out of some chat or something.... integer i; for( i=0; i<llGetListLength(shape); i++ ) shape = llListReplaceList( shape, [llList2String(shape,i)], i, i ); llSay( DEBUG_CHANNEL, "This will cause an error." ); llSetPrimitiveParams( shape ); // Cast the string list into the proper datatypes. list new = ccFixListDatatypes( shape ); llSay( DEBUG_CHANNEL, "But this shouldn't..." ); llSetPrimitiveParams( [PRIM_TYPE]+new ); llSay( DEBUG_CHANNEL, "Done." ); }
} </lsl>