summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorroot <root@no.no.james.local>2015-04-23 18:31:49 +0100
committerroot <root@no.no.james.local>2015-04-23 18:31:49 +0100
commit8d24cdce756fc8a4b9ef0b273b841b18b0837f04 (patch)
tree6d2d9c9f281a1b2ee5210fb8eeabc2af49566738
downloadpython-8d24cdce756fc8a4b9ef0b273b841b18b0837f04.tar.gz
python-8d24cdce756fc8a4b9ef0b273b841b18b0837f04.tar.bz2
python-8d24cdce756fc8a4b9ef0b273b841b18b0837f04.zip
meh
-rw-r--r--librns510.c96
-rw-r--r--librns510.h3
-rw-r--r--rns510.html463
-rw-r--r--rns510.pyx47
-rwxr-xr-xsetup.py16
5 files changed, 625 insertions, 0 deletions
diff --git a/librns510.c b/librns510.c
new file mode 100644
index 0000000..060c766
--- /dev/null
+++ b/librns510.c
@@ -0,0 +1,96 @@
+#include <stdint.h>
+#include <byteswap.h>
+#include <stdio.h>
+#include <string.h>
+#include <strings.h>
+#include <stdlib.h>
+#include <inttypes.h>
+
+#define POI_CA 0x80000034 /*0 */
+#define POI_CB 0xF1C71CD4 /*160 */
+//
+#define ZERO (POI_CA)
+#define SCALE (((double) (POI_CB-POI_CA))/160.)
+
+static void
+fromz (int64_t a, double *lat, double *lon)
+{
+ uint64_t b, c;
+ uint32_t d, e, f;
+
+ memcpy (&b, &a, sizeof (a));
+ e = f = 0;
+
+ for (c = 1, d = 1; c; c <<= 1, d <<= 1)
+ {
+ if (b & c)
+ e |= d;
+ c <<= 1;
+ if (b & c)
+ f |= d;
+ }
+
+ *lon = e;
+ *lat = f;
+
+ *lon -= ZERO;
+ *lat -= ZERO;
+
+ *lon /= SCALE;
+ *lat /= SCALE;
+
+}
+
+static void
+toz (double lat, double lon, int64_t * a)
+{
+ uint64_t b, c;
+ uint32_t d, e, f;
+
+ lon *= SCALE;
+ lat *= SCALE;
+ lon += ZERO;
+ lat += ZERO;
+
+ e = (uint32_t) (lon + .5);
+ f = (uint32_t) (lat + .5);
+
+ //printf("%.1f %x\n",lat-ZERO, e,f);
+
+ b = 0;
+ for (c = 1, d = 1; c; c <<= 1, d <<= 1)
+ {
+ if (e & d)
+ b |= c;
+ c <<= 1;
+ if (f & d)
+ b |= c;
+ }
+
+
+ memcpy (a, &b, sizeof (*a));
+}
+
+void
+librns510_encode (const char *slat, const char *slon, char *out)
+{
+ double lat = atof (slat), lon = atof (slon);
+ int64_t z;
+
+ toz (lat, lon, &z);
+
+ sprintf (out, "%" PRId64, z);
+}
+
+void
+librns510_decode (const char *code, char *slat, char *slon)
+{
+ double lat, lon;
+ int64_t z = atoll (code);
+
+ fromz (z, &lat, &lon);
+
+ sprintf (slat, "%.10f", lat);
+ sprintf (slon, "%.10f", lon);
+
+}
diff --git a/librns510.h b/librns510.h
new file mode 100644
index 0000000..377ba61
--- /dev/null
+++ b/librns510.h
@@ -0,0 +1,3 @@
+/* librns510.c */
+void librns510_encode (const char *slat, const char *slon, char *out);
+void librns510_decode (const char *code, char *slat, char *slon);
diff --git a/rns510.html b/rns510.html
new file mode 100644
index 0000000..4a4f67e
--- /dev/null
+++ b/rns510.html
@@ -0,0 +1,463 @@
+<!DOCTYPE html>
+<!-- Generated by Cython 0.21.1 -->
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <style type="text/css">
+
+body.cython { font-family: courier; font-size: 12; }
+
+.cython.tag { }
+.cython.line { margin: 0em }
+.cython.code { font-size: 9; color: #444444; display: none; margin: 0px 0px 0px 20px; }
+
+.cython.code .py_c_api { color: red; }
+.cython.code .py_macro_api { color: #FF7000; }
+.cython.code .pyx_c_api { color: #FF3000; }
+.cython.code .pyx_macro_api { color: #FF7000; }
+.cython.code .refnanny { color: #FFA000; }
+.cython.code .error_goto { color: #FFA000; }
+
+.cython.code .coerce { color: #008000; border: 1px dotted #008000 }
+.cython.code .py_attr { color: #FF0000; font-weight: bold; }
+.cython.code .c_attr { color: #0000FF; }
+.cython.code .py_call { color: #FF0000; font-weight: bold; }
+.cython.code .c_call { color: #0000FF; }
+
+.cython.score-0 {background-color: #FFFFff;}
+.cython.score-1 {background-color: #FFFFe7;}
+.cython.score-2 {background-color: #FFFFd4;}
+.cython.score-3 {background-color: #FFFFc4;}
+.cython.score-4 {background-color: #FFFFb6;}
+.cython.score-5 {background-color: #FFFFaa;}
+.cython.score-6 {background-color: #FFFF9f;}
+.cython.score-7 {background-color: #FFFF96;}
+.cython.score-8 {background-color: #FFFF8d;}
+.cython.score-9 {background-color: #FFFF86;}
+.cython.score-10 {background-color: #FFFF7f;}
+.cython.score-11 {background-color: #FFFF79;}
+.cython.score-12 {background-color: #FFFF73;}
+.cython.score-13 {background-color: #FFFF6e;}
+.cython.score-14 {background-color: #FFFF6a;}
+.cython.score-15 {background-color: #FFFF66;}
+.cython.score-16 {background-color: #FFFF62;}
+.cython.score-17 {background-color: #FFFF5e;}
+.cython.score-18 {background-color: #FFFF5b;}
+.cython.score-19 {background-color: #FFFF57;}
+.cython.score-20 {background-color: #FFFF55;}
+.cython.score-21 {background-color: #FFFF52;}
+.cython.score-22 {background-color: #FFFF4f;}
+.cython.score-23 {background-color: #FFFF4d;}
+.cython.score-24 {background-color: #FFFF4b;}
+.cython.score-25 {background-color: #FFFF48;}
+.cython.score-26 {background-color: #FFFF46;}
+.cython.score-27 {background-color: #FFFF44;}
+.cython.score-28 {background-color: #FFFF43;}
+.cython.score-29 {background-color: #FFFF41;}
+.cython.score-30 {background-color: #FFFF3f;}
+.cython.score-31 {background-color: #FFFF3e;}
+.cython.score-32 {background-color: #FFFF3c;}
+.cython.score-33 {background-color: #FFFF3b;}
+.cython.score-34 {background-color: #FFFF39;}
+.cython.score-35 {background-color: #FFFF38;}
+.cython.score-36 {background-color: #FFFF37;}
+.cython.score-37 {background-color: #FFFF36;}
+.cython.score-38 {background-color: #FFFF35;}
+.cython.score-39 {background-color: #FFFF34;}
+.cython.score-40 {background-color: #FFFF33;}
+.cython.score-41 {background-color: #FFFF32;}
+.cython.score-42 {background-color: #FFFF31;}
+.cython.score-43 {background-color: #FFFF30;}
+.cython.score-44 {background-color: #FFFF2f;}
+.cython.score-45 {background-color: #FFFF2e;}
+.cython.score-46 {background-color: #FFFF2d;}
+.cython.score-47 {background-color: #FFFF2c;}
+.cython.score-48 {background-color: #FFFF2b;}
+.cython.score-49 {background-color: #FFFF2b;}
+.cython.score-50 {background-color: #FFFF2a;}
+.cython.score-51 {background-color: #FFFF29;}
+.cython.score-52 {background-color: #FFFF29;}
+.cython.score-53 {background-color: #FFFF28;}
+.cython.score-54 {background-color: #FFFF27;}
+.cython.score-55 {background-color: #FFFF27;}
+.cython.score-56 {background-color: #FFFF26;}
+.cython.score-57 {background-color: #FFFF26;}
+.cython.score-58 {background-color: #FFFF25;}
+.cython.score-59 {background-color: #FFFF24;}
+.cython.score-60 {background-color: #FFFF24;}
+.cython.score-61 {background-color: #FFFF23;}
+.cython.score-62 {background-color: #FFFF23;}
+.cython.score-63 {background-color: #FFFF22;}
+.cython.score-64 {background-color: #FFFF22;}
+.cython.score-65 {background-color: #FFFF22;}
+.cython.score-66 {background-color: #FFFF21;}
+.cython.score-67 {background-color: #FFFF21;}
+.cython.score-68 {background-color: #FFFF20;}
+.cython.score-69 {background-color: #FFFF20;}
+.cython.score-70 {background-color: #FFFF1f;}
+.cython.score-71 {background-color: #FFFF1f;}
+.cython.score-72 {background-color: #FFFF1f;}
+.cython.score-73 {background-color: #FFFF1e;}
+.cython.score-74 {background-color: #FFFF1e;}
+.cython.score-75 {background-color: #FFFF1e;}
+.cython.score-76 {background-color: #FFFF1d;}
+.cython.score-77 {background-color: #FFFF1d;}
+.cython.score-78 {background-color: #FFFF1c;}
+.cython.score-79 {background-color: #FFFF1c;}
+.cython.score-80 {background-color: #FFFF1c;}
+.cython.score-81 {background-color: #FFFF1c;}
+.cython.score-82 {background-color: #FFFF1b;}
+.cython.score-83 {background-color: #FFFF1b;}
+.cython.score-84 {background-color: #FFFF1b;}
+.cython.score-85 {background-color: #FFFF1a;}
+.cython.score-86 {background-color: #FFFF1a;}
+.cython.score-87 {background-color: #FFFF1a;}
+.cython.score-88 {background-color: #FFFF1a;}
+.cython.score-89 {background-color: #FFFF19;}
+.cython.score-90 {background-color: #FFFF19;}
+.cython.score-91 {background-color: #FFFF19;}
+.cython.score-92 {background-color: #FFFF19;}
+.cython.score-93 {background-color: #FFFF18;}
+.cython.score-94 {background-color: #FFFF18;}
+.cython.score-95 {background-color: #FFFF18;}
+.cython.score-96 {background-color: #FFFF18;}
+.cython.score-97 {background-color: #FFFF17;}
+.cython.score-98 {background-color: #FFFF17;}
+.cython.score-99 {background-color: #FFFF17;}
+.cython.score-100 {background-color: #FFFF17;}
+.cython.score-101 {background-color: #FFFF16;}
+.cython.score-102 {background-color: #FFFF16;}
+.cython.score-103 {background-color: #FFFF16;}
+.cython.score-104 {background-color: #FFFF16;}
+.cython.score-105 {background-color: #FFFF16;}
+.cython.score-106 {background-color: #FFFF15;}
+.cython.score-107 {background-color: #FFFF15;}
+.cython.score-108 {background-color: #FFFF15;}
+.cython.score-109 {background-color: #FFFF15;}
+.cython.score-110 {background-color: #FFFF15;}
+.cython.score-111 {background-color: #FFFF15;}
+.cython.score-112 {background-color: #FFFF14;}
+.cython.score-113 {background-color: #FFFF14;}
+.cython.score-114 {background-color: #FFFF14;}
+.cython.score-115 {background-color: #FFFF14;}
+.cython.score-116 {background-color: #FFFF14;}
+.cython.score-117 {background-color: #FFFF14;}
+.cython.score-118 {background-color: #FFFF13;}
+.cython.score-119 {background-color: #FFFF13;}
+.cython.score-120 {background-color: #FFFF13;}
+.cython.score-121 {background-color: #FFFF13;}
+.cython.score-122 {background-color: #FFFF13;}
+.cython.score-123 {background-color: #FFFF13;}
+.cython.score-124 {background-color: #FFFF13;}
+.cython.score-125 {background-color: #FFFF12;}
+.cython.score-126 {background-color: #FFFF12;}
+.cython.score-127 {background-color: #FFFF12;}
+.cython.score-128 {background-color: #FFFF12;}
+.cython.score-129 {background-color: #FFFF12;}
+.cython.score-130 {background-color: #FFFF12;}
+.cython.score-131 {background-color: #FFFF12;}
+.cython.score-132 {background-color: #FFFF11;}
+.cython.score-133 {background-color: #FFFF11;}
+.cython.score-134 {background-color: #FFFF11;}
+.cython.score-135 {background-color: #FFFF11;}
+.cython.score-136 {background-color: #FFFF11;}
+.cython.score-137 {background-color: #FFFF11;}
+.cython.score-138 {background-color: #FFFF11;}
+.cython.score-139 {background-color: #FFFF11;}
+.cython.score-140 {background-color: #FFFF11;}
+.cython.score-141 {background-color: #FFFF10;}
+.cython.score-142 {background-color: #FFFF10;}
+.cython.score-143 {background-color: #FFFF10;}
+.cython.score-144 {background-color: #FFFF10;}
+.cython.score-145 {background-color: #FFFF10;}
+.cython.score-146 {background-color: #FFFF10;}
+.cython.score-147 {background-color: #FFFF10;}
+.cython.score-148 {background-color: #FFFF10;}
+.cython.score-149 {background-color: #FFFF10;}
+.cython.score-150 {background-color: #FFFF0f;}
+.cython.score-151 {background-color: #FFFF0f;}
+.cython.score-152 {background-color: #FFFF0f;}
+.cython.score-153 {background-color: #FFFF0f;}
+.cython.score-154 {background-color: #FFFF0f;}
+.cython.score-155 {background-color: #FFFF0f;}
+.cython.score-156 {background-color: #FFFF0f;}
+.cython.score-157 {background-color: #FFFF0f;}
+.cython.score-158 {background-color: #FFFF0f;}
+.cython.score-159 {background-color: #FFFF0f;}
+.cython.score-160 {background-color: #FFFF0f;}
+.cython.score-161 {background-color: #FFFF0e;}
+.cython.score-162 {background-color: #FFFF0e;}
+.cython.score-163 {background-color: #FFFF0e;}
+.cython.score-164 {background-color: #FFFF0e;}
+.cython.score-165 {background-color: #FFFF0e;}
+.cython.score-166 {background-color: #FFFF0e;}
+.cython.score-167 {background-color: #FFFF0e;}
+.cython.score-168 {background-color: #FFFF0e;}
+.cython.score-169 {background-color: #FFFF0e;}
+.cython.score-170 {background-color: #FFFF0e;}
+.cython.score-171 {background-color: #FFFF0e;}
+.cython.score-172 {background-color: #FFFF0e;}
+.cython.score-173 {background-color: #FFFF0d;}
+.cython.score-174 {background-color: #FFFF0d;}
+.cython.score-175 {background-color: #FFFF0d;}
+.cython.score-176 {background-color: #FFFF0d;}
+.cython.score-177 {background-color: #FFFF0d;}
+.cython.score-178 {background-color: #FFFF0d;}
+.cython.score-179 {background-color: #FFFF0d;}
+.cython.score-180 {background-color: #FFFF0d;}
+.cython.score-181 {background-color: #FFFF0d;}
+.cython.score-182 {background-color: #FFFF0d;}
+.cython.score-183 {background-color: #FFFF0d;}
+.cython.score-184 {background-color: #FFFF0d;}
+.cython.score-185 {background-color: #FFFF0d;}
+.cython.score-186 {background-color: #FFFF0d;}
+.cython.score-187 {background-color: #FFFF0c;}
+.cython.score-188 {background-color: #FFFF0c;}
+.cython.score-189 {background-color: #FFFF0c;}
+.cython.score-190 {background-color: #FFFF0c;}
+.cython.score-191 {background-color: #FFFF0c;}
+.cython.score-192 {background-color: #FFFF0c;}
+.cython.score-193 {background-color: #FFFF0c;}
+.cython.score-194 {background-color: #FFFF0c;}
+.cython.score-195 {background-color: #FFFF0c;}
+.cython.score-196 {background-color: #FFFF0c;}
+.cython.score-197 {background-color: #FFFF0c;}
+.cython.score-198 {background-color: #FFFF0c;}
+.cython.score-199 {background-color: #FFFF0c;}
+.cython.score-200 {background-color: #FFFF0c;}
+.cython.score-201 {background-color: #FFFF0c;}
+.cython.score-202 {background-color: #FFFF0c;}
+.cython.score-203 {background-color: #FFFF0b;}
+.cython.score-204 {background-color: #FFFF0b;}
+.cython.score-205 {background-color: #FFFF0b;}
+.cython.score-206 {background-color: #FFFF0b;}
+.cython.score-207 {background-color: #FFFF0b;}
+.cython.score-208 {background-color: #FFFF0b;}
+.cython.score-209 {background-color: #FFFF0b;}
+.cython.score-210 {background-color: #FFFF0b;}
+.cython.score-211 {background-color: #FFFF0b;}
+.cython.score-212 {background-color: #FFFF0b;}
+.cython.score-213 {background-color: #FFFF0b;}
+.cython.score-214 {background-color: #FFFF0b;}
+.cython.score-215 {background-color: #FFFF0b;}
+.cython.score-216 {background-color: #FFFF0b;}
+.cython.score-217 {background-color: #FFFF0b;}
+.cython.score-218 {background-color: #FFFF0b;}
+.cython.score-219 {background-color: #FFFF0b;}
+.cython.score-220 {background-color: #FFFF0b;}
+.cython.score-221 {background-color: #FFFF0b;}
+.cython.score-222 {background-color: #FFFF0a;}
+.cython.score-223 {background-color: #FFFF0a;}
+.cython.score-224 {background-color: #FFFF0a;}
+.cython.score-225 {background-color: #FFFF0a;}
+.cython.score-226 {background-color: #FFFF0a;}
+.cython.score-227 {background-color: #FFFF0a;}
+.cython.score-228 {background-color: #FFFF0a;}
+.cython.score-229 {background-color: #FFFF0a;}
+.cython.score-230 {background-color: #FFFF0a;}
+.cython.score-231 {background-color: #FFFF0a;}
+.cython.score-232 {background-color: #FFFF0a;}
+.cython.score-233 {background-color: #FFFF0a;}
+.cython.score-234 {background-color: #FFFF0a;}
+.cython.score-235 {background-color: #FFFF0a;}
+.cython.score-236 {background-color: #FFFF0a;}
+.cython.score-237 {background-color: #FFFF0a;}
+.cython.score-238 {background-color: #FFFF0a;}
+.cython.score-239 {background-color: #FFFF0a;}
+.cython.score-240 {background-color: #FFFF0a;}
+.cython.score-241 {background-color: #FFFF0a;}
+.cython.score-242 {background-color: #FFFF0a;}
+.cython.score-243 {background-color: #FFFF0a;}
+.cython.score-244 {background-color: #FFFF0a;}
+.cython.score-245 {background-color: #FFFF0a;}
+.cython.score-246 {background-color: #FFFF09;}
+.cython.score-247 {background-color: #FFFF09;}
+.cython.score-248 {background-color: #FFFF09;}
+.cython.score-249 {background-color: #FFFF09;}
+.cython.score-250 {background-color: #FFFF09;}
+.cython.score-251 {background-color: #FFFF09;}
+.cython.score-252 {background-color: #FFFF09;}
+.cython.score-253 {background-color: #FFFF09;}
+.cython.score-254 {background-color: #FFFF09;}.cython .hll { background-color: #ffffcc }
+.cython { background: #f8f8f8; }
+.cython .c { color: #408080; font-style: italic } /* Comment */
+.cython .err { border: 1px solid #FF0000 } /* Error */
+.cython .k { color: #008000; font-weight: bold } /* Keyword */
+.cython .o { color: #666666 } /* Operator */
+.cython .cm { color: #408080; font-style: italic } /* Comment.Multiline */
+.cython .cp { color: #BC7A00 } /* Comment.Preproc */
+.cython .c1 { color: #408080; font-style: italic } /* Comment.Single */
+.cython .cs { color: #408080; font-style: italic } /* Comment.Special */
+.cython .gd { color: #A00000 } /* Generic.Deleted */
+.cython .ge { font-style: italic } /* Generic.Emph */
+.cython .gr { color: #FF0000 } /* Generic.Error */
+.cython .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.cython .gi { color: #00A000 } /* Generic.Inserted */
+.cython .go { color: #888888 } /* Generic.Output */
+.cython .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
+.cython .gs { font-weight: bold } /* Generic.Strong */
+.cython .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.cython .gt { color: #0044DD } /* Generic.Traceback */
+.cython .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
+.cython .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
+.cython .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
+.cython .kp { color: #008000 } /* Keyword.Pseudo */
+.cython .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
+.cython .kt { color: #B00040 } /* Keyword.Type */
+.cython .m { color: #666666 } /* Literal.Number */
+.cython .s { color: #BA2121 } /* Literal.String */
+.cython .na { color: #7D9029 } /* Name.Attribute */
+.cython .nb { color: #008000 } /* Name.Builtin */
+.cython .nc { color: #0000FF; font-weight: bold } /* Name.Class */
+.cython .no { color: #880000 } /* Name.Constant */
+.cython .nd { color: #AA22FF } /* Name.Decorator */
+.cython .ni { color: #999999; font-weight: bold } /* Name.Entity */
+.cython .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
+.cython .nf { color: #0000FF } /* Name.Function */
+.cython .nl { color: #A0A000 } /* Name.Label */
+.cython .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
+.cython .nt { color: #008000; font-weight: bold } /* Name.Tag */
+.cython .nv { color: #19177C } /* Name.Variable */
+.cython .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
+.cython .w { color: #bbbbbb } /* Text.Whitespace */
+.cython .mf { color: #666666 } /* Literal.Number.Float */
+.cython .mh { color: #666666 } /* Literal.Number.Hex */
+.cython .mi { color: #666666 } /* Literal.Number.Integer */
+.cython .mo { color: #666666 } /* Literal.Number.Oct */
+.cython .sb { color: #BA2121 } /* Literal.String.Backtick */
+.cython .sc { color: #BA2121 } /* Literal.String.Char */
+.cython .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
+.cython .s2 { color: #BA2121 } /* Literal.String.Double */
+.cython .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
+.cython .sh { color: #BA2121 } /* Literal.String.Heredoc */
+.cython .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
+.cython .sx { color: #008000 } /* Literal.String.Other */
+.cython .sr { color: #BB6688 } /* Literal.String.Regex */
+.cython .s1 { color: #BA2121 } /* Literal.String.Single */
+.cython .ss { color: #19177C } /* Literal.String.Symbol */
+.cython .bp { color: #008000 } /* Name.Builtin.Pseudo */
+.cython .vc { color: #19177C } /* Name.Variable.Class */
+.cython .vg { color: #19177C } /* Name.Variable.Global */
+.cython .vi { color: #19177C } /* Name.Variable.Instance */
+.cython .il { color: #666666 } /* Literal.Number.Integer.Long */
+ </style>
+ <script>
+ function toggleDiv(id) {
+ theDiv = id.nextElementSibling
+ if (theDiv.style.display != 'block') theDiv.style.display = 'block';
+ else theDiv.style.display = 'none';
+ }
+ </script>
+</head>
+<body class="cython">
+<p>Generated by Cython 0.21.1</p>
+<p>Raw output: <a href="rns510.c">rns510.c</a></p>
+<div class="cython"><pre class='cython line score-0'>&#xA0;01: <span class="k">import</span> <span class="nn">cython</span></pre>
+<pre class='cython line score-0'>&#xA0;02: </pre>
+<pre class='cython line score-0'>&#xA0;03: <span class="k">from</span> <span class="nn">libc.stdlib</span> <span class="k">cimport</span> <span class="n">malloc</span></pre>
+<pre class='cython line score-0'>&#xA0;04: <span class="k">from</span> <span class="nn">libc.stdlib</span> <span class="k">cimport</span> <span class="n">free</span></pre>
+<pre class='cython line score-0'>&#xA0;05: </pre>
+<pre class='cython line score-0'>&#xA0;06: <span class="k">cdef</span> <span class="kr">extern</span> <span class="k">from</span> <span class="s">&quot;librns510.h&quot;</span><span class="p">:</span></pre>
+<pre class='cython line score-0'>&#xA0;07: <span class="n">void</span> <span class="n">librns510_encode</span><span class="p">(</span><span class="n">const</span> <span class="n">char</span> <span class="o">*</span><span class="n">lat</span><span class="p">,</span> <span class="n">const</span> <span class="n">char</span> <span class="o">*</span><span class="n">lon</span><span class="p">,</span> <span class="n">char</span> <span class="o">*</span><span class="n">code</span><span class="p">)</span></pre>
+<pre class='cython line score-0'>&#xA0;08: <span class="k">cdef</span> <span class="kr">extern</span> <span class="k">from</span> <span class="s">&quot;librns510.h&quot;</span><span class="p">:</span></pre>
+<pre class='cython line score-0'>&#xA0;09: <span class="n">char</span> <span class="o">*</span><span class="n">librns510_decode</span><span class="p">(</span><span class="n">const</span> <span class="n">char</span> <span class="o">*</span><span class="n">code</span><span class="p">,</span> <span class="n">char</span> <span class="o">*</span><span class="n">lat</span><span class="p">,</span> <span class="n">char</span> <span class="o">*</span><span class="n">lon</span><span class="p">)</span></pre>
+<pre class='cython line score-0'>&#xA0;10: </pre>
+<pre class='cython line score-4' onclick='toggleDiv(this)'>+11: <span class="k">cdef</span> <span class="nf">rns510_encode</span><span class="p">(</span><span class="n">char</span> <span class="o">*</span><span class="n">lat</span><span class="p">,</span> <span class="n">char</span> <span class="o">*</span><span class="n">lon</span><span class="p">):</span></pre>
+<pre class='cython code score-4'>static PyObject *__pyx_f_6rns510_rns510_encode(char *__pyx_v_lat, char *__pyx_v_lon) {
+ PyObject *__pyx_v_py_string = 0;
+ char *__pyx_v_out;
+ PyObject *__pyx_r = NULL;
+ <span class='refnanny'>__Pyx_RefNannyDeclarations</span>
+ <span class='refnanny'>__Pyx_RefNannySetupContext</span>("rns510_encode", 0);
+/* … */
+ /* function exit code */
+ __pyx_L1_error:;
+ <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1);
+ <span class='pyx_c_api'>__Pyx_AddTraceback</span>("rns510.rns510_encode", __pyx_clineno, __pyx_lineno, __pyx_filename);
+ __pyx_r = 0;
+ __pyx_L0:;
+ <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_v_py_string);
+ <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r);
+ <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();
+ return __pyx_r;
+}
+</pre><pre class='cython line score-5' onclick='toggleDiv(this)'>+12: <span class="k">assert</span> <span class="n">lat</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">NULL</span></pre>
+<pre class='cython code score-5'> #ifndef CYTHON_WITHOUT_ASSERTIONS
+ if (unlikely(!Py_OptimizeFlag)) {
+ if (unlikely(!((__pyx_v_lat != NULL) != 0))) {
+ <span class='py_c_api'>PyErr_SetNone</span>(PyExc_AssertionError);
+ <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>
+ }
+ }
+ #endif
+</pre><pre class='cython line score-5' onclick='toggleDiv(this)'>+13: <span class="k">assert</span> <span class="n">lon</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">NULL</span></pre>
+<pre class='cython code score-5'> #ifndef CYTHON_WITHOUT_ASSERTIONS
+ if (unlikely(!Py_OptimizeFlag)) {
+ if (unlikely(!((__pyx_v_lon != NULL) != 0))) {
+ <span class='py_c_api'>PyErr_SetNone</span>(PyExc_AssertionError);
+ <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>
+ }
+ }
+ #endif
+</pre><pre class='cython line score-0'>&#xA0;14: <span class="k">cdef</span> <span class="kt">bytes</span> <span class="nf">py_string</span></pre>
+<pre class='cython line score-0'>&#xA0;15: <span class="k">cdef</span> <span class="kt">char</span> *<span class="kt">out</span>;</pre>
+<pre class='cython line score-0'>&#xA0;16: </pre>
+<pre class='cython line score-0' onclick='toggleDiv(this)'>+17: <span class="n">out</span><span class="o">=&lt;</span><span class="n">char</span> <span class="o">*&gt;</span> <span class="n">malloc</span><span class="p">(</span><span class="mf">128</span><span class="p">)</span></pre>
+<pre class='cython code score-0'> __pyx_v_out = ((char *)malloc(128));
+</pre><pre class='cython line score-0' onclick='toggleDiv(this)'>+18: <span class="n">librns510_encode</span><span class="p">(</span><span class="n">lat</span><span class="p">,</span><span class="n">lon</span><span class="p">,</span><span class="n">out</span><span class="p">)</span></pre>
+<pre class='cython code score-0'> librns510_encode(__pyx_v_lat, __pyx_v_lon, __pyx_v_out);
+</pre><pre class='cython line score-0' onclick='toggleDiv(this)'>+19: <span class="k">try</span><span class="p">:</span></pre>
+<pre class='cython code score-0'> /*try:*/ {
+</pre><pre class='cython line score-2' onclick='toggleDiv(this)'>+20: <span class="n">py_string</span><span class="o">=</span><span class="n">out</span></pre>
+<pre class='cython code score-2'> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyBytes_FromString</span>(__pyx_v_out);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L4_error;}</span>
+ <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);
+ __pyx_v_py_string = ((PyObject*)__pyx_t_1);
+ __pyx_t_1 = 0;
+ }
+</pre><pre class='cython line score-0'>&#xA0;21: <span class="k">finally</span><span class="p">:</span></pre>
+<pre class='cython line score-11' onclick='toggleDiv(this)'>+22: <span class="n">free</span><span class="p">(</span><span class="n">out</span><span class="p">)</span></pre>
+<pre class='cython code score-11'> /*finally:*/ {
+ /*normal exit:*/{
+ free(__pyx_v_out);
+ goto __pyx_L5;
+ }
+ /*exception exit:*/{
+ __pyx_L4_error:;
+ __pyx_t_5 = 0; __pyx_t_6 = 0; __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0;
+ <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1); __pyx_t_1 = 0;
+ if (PY_MAJOR_VERSION &gt;= 3) <span class='pyx_c_api'>__Pyx_ExceptionSwap</span>(&amp;__pyx_t_8, &amp;__pyx_t_9, &amp;__pyx_t_10);
+ if ((PY_MAJOR_VERSION &lt; 3) || unlikely(<span class='pyx_c_api'>__Pyx_GetException</span>(&amp;__pyx_t_5, &amp;__pyx_t_6, &amp;__pyx_t_7) &lt; 0)) <span class='pyx_c_api'>__Pyx_ErrFetch</span>(&amp;__pyx_t_5, &amp;__pyx_t_6, &amp;__pyx_t_7);
+ <span class='refnanny'>__Pyx_XGOTREF</span>(__pyx_t_5);
+ <span class='refnanny'>__Pyx_XGOTREF</span>(__pyx_t_6);
+ <span class='refnanny'>__Pyx_XGOTREF</span>(__pyx_t_7);
+ <span class='refnanny'>__Pyx_XGOTREF</span>(__pyx_t_8);
+ <span class='refnanny'>__Pyx_XGOTREF</span>(__pyx_t_9);
+ <span class='refnanny'>__Pyx_XGOTREF</span>(__pyx_t_10);
+ __pyx_t_2 = __pyx_lineno; __pyx_t_3 = __pyx_clineno; __pyx_t_4 = __pyx_filename;
+ {
+ free(__pyx_v_out);
+ }
+ if (PY_MAJOR_VERSION &gt;= 3) {
+ <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_t_8);
+ <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_t_9);
+ <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_t_10);
+ <span class='pyx_c_api'>__Pyx_ExceptionReset</span>(__pyx_t_8, __pyx_t_9, __pyx_t_10);
+ }
+ <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_t_5);
+ <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_t_6);
+ <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_t_7);
+ <span class='pyx_c_api'>__Pyx_ErrRestore</span>(__pyx_t_5, __pyx_t_6, __pyx_t_7);
+ __pyx_t_5 = 0; __pyx_t_6 = 0; __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0;
+ __pyx_lineno = __pyx_t_2; __pyx_clineno = __pyx_t_3; __pyx_filename = __pyx_t_4;
+ goto __pyx_L1_error;
+ }
+ __pyx_L5:;
+ }
+</pre><pre class='cython line score-0'>&#xA0;23: </pre>
+<pre class='cython line score-2' onclick='toggleDiv(this)'>+24: <span class="k">return</span> <span class="n">py_string</span></pre>
+<pre class='cython code score-2'> <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r);
+ <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_v_py_string);
+ __pyx_r = __pyx_v_py_string;
+ goto __pyx_L0;
+</pre><pre class='cython line score-0'>&#xA0;25: </pre>
+</div></body></html>
diff --git a/rns510.pyx b/rns510.pyx
new file mode 100644
index 0000000..ca0f0ff
--- /dev/null
+++ b/rns510.pyx
@@ -0,0 +1,47 @@
+import cython
+
+from libc.stdlib cimport malloc
+from libc.stdlib cimport free
+
+cdef extern from "librns510.h":
+ void librns510_encode(const char *lat, const char *lon, char *code)
+cdef extern from "librns510.h":
+ char *librns510_decode(const char *code, char *lat, char *lon)
+
+def encode(char *lat, char *lon):
+ assert lat is not NULL
+ assert lon is not NULL
+ cdef bytes py_string
+ cdef char *out
+
+ out=<char *> malloc(128)
+ librns510_encode(lat,lon,out)
+ try:
+ py_string=out
+ finally:
+ free(out)
+
+ return py_string
+
+def decode(char *code):
+ assert code is not NULL
+ cdef bytes py_lat
+ cdef bytes py_lon
+ cdef char *lat
+ cdef char *lon
+
+ lat=<char *> malloc(128)
+ lon=<char *> malloc(128)
+ librns510_decode(code,lat,lon)
+ try:
+ py_lat=lat
+ finally:
+ free(lat)
+
+ try:
+ py_lon=lon
+ finally:
+ free(lon)
+
+ return py_lat,py_lon
+
diff --git a/setup.py b/setup.py
new file mode 100755
index 0000000..7c75641
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,16 @@
+#!/usr/bin/env python
+
+from distutils.core import setup
+from Cython.Build import cythonize
+from distutils.extension import Extension
+
+
+sourcefiles = ['rns510.pyx', 'librns510.c' ]
+
+extensions = [Extension("rns510", sourcefiles)]
+
+setup(
+ name = "rns510",
+ ext_modules = cythonize(extensions)
+)
+