Difference between revisions of "User:Void Singer/Functions"

From Second Life Wiki
Jump to navigation Jump to search
(^^; 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.)
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 13 Dec 1901 20:45:52 return the value for 13 Dec 1901 20:45:52 (-2147483648).
  Time codes before the year 1902 or past the end of 2037
  Time codes after 19 Jan 2038 03:14:07 return the value for 19 Jan 2038 03:14:07 (2147483647).
  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", ":", "."], [] )
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 ((vIntYear - 1845) >> 8){//try to avoid double flows
if (vIntYear >> 31 | vIntYear / 136){
vIntRtn = 0x7FFFFFFF + (integer)(vIntYear < 1970);
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 +
          llList2Integer( vLstStp, 4 ) * 60 +
  vIntMnth * 30 + (vIntMnth - (vIntMnth < 7) >> 1) + (vIntMnth < 2) -
          llList2Integer( vLstStp, 5 ) +
  ((vIntYear & 3) > 0) * (vIntMnth > 1) +
        (llList2Integer( vLstStp, 2 ) +
  (~-llList2Integer( vLstStp, 2 )) ) +
          (vIntYear * 365) + ((vIntYear - 2878293) >> 2) +
  llList2Integer( vLstStp, 3 ) * 3600 +
          ((2001 - vIntYear) / 100) + (vIntMnth * 30) +
  llList2Integer( vLstStp, 4 ) * 60 +
          ((vIntMnth + (integer)(vIntMnth > 8)) >> 1) -
  llList2Integer( vLstStp, 5 );
          ((vIntMnth > 2) << ((vIntYear & 3) && ((vIntYear - 100) % 200)))
}
) * 86400;
return vIntRtn;
if((vIntRtn ^ (vIntYear - 1970)) & 0x80000000)//flowed
}
vIntRtn = 0x80000000 + (vIntRtn >> 31);
 
//-- 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>

Return to top

String: Find Last Index

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

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>

Return to top

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)

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>

Return to top

Timestamp: Converters

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 * (1

Timestamp: Get Weekday from timestamp

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>

Return to top

Questions or Comments?

Feel free to leave me a note on my User Talk page.