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 17645 days, 8 hours, 40 minutes ago.