User:Void Singer/Functions: Difference between revisions
^^; forgot a leap year correction affecting clever dating. 1900 and 2100 are not leap years but 2000 is ~_~ this code will not cope with the years beyond 2199 or before 1801. |
Void Singer (talk | contribs) m uStamp2UnixInt rework, comparable tested speed to previous version slighlty faster in v1, safe and double safe are slightly slower. |
||
| Line 225: | Line 225: | ||
=== List format to Unix time code. === | === List format to Unix time code. === | ||
<lsl>/*//-- Notes: | <lsl>/*//-- Notes: | ||
Time codes before | Time codes before the year 1902 or past the end of 2037 | ||
are capped to the first second of 1902 or 2038 respectively | |||
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. | ||
Elements past the end are safely ignored, for compatibility with | Elements past the end are safely ignored, for compatibility with | ||
llParseString2List( llGetTimestamp(), ["-", "T", ":", "."], [] ) | |||
Short [Y, M, D] format is supported for compatibility with | |||
llParseString2List( llGetDate(), ["-"], [] ) | |||
//*/ | //*/ | ||
//-- unsafe version (missing day/month or bad values not handled) | |||
integer uStamp2UnixInt( list vLstStp ){ | integer uStamp2UnixInt( list vLstStp ){ | ||
integer vIntYear = llList2Integer( vLstStp, 0 ); | integer vIntYear = llList2Integer( vLstStp, 0 ) - 1902; | ||
integer vIntRtn; | integer vIntRtn; | ||
if | if (vIntYear >> 31 | vIntYear / 136){ | ||
vIntRtn = | vIntRtn = 2145916800 * (1 | vIntYear >> 31); | ||
} else { | }else{ | ||
integer vIntMnth = llList2Integer( vLstStp, 1 ); | integer vIntMnth = ~-llList2Integer( vLstStp, 1 ); | ||
vIntRtn = llList2Integer( vLstStp, 3 ) * 3600 + | vIntRtn = 86400 * ((integer)(vIntYear * 365.25 + 0.25) - 24837 + | ||
vIntMnth * 30 + (vIntMnth - (vIntMnth < 7) >> 1) + (vIntMnth < 2) - | |||
((vIntYear & 3) > 0) * (vIntMnth > 1) + | |||
(~-llList2Integer( vLstStp, 2 )) ) + | |||
llList2Integer( vLstStp, 3 ) * 3600 + | |||
llList2Integer( vLstStp, 4 ) * 60 + | |||
llList2Integer( vLstStp, 5 ); | |||
} | |||
return vIntRtn; | |||
} | |||
//-- this version safely supports missing Day/Month | |||
integer uStamp2UnixInt( list vLstStp ){ | |||
integer vIntYear = llList2Integer( vLstStp, 0 ) - 1902; | |||
integer vIntRtn; | |||
if (vIntYear >> 31 | vIntYear / 136){ | |||
vIntRtn = 2145916800 * (1 | vIntYear >> 31); | |||
}else{ | |||
integer vIntMnth = ~-llList2Integer( vLstStp, 1 ); | |||
integer vIntDays = ~-llList2Integer( vLstStp, 2 ); | |||
vIntMnth += !~vIntMnth; | |||
vIntRtn = 86400 * ((integer)(vIntYear * 365.25 + 0.25) - 24837 + | |||
vIntMnth * 30 + (vIntMnth - (vIntMnth < 7) >> 1) + (vIntMnth < 2) - | |||
((vIntYear & 3) > 0) * (vIntMnth > 1) + | |||
vIntDays + !~vIntDays ) + | |||
llList2Integer( vLstStp, 3 ) * 3600 + | |||
llList2Integer( vLstStp, 4 ) * 60 + | |||
llList2Integer( vLstStp, 5 ); | |||
} | |||
return vIntRtn; | |||
} | |||
//-- Double Safe (as previous, with bad input capping) | |||
integer uStamp2UnixInt( list vLstStp ){ | |||
integer vIntYear = llList2Integer( vLstStp, 0 ) - 1902; | |||
integer vIntRtn; | |||
if (vIntYear >> 31 | vIntYear / 136){ | |||
vIntRtn = 2145916800 * (1 | vIntYear >> 31); | |||
}else{ | |||
integer vIntMnth = ~-llList2Integer( vLstStp, 1 ); | |||
integer vIntDays = ~-llList2Integer( vLstStp, 2 ); | |||
vIntMnth = llAbs( (vIntMnth + !~vIntMnth) % 12 ); | |||
vIntRtn = 86400 * ((integer)(vIntYear * 365.25 + 0.25) - 24837 + | |||
vIntMnth * 30 + (vIntMnth - (vIntMnth < 7) >> 1) + (vIntMnth < 2) - | |||
((vIntYear & 3) > 0) * (vIntMnth > 1) + | |||
llAbs( (vIntDays + !~vIntDays) % 31 ) ) + | |||
llAbs( llList2Integer( vLstStp, 3 ) % 24 ) * 3600 + | |||
llAbs( llList2Integer( vLstStp, 4 ) % 60 ) * 60 + | |||
llAbs( llList2Integer( vLstStp, 5 ) % 60 ); | |||
} | } | ||
return vIntRtn; | return vIntRtn; | ||
Revision as of 13:38, 23 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 (vIdxFndList: 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 (vIdxFndList: 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>