geocaching.frink

View or download geocaching.frink in plain text format


// This contains routines specific to geocaching, probably for geocaching.com's
// website.
//
// More general navigation algorithms are in navigation.frink

// Convert a gscode to a number.  The input value is a string and the output
// is an integer.
//
// See http://gsak.net/board/index.php?showtopic=20930&st=0&#entry151466
gsCodeToNum[code] :=
{
   code = uc[code]
   
   if length[code] <= 3
      return parseInt[code, 16]  // 3 or fewer characters parse as hex.

   if code =~ %r/^[0-9A-F]{4}$/  // Code is exactly 4 hex digits <= FFFF ?
      return parseInt[code, 16]  // if so, parse as hex

   // Otherwise parse as base 31 with special character set (no ILOSU)
   // and subtract 411120 from the value.
   str = tr[uc[code], "0123456789ABCDEFGHJKMNPQRTVWXYZ",
                      "0123456789ABCDEFGHIJKLMNOPQRSTU"]
   return parseInt[str, 31] - 411120
}


// Convert a number to a gscode.  The number should be passed in as a number,
// and not a string (i.e. if it's a string call parseInt[str] on it first.)
numToGSCode[num] :=
{
   // If the number fits into 4 hex characters, return as hex.
   if num <= 0xFFFF
      return uc[num -> base16]

   // Otherwise add 411120 to it and convert to base 31 with special character
   // set (no ILOSU).
   str = num + 411120 -> base31
   return tr[uc[str], "0123456789ABCDEFGHIJKLMNOPQRSTU",
                      "0123456789ABCDEFGHJKMNPQRTVWXYZ"]
}


// A simplified "tr" function like Perl.  TODO:  Make this part of Frink?
tr[string, fromChars, toChars] :=
{
    trdict = new dict[zip[charList[fromChars], charList[toChars]]]
    result = new array
    for c = charList[string]
       if trdict@c == undef
          result.push[c]
       else
          result.push[trdict@c]

    return join["", result]
}

// Call these like:
//
// gsCodeToNum["103WQ"]
//
// numToGSCode[516144]
//
// (The above calls should be symmetrical.)


View or download geocaching.frink in plain text format


This is a program written in the programming language Frink.
For more information, view the Frink Documentation or see More Sample Frink Programs.

Alan Eliasen was born 17927 days, 12 hours, 39 minutes ago.