Difference between revisions of "User:Void Singer/Functions"
Void Singer (talk | contribs) m (Undo revision 707652 (abs overflow protection (probably overkill in stamp to unix, but quite possible in unix 2 stamp))) |
(pffft i forgot about 0x80000000, that loop was unsightly; you can be clever with the values just don't cross the 1969/1970 border or it will think it has flowed. Use clever dates to avoid the border.) |
||
Line 187: | Line 187: | ||
list uUnix2StampLst( integer vIntDate ){ | list uUnix2StampLst( integer vIntDate ){ | ||
if | if (vIntDate / 2145916801){ | ||
vIntDate = 2145916800 * (1 | | vIntDate = 2145916800 * (1 | (vIntDate >> 31)); | ||
} | } | ||
integer vIntYear = 126230400; | integer vIntYear = 126230400; | ||
Line 225: | Line 225: | ||
=== List format to Unix time code. === | === List format to Unix time code. === | ||
<lsl>/*//-- Notes: | <lsl>/*//-- Notes: | ||
Time codes before the | Time codes before 13 Dec 1901 20:45:52 return the value for 13 Dec 1901 20:45:52 (-2147483648). | ||
Time codes after 19 Jan 2038 03:14:07 return the value for 19 Jan 2038 03:14:07 (2147483647). | |||
Input format is [Y, M, D, h, m, s] in numerals. Strings are converted. | Input format is [Y, M, D, h, m, s] in numerals. Strings are converted. | ||
Line 236: | Line 236: | ||
integer vIntYear = llList2Integer( vLstStp, 0 ); | integer vIntYear = llList2Integer( vLstStp, 0 ); | ||
integer vIntRtn; | integer vIntRtn; | ||
if ( | if ((vIntYear - 1845) >> 8){//try to avoid double flows | ||
vIntRtn = | vIntRtn = 0x7FFFFFFF + (vIntYear < 1970); | ||
}else{ | } else { | ||
integer vIntMnth = llList2Integer( vLstStp, 1 ); | integer vIntMnth = llList2Integer( vLstStp, 1 ); | ||
vIntRtn = llList2Integer( vLstStp, 3 ) * 3600 + | vIntRtn = llList2Integer( vLstStp, 3 ) * 3600 + | ||
llList2Integer( vLstStp, 4 ) * 60 + | llList2Integer( vLstStp, 4 ) * 60 + | ||
llList2Integer( vLstStp, 5 ) | llList2Integer( vLstStp, 5 ) + | ||
(llList2Integer( vLstStp, 2 ) + | |||
(vIntYear * 365) + ((vIntYear - 2878293) >> 2) + | |||
(vIntMnth * 30) + | |||
((vIntMnth + (vIntMnth > 8)) >> 1) - | |||
((vIntMnth > 2) << ((vIntYear & 3) && ((vIntYear - 100) % 200))) | |||
vIntRtn | ) * 86400; | ||
if((vIntRtn ^ (vIntYear - 1970)) & 0x80000000) { //sign mismatch | |||
vIntRtn = 0x80000000 + (vIntRtn >> 31); | |||
}//This could be an (over|under)flow or it could be the user being clever. | |||
} | } | ||
return vIntRtn; | return vIntRtn; |
Revision as of 22:02, 19 January 2010
String: Get Reverse Order
Reverse String Order (faster version)
<lsl>string uStringRevF( string vStrSrc ){
integer vIntCnt = llStringLength( vStrSrc ); @Loop; if (vIntCnt--){ vStrSrc += llGetSubString( vStrSrc, vIntCnt, vIntCnt ); jump Loop; } return llGetSubString( vStrSrc, llStringLength( vStrSrc ) >> 1, -1 );
} /*//-- Anti-License Text --//*/ /*// Contributed Freely to the Public Domain without limitation. //*/ /*// 2009 (CC0) [ http://creativecommons.org/publicdomain/zero/1.0 ] //*/ /*// Void Singer [ https://wiki.secondlife.com/wiki/User:Void_Singer ] //*/ /*//-- --//*/</lsl>
Reverse String Order (smaller memory version)
<lsl>string uStringRevS( string vStrSrc ){
integer vIntCnt = llStringLength( vStrSrc ); @Loop; if (vIntCnt--){ vStrSrc += llGetSubString( vStrSrc, vIntCnt, vIntCnt ); vStrSrc = llDeleteSubString( vStrSrc, vIntCnt, vIntCnt ); jump Loop; } return vStrSrc;
} /*//-- Anti-License Text --//*/ /*// Contributed Freely to the Public Domain without limitation. //*/ /*// 2009 (CC0) [ http://creativecommons.org/publicdomain/zero/1.0 ] //*/ /*// Void Singer [ https://wiki.secondlife.com/wiki/User:Void_Singer ] //*/ /*//-- --//*/</lsl>
String: Find Last Index
- This function is a companion to llSubStringIndex.
Get Last Index of String Test in String Source
<lsl>integer uGetStrIdxRev1( string vStrSrc, string vStrTst ){
integer vIdxFnd = llStringLength( vStrSrc ) - llStringLength( vStrTst ) - llStringLength( llList2String( llParseStringKeepNulls( vStrSrc, (list)vStrTst, [] ), -1) );return (vIdxFnd
List: Get Reverse Order
- These functions are companions to llListSort.
Reverse List Order (faster version)
<lsl>list uListRevF( list vLstSrc ){
integer vIntCnt = (vLstSrc != []); @Loop; if (vIntCnt--){ vLstSrc += llList2List( vLstSrc, vIntCnt, vIntCnt ); jump Loop; } return llList2List( vLstSrc, (vLstSrc != []) >> 1, -1 );
} /*//-- Anti-License Text --//*/ /*// Contributed Freely to the Public Domain without limitation. //*/ /*// 2009 (CC0) [ http://creativecommons.org/publicdomain/zero/1.0 ] //*/ /*// Void Singer [ https://wiki.secondlife.com/wiki/User:Void_Singer ] //*/ /*//-- --//*/</lsl>
Reverse List Order (smaller memory version)
<lsl>list uListRevS( list vLstSrc ){
integer vIntCnt = (vLstSrc != []); @Loop; if (vIntCnt--){ vLstSrc += llList2List( vLstSrc, vIntCnt, vIntCnt ); vLstSrc = llDeleteSubList( vLstSrc, vIntCnt, vIntCnt ); jump Loop; } return vLstSrc;
} /*//-- Anti-License Text --//*/ /*// Contributed Freely to the Public Domain without limitation. //*/ /*// 2009 (CC0) [ http://creativecommons.org/publicdomain/zero/1.0 ] //*/ /*// Void Singer [ https://wiki.secondlife.com/wiki/User:Void_Singer ] //*/ /*//-- --//*/</lsl>
List: Find Last Index
- This function is a companion to llListFindList.
- SPECIAL NOTE: this is only designed to work on string data that will NOT contain the "•" character(alt+7)... please use a different character to suit your needs.
Get Last Index of List Test in List Source
<lsl>integer uGetLstIdxRev( list vLstSrc, list vLstTst ){
integer vIdxFnd = (vLstSrc != []) + ([] != vLstTst) + ([] != llParseString2List( llList2String( llParseStringKeepNulls( llDumpList2String( vLstSrc, "•" ), (list)llDumpList2String( vLstTst, "•" ), [] ), -1 ), (list)"•", [] ));return (vIdxFnd
List: Multi-Find Index (First or Last)
- These functions are companions to llListFindList.
Get First Index in List Source of any element in List Test
<lsl>integer uMatchLstIdxFwd( list vLstSrc, list vLstTst ){
return ((llParseString2List( llList2String( llParseStringKeepNulls( llDumpList2String( vLstSrc, ";" ), vLstTst, [] ), 0 ), (list)";", [] ) != []) + 1) % ((vLstSrc != []) + 1) - 1;
} /*//-- Anti-License Text --//*/ /*// Contributed Freely to the Public Domain without limitation. //*/ /*// 2009 (CC0) [ http://creativecommons.org/publicdomain/zero/1.0 ] //*/ /*// Void Singer [ https://wiki.secondlife.com/wiki/User:Void_Singer ] //*/ /*//-- --//*/</lsl>
Get Last Index in List Source of any element in List Test
<lsl>integer uMatchLstIdxRev( list vLstSrc, list vLstTst ){
return (vLstSrc != []) - (llParseString2List( llList2String( llParseString2List( llDumpList2String( vLstSrc, ";" ), vLstTst, [] ), -1 ), (list)";", [] ) != []) - 1;
} /*//-- Anti-License Text --//*/ /*// Contributed Freely to the Public Domain without limitation. //*/ /*// 2009 (CC0) [ http://creativecommons.org/publicdomain/zero/1.0 ] //*/ /*// Void Singer [ https://wiki.secondlife.com/wiki/User:Void_Singer ] //*/ /*//-- --//*/</lsl>
Timestamp: Converters
- These Functions are companions to llGetUnixTime and llGetTimestamp.
Unix time code to list format.
<lsl> /*//-- Notes:
Time codes before the year 1902 or past the end of 2037 are capped to the first second of 1902 and 2038 respectively Output is [Y, M, D, h, m, s] list format. This version could be improved.
//*/
list uUnix2StampLst( integer vIntDate ){ if (vIntDate / 2145916801){
vIntDate = 2145916800 * (1Timestamp: Get Weekday from timestamp
- These Functions are related to llGetUnixTime and llGetTimestamp.
Weekday from Unix timestamp
<lsl>/*//-- Note:
Accurate from 1901 to 2099 (no limiting code)
//*/
string uUnix2WeekdayStr( integer vIntDat ){
return llList2String( ["Thursday", "Friday", "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday"], vIntDate % 604800 / 86400 - (vIntDate < 0) );
} /*//-- Anti-License Text --//*/ /*// Contributed Freely to the Public Domain without limitation. //*/ /*// 2009 (CC0) [ http://creativecommons.org/publicdomain/zero/1.0 ] //*/ /*// Void Singer [ https://wiki.secondlife.com/wiki/User:Void_Singer ] //*/ /*//-- --//*/</lsl>
Weekday from ( Y, M, D ) format
<lsl>/*//-- Note:
Accurate from 1901 to 2099 (no limiting code)
This version could be improved.
//*/
string uStamp2WeekdayStr( integer vIntYear, integer vIntMonth, integer vIntDay ){ return llList2String ( ["Friday", "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday"],
(vIntYear + (vIntYear >> 2) - ((vIntMonth < 3) & !(vIntYear & 3)) + vIntDay + (integer)llGetSubString( "_033614625035", vIntMonth, vIntMonth )) % 7 );
} /*//-- Anti-License Text --//*/ /*// Contributed Freely to the Public Domain without limitation. //*/ /*// 2009 (CC0) [ http://creativecommons.org/publicdomain/zero/1.0 ] //*/ /*// Void Singer [ https://wiki.secondlife.com/wiki/User:Void_Singer ] //*/ /*//-- --//*/</lsl>