OSDN Git Service

Added: util package
authorNagao Takeyuki <nagaotakeyuki@gmail.com>
Sun, 13 Sep 2009 06:23:09 +0000 (15:23 +0900)
committerNagao Takeyuki <nagaotakeyuki@gmail.com>
Sun, 13 Sep 2009 06:23:09 +0000 (15:23 +0900)
Signed-off-by: Nagao Takeyuki <nagaotakeyuki@gmail.com>
src/js/include/jdisp/util/MultiValueMap.jsh [new file with mode: 0644]
src/js/include/jdisp/util/S64.jsh [new file with mode: 0644]
src/js/include/jdisp/util/SerialNumberGenerator.jsh [new file with mode: 0644]
src/js/include/jdisp/util/package.jsh [new file with mode: 0644]

diff --git a/src/js/include/jdisp/util/MultiValueMap.jsh b/src/js/include/jdisp/util/MultiValueMap.jsh
new file mode 100644 (file)
index 0000000..986095c
--- /dev/null
@@ -0,0 +1,114 @@
+#ifndef _JDISP_UTIL_MULTIVALUEMAP_JSH\r
+#define _JDISP_UTIL_MULTIVALUEMAP_JSH\r
+\r
+OOP_CLASS(MultiValueMap) = function()\r
+{\r
+  this.data = new Object();\r
+};\r
+\r
+#if 0\r
+OOP_STATIC_METHOD(MultiValueMap, fromDict) = function(dict)\r
+{\r
+  // TODO: implement MultiValueMap#fromDict()\r
+\r
+  var a = new OOP_CLASS(MultiValueMap)();\r
+  a.data = dict;\r
+  return a;\r
+};\r
+#endif\r
+\r
+OOP_STATIC_METHOD(MultiValueMap, fromQueryString) = function(str)\r
+{\r
+  if (!IS_STRING(str)) return undefined;\r
+\r
+  var mm = new OOP_CLASS(MultiValueMap)();\r
+  var idx;\r
+  var pairs = str.split('&');\r
+  for (j in pairs) {\r
+    var pair = pairs[j];\r
+    // Note that IE6 comes here with pair == '' in the case where str==''\r
+    var name, value;\r
+    idx = pair.indexOf('=');\r
+    if (idx === -1) {\r
+      name = pair;\r
+      value = null;\r
+    } else {\r
+      name = pair.substring(0, idx);\r
+      idx = idx + 1;\r
+      value = pair.substring(idx);\r
+      name = PROJECT_PREFIX.global.decodeURIComponent(name);\r
+      value = PROJECT_PREFIX.global.decodeURIComponent(value);\r
+    }\r
+    if (!IS_NULL(name) && name !== '') {\r
+      mm.put(name, value);\r
+    }\r
+  }\r
+\r
+  return mm;\r
+};\r
+\r
+OOP_FIELD(MultiValueMap, data) = new Object();\r
+OOP_METHOD(MultiValueMap, put) = function(key, value)\r
+{\r
+  var a = null;\r
+  if (key in this.data) {\r
+    a = this.data[key];\r
+  } else {\r
+    a = new Array();\r
+    this.data[key] = a;\r
+  }\r
+  a.push(value);\r
+};\r
+\r
+OOP_METHOD(MultiValueMap, getValues) = function(key)\r
+{\r
+  if (key in this.data) {\r
+    return this.data[key];\r
+  } else {\r
+    return undefined;\r
+  }\r
+};\r
+\r
+OOP_METHOD(MultiValueMap, get) = function(key)\r
+{\r
+  if (key in this.data) {\r
+    return this.data[key][0];\r
+  } else {\r
+    return undefined;\r
+  }\r
+};\r
+\r
+OOP_METHOD(MultiValueMap, walk) = function(handler)\r
+{\r
+  for (var key in this.data) {\r
+    var a = this.data[key];\r
+    for (var i in a) {\r
+      var value = a[i];\r
+      INVOKE_IF_SET(handler, key, value);\r
+    }\r
+  }\r
+};\r
+\r
+OOP_METHOD(MultiValueMap, toString) = function()\r
+{\r
+  return (PROJECT_PREFIX.global.dumpVar(this.data));\r
+};\r
+\r
+OOP_METHOD(MultiValueMap, toQueryString) = function()\r
+{\r
+  var lp = new PROJECT_PREFIX.text.ListPrinter('', '&', '');\r
+  this.walk(function (k, v) {\r
+    if (IS_NULL(v)) {\r
+      lp.append(this.encodeURIComponent(k));\r
+    } else {\r
+      lp.append (\r
+        this.encodeURIComponent(k) +\r
+        '=' + this.encodeURIComponent(v));\r
+    }\r
+  });\r
+\r
+  return lp.toString();\r
+};\r
+\r
+\r
+#endif /* _JDISP_UTIL_MULTIVALUEMAP_JSH */\r
diff --git a/src/js/include/jdisp/util/S64.jsh b/src/js/include/jdisp/util/S64.jsh
new file mode 100644 (file)
index 0000000..54c7c18
--- /dev/null
@@ -0,0 +1,251 @@
+#ifndef _JDISP_UTIL_S64_JSH
+#define _JDISP_UTIL_S64_JSH
+
+OOP_CLASS(S64) = function()
+{
+  this._initS64();
+};
+
+OOP_METHOD(S64, _initS64) = function()
+{
+  var i, e;
+  this._s64_t_encode1 = "0:1:2:3:4:5:6:7:8:9:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:p:q:r:s:t:u:v:w:x:y:z:A:B:C:D:E:F:G:H:I:J:K:L:M:N:O:P:Q:R:S:T:U:V:W:X:Y:Z:-:.".split(':');
+  this._s64_t_decode1 = new Object();
+  for (i=0; i<64; i++) {
+    e = this._s64_t_encode1[i];
+    this._s64_t_decode1[e] = i;
+  }
+
+  this._s64_t_encode2 = "00:01:02:03:04:05:06:07:08:09:0a:0b:0c:0d:0e:0f:0g:0h:0i:0j:0k:0l:0m:0n:0o:0p:0q:0r:0s:0t:0u:0v:0w:0x:0y:0z:0A:0B:0C:0D:0E:0F:0G:0H:0I:0J:0K:0L:0M:0N:0O:0P:0Q:0R:0S:0T:0U:0V:0W:0X:0Y:0Z:0-:0.:10:11:12:13:14:15:16:17:18:19:1a:1b:1c:1d:1e:1f:1g:1h:1i:1j:1k:1l:1m:1n:1o:1p:1q:1r:1s:1t:1u:1v:1w:1x:1y:1z:1A:1B:1C:1D:1E:1F:1G:1H:1I:1J:1K:1L:1M:1N:1O:1P:1Q:1R:1S:1T:1U:1V:1W:1X:1Y:1Z:1-:1.:20:21:22:23:24:25:26:27:28:29:2a:2b:2c:2d:2e:2f:2g:2h:2i:2j:2k:2l:2m:2n:2o:2p:2q:2r:2s:2t:2u:2v:2w:2x:2y:2z:2A:2B:2C:2D:2E:2F:2G:2H:2I:2J:2K:2L:2M:2N:2O:2P:2Q:2R:2S:2T:2U:2V:2W:2X:2Y:2Z:2-:2.:30:31:32:33:34:35:36:37:38:39:3a:3b:3c:3d:3e:3f:3g:3h:3i:3j:3k:3l:3m:3n:3o:3p:3q:3r:3s:3t:3u:3v:3w:3x:3y:3z:3A:3B:3C:3D:3E:3F:3G:3H:3I:3J:3K:3L:3M:3N:3O:3P:3Q:3R:3S:3T:3U:3V:3W:3X:3Y:3Z:3-:3.:40:41:42:43:44:45:46:47:48:49:4a:4b:4c:4d:4e:4f:4g:4h:4i:4j:4k:4l:4m:4n:4o:4p:4q:4r:4s:4t:4u:4v:4w:4x:4y:4z:4A:4B:4C:4D:4E:4F:4G:4H:4I:4J:4K:4L:4M:4N:4O:4P:4Q:4R:4S:4T:4U:4V:4W:4X:4Y:4Z:4-:4.:50:51:52:53:54:55:56:57:58:59:5a:5b:5c:5d:5e:5f:5g:5h:5i:5j:5k:5l:5m:5n:5o:5p:5q:5r:5s:5t:5u:5v:5w:5x:5y:5z:5A:5B:5C:5D:5E:5F:5G:5H:5I:5J:5K:5L:5M:5N:5O:5P:5Q:5R:5S:5T:5U:5V:5W:5X:5Y:5Z:5-:5.:60:61:62:63:64:65:66:67:68:69:6a:6b:6c:6d:6e:6f:6g:6h:6i:6j:6k:6l:6m:6n:6o:6p:6q:6r:6s:6t:6u:6v:6w:6x:6y:6z:6A:6B:6C:6D:6E:6F:6G:6H:6I:6J:6K:6L:6M:6N:6O:6P:6Q:6R:6S:6T:6U:6V:6W:6X:6Y:6Z:6-:6.:70:71:72:73:74:75:76:77:78:79:7a:7b:7c:7d:7e:7f:7g:7h:7i:7j:7k:7l:7m:7n:7o:7p:7q:7r:7s:7t:7u:7v:7w:7x:7y:7z:7A:7B:7C:7D:7E:7F:7G:7H:7I:7J:7K:7L:7M:7N:7O:7P:7Q:7R:7S:7T:7U:7V:7W:7X:7Y:7Z:7-:7.:80:81:82:83:84:85:86:87:88:89:8a:8b:8c:8d:8e:8f:8g:8h:8i:8j:8k:8l:8m:8n:8o:8p:8q:8r:8s:8t:8u:8v:8w:8x:8y:8z:8A:8B:8C:8D:8E:8F:8G:8H:8I:8J:8K:8L:8M:8N:8O:8P:8Q:8R:8S:8T:8U:8V:8W:8X:8Y:8Z:8-:8.:90:91:92:93:94:95:96:97:98:99:9a:9b:9c:9d:9e:9f:9g:9h:9i:9j:9k:9l:9m:9n:9o:9p:9q:9r:9s:9t:9u:9v:9w:9x:9y:9z:9A:9B:9C:9D:9E:9F:9G:9H:9I:9J:9K:9L:9M:9N:9O:9P:9Q:9R:9S:9T:9U:9V:9W:9X:9Y:9Z:9-:9.:a0:a1:a2:a3:a4:a5:a6:a7:a8:a9:aa:ab:ac:ad:ae:af:ag:ah:ai:aj:ak:al:am:an:ao:ap:aq:ar:as:at:au:av:aw:ax:ay:az:aA:aB:aC:aD:aE:aF:aG:aH:aI:aJ:aK:aL:aM:aN:aO:aP:aQ:aR:aS:aT:aU:aV:aW:aX:aY:aZ:a-:a.:b0:b1:b2:b3:b4:b5:b6:b7:b8:b9:ba:bb:bc:bd:be:bf:bg:bh:bi:bj:bk:bl:bm:bn:bo:bp:bq:br:bs:bt:bu:bv:bw:bx:by:bz:bA:bB:bC:bD:bE:bF:bG:bH:bI:bJ:bK:bL:bM:bN:bO:bP:bQ:bR:bS:bT:bU:bV:bW:bX:bY:bZ:b-:b.:c0:c1:c2:c3:c4:c5:c6:c7:c8:c9:ca:cb:cc:cd:ce:cf:cg:ch:ci:cj:ck:cl:cm:cn:co:cp:cq:cr:cs:ct:cu:cv:cw:cx:cy:cz:cA:cB:cC:cD:cE:cF:cG:cH:cI:cJ:cK:cL:cM:cN:cO:cP:cQ:cR:cS:cT:cU:cV:cW:cX:cY:cZ:c-:c.:d0:d1:d2:d3:d4:d5:d6:d7:d8:d9:da:db:dc:dd:de:df:dg:dh:di:dj:dk:dl:dm:dn:do:dp:dq:dr:ds:dt:du:dv:dw:dx:dy:dz:dA:dB:dC:dD:dE:dF:dG:dH:dI:dJ:dK:dL:dM:dN:dO:dP:dQ:dR:dS:dT:dU:dV:dW:dX:dY:dZ:d-:d.:e0:e1:e2:e3:e4:e5:e6:e7:e8:e9:ea:eb:ec:ed:ee:ef:eg:eh:ei:ej:ek:el:em:en:eo:ep:eq:er:es:et:eu:ev:ew:ex:ey:ez:eA:eB:eC:eD:eE:eF:eG:eH:eI:eJ:eK:eL:eM:eN:eO:eP:eQ:eR:eS:eT:eU:eV:eW:eX:eY:eZ:e-:e.:f0:f1:f2:f3:f4:f5:f6:f7:f8:f9:fa:fb:fc:fd:fe:ff:fg:fh:fi:fj:fk:fl:fm:fn:fo:fp:fq:fr:fs:ft:fu:fv:fw:fx:fy:fz:fA:fB:fC:fD:fE:fF:fG:fH:fI:fJ:fK:fL:fM:fN:fO:fP:fQ:fR:fS:fT:fU:fV:fW:fX:fY:fZ:f-:f.:g0:g1:g2:g3:g4:g5:g6:g7:g8:g9:ga:gb:gc:gd:ge:gf:gg:gh:gi:gj:gk:gl:gm:gn:go:gp:gq:gr:gs:gt:gu:gv:gw:gx:gy:gz:gA:gB:gC:gD:gE:gF:gG:gH:gI:gJ:gK:gL:gM:gN:gO:gP:gQ:gR:gS:gT:gU:gV:gW:gX:gY:gZ:g-:g.:h0:h1:h2:h3:h4:h5:h6:h7:h8:h9:ha:hb:hc:hd:he:hf:hg:hh:hi:hj:hk:hl:hm:hn:ho:hp:hq:hr:hs:ht:hu:hv:hw:hx:hy:hz:hA:hB:hC:hD:hE:hF:hG:hH:hI:hJ:hK:hL:hM:hN:hO:hP:hQ:hR:hS:hT:hU:hV:hW:hX:hY:hZ:h-:h.:i0:i1:i2:i3:i4:i5:i6:i7:i8:i9:ia:ib:ic:id:ie:if:ig:ih:ii:ij:ik:il:im:in:io:ip:iq:ir:is:it:iu:iv:iw:ix:iy:iz:iA:iB:iC:iD:iE:iF:iG:iH:iI:iJ:iK:iL:iM:iN:iO:iP:iQ:iR:iS:iT:iU:iV:iW:iX:iY:iZ:i-:i.:j0:j1:j2:j3:j4:j5:j6:j7:j8:j9:ja:jb:jc:jd:je:jf:jg:jh:ji:jj:jk:jl:jm:jn:jo:jp:jq:jr:js:jt:ju:jv:jw:jx:jy:jz:jA:jB:jC:jD:jE:jF:jG:jH:jI:jJ:jK:jL:jM:jN:jO:jP:jQ:jR:jS:jT:jU:jV:jW:jX:jY:jZ:j-:j.:k0:k1:k2:k3:k4:k5:k6:k7:k8:k9:ka:kb:kc:kd:ke:kf:kg:kh:ki:kj:kk:kl:km:kn:ko:kp:kq:kr:ks:kt:ku:kv:kw:kx:ky:kz:kA:kB:kC:kD:kE:kF:kG:kH:kI:kJ:kK:kL:kM:kN:kO:kP:kQ:kR:kS:kT:kU:kV:kW:kX:kY:kZ:k-:k.:l0:l1:l2:l3:l4:l5:l6:l7:l8:l9:la:lb:lc:ld:le:lf:lg:lh:li:lj:lk:ll:lm:ln:lo:lp:lq:lr:ls:lt:lu:lv:lw:lx:ly:lz:lA:lB:lC:lD:lE:lF:lG:lH:lI:lJ:lK:lL:lM:lN:lO:lP:lQ:lR:lS:lT:lU:lV:lW:lX:lY:lZ:l-:l.:m0:m1:m2:m3:m4:m5:m6:m7:m8:m9:ma:mb:mc:md:me:mf:mg:mh:mi:mj:mk:ml:mm:mn:mo:mp:mq:mr:ms:mt:mu:mv:mw:mx:my:mz:mA:mB:mC:mD:mE:mF:mG:mH:mI:mJ:mK:mL:mM:mN:mO:mP:mQ:mR:mS:mT:mU:mV:mW:mX:mY:mZ:m-:m.:n0:n1:n2:n3:n4:n5:n6:n7:n8:n9:na:nb:nc:nd:ne:nf:ng:nh:ni:nj:nk:nl:nm:nn:no:np:nq:nr:ns:nt:nu:nv:nw:nx:ny:nz:nA:nB:nC:nD:nE:nF:nG:nH:nI:nJ:nK:nL:nM:nN:nO:nP:nQ:nR:nS:nT:nU:nV:nW:nX:nY:nZ:n-:n.:o0:o1:o2:o3:o4:o5:o6:o7:o8:o9:oa:ob:oc:od:oe:of:og:oh:oi:oj:ok:ol:om:on:oo:op:oq:or:os:ot:ou:ov:ow:ox:oy:oz:oA:oB:oC:oD:oE:oF:oG:oH:oI:oJ:oK:oL:oM:oN:oO:oP:oQ:oR:oS:oT:oU:oV:oW:oX:oY:oZ:o-:o.:p0:p1:p2:p3:p4:p5:p6:p7:p8:p9:pa:pb:pc:pd:pe:pf:pg:ph:pi:pj:pk:pl:pm:pn:po:pp:pq:pr:ps:pt:pu:pv:pw:px:py:pz:pA:pB:pC:pD:pE:pF:pG:pH:pI:pJ:pK:pL:pM:pN:pO:pP:pQ:pR:pS:pT:pU:pV:pW:pX:pY:pZ:p-:p.:q0:q1:q2:q3:q4:q5:q6:q7:q8:q9:qa:qb:qc:qd:qe:qf:qg:qh:qi:qj:qk:ql:qm:qn:qo:qp:qq:qr:qs:qt:qu:qv:qw:qx:qy:qz:qA:qB:qC:qD:qE:qF:qG:qH:qI:qJ:qK:qL:qM:qN:qO:qP:qQ:qR:qS:qT:qU:qV:qW:qX:qY:qZ:q-:q.:r0:r1:r2:r3:r4:r5:r6:r7:r8:r9:ra:rb:rc:rd:re:rf:rg:rh:ri:rj:rk:rl:rm:rn:ro:rp:rq:rr:rs:rt:ru:rv:rw:rx:ry:rz:rA:rB:rC:rD:rE:rF:rG:rH:rI:rJ:rK:rL:rM:rN:rO:rP:rQ:rR:rS:rT:rU:rV:rW:rX:rY:rZ:r-:r.:s0:s1:s2:s3:s4:s5:s6:s7:s8:s9:sa:sb:sc:sd:se:sf:sg:sh:si:sj:sk:sl:sm:sn:so:sp:sq:sr:ss:st:su:sv:sw:sx:sy:sz:sA:sB:sC:sD:sE:sF:sG:sH:sI:sJ:sK:sL:sM:sN:sO:sP:sQ:sR:sS:sT:sU:sV:sW:sX:sY:sZ:s-:s.:t0:t1:t2:t3:t4:t5:t6:t7:t8:t9:ta:tb:tc:td:te:tf:tg:th:ti:tj:tk:tl:tm:tn:to:tp:tq:tr:ts:tt:tu:tv:tw:tx:ty:tz:tA:tB:tC:tD:tE:tF:tG:tH:tI:tJ:tK:tL:tM:tN:tO:tP:tQ:tR:tS:tT:tU:tV:tW:tX:tY:tZ:t-:t.:u0:u1:u2:u3:u4:u5:u6:u7:u8:u9:ua:ub:uc:ud:ue:uf:ug:uh:ui:uj:uk:ul:um:un:uo:up:uq:ur:us:ut:uu:uv:uw:ux:uy:uz:uA:uB:uC:uD:uE:uF:uG:uH:uI:uJ:uK:uL:uM:uN:uO:uP:uQ:uR:uS:uT:uU:uV:uW:uX:uY:uZ:u-:u.:v0:v1:v2:v3:v4:v5:v6:v7:v8:v9:va:vb:vc:vd:ve:vf:vg:vh:vi:vj:vk:vl:vm:vn:vo:vp:vq:vr:vs:vt:vu:vv:vw:vx:vy:vz:vA:vB:vC:vD:vE:vF:vG:vH:vI:vJ:vK:vL:vM:vN:vO:vP:vQ:vR:vS:vT:vU:vV:vW:vX:vY:vZ:v-:v.:w0:w1:w2:w3:w4:w5:w6:w7:w8:w9:wa:wb:wc:wd:we:wf:wg:wh:wi:wj:wk:wl:wm:wn:wo:wp:wq:wr:ws:wt:wu:wv:ww:wx:wy:wz:wA:wB:wC:wD:wE:wF:wG:wH:wI:wJ:wK:wL:wM:wN:wO:wP:wQ:wR:wS:wT:wU:wV:wW:wX:wY:wZ:w-:w.:x0:x1:x2:x3:x4:x5:x6:x7:x8:x9:xa:xb:xc:xd:xe:xf:xg:xh:xi:xj:xk:xl:xm:xn:xo:xp:xq:xr:xs:xt:xu:xv:xw:xx:xy:xz:xA:xB:xC:xD:xE:xF:xG:xH:xI:xJ:xK:xL:xM:xN:xO:xP:xQ:xR:xS:xT:xU:xV:xW:xX:xY:xZ:x-:x.:y0:y1:y2:y3:y4:y5:y6:y7:y8:y9:ya:yb:yc:yd:ye:yf:yg:yh:yi:yj:yk:yl:ym:yn:yo:yp:yq:yr:ys:yt:yu:yv:yw:yx:yy:yz:yA:yB:yC:yD:yE:yF:yG:yH:yI:yJ:yK:yL:yM:yN:yO:yP:yQ:yR:yS:yT:yU:yV:yW:yX:yY:yZ:y-:y.:z0:z1:z2:z3:z4:z5:z6:z7:z8:z9:za:zb:zc:zd:ze:zf:zg:zh:zi:zj:zk:zl:zm:zn:zo:zp:zq:zr:zs:zt:zu:zv:zw:zx:zy:zz:zA:zB:zC:zD:zE:zF:zG:zH:zI:zJ:zK:zL:zM:zN:zO:zP:zQ:zR:zS:zT:zU:zV:zW:zX:zY:zZ:z-:z.:A0:A1:A2:A3:A4:A5:A6:A7:A8:A9:Aa:Ab:Ac:Ad:Ae:Af:Ag:Ah:Ai:Aj:Ak:Al:Am:An:Ao:Ap:Aq:Ar:As:At:Au:Av:Aw:Ax:Ay:Az:AA:AB:AC:AD:AE:AF:AG:AH:AI:AJ:AK:AL:AM:AN:AO:AP:AQ:AR:AS:AT:AU:AV:AW:AX:AY:AZ:A-:A.:B0:B1:B2:B3:B4:B5:B6:B7:B8:B9:Ba:Bb:Bc:Bd:Be:Bf:Bg:Bh:Bi:Bj:Bk:Bl:Bm:Bn:Bo:Bp:Bq:Br:Bs:Bt:Bu:Bv:Bw:Bx:By:Bz:BA:BB:BC:BD:BE:BF:BG:BH:BI:BJ:BK:BL:BM:BN:BO:BP:BQ:BR:BS:BT:BU:BV:BW:BX:BY:BZ:B-:B.:C0:C1:C2:C3:C4:C5:C6:C7:C8:C9:Ca:Cb:Cc:Cd:Ce:Cf:Cg:Ch:Ci:Cj:Ck:Cl:Cm:Cn:Co:Cp:Cq:Cr:Cs:Ct:Cu:Cv:Cw:Cx:Cy:Cz:CA:CB:CC:CD:CE:CF:CG:CH:CI:CJ:CK:CL:CM:CN:CO:CP:CQ:CR:CS:CT:CU:CV:CW:CX:CY:CZ:C-:C.:D0:D1:D2:D3:D4:D5:D6:D7:D8:D9:Da:Db:Dc:Dd:De:Df:Dg:Dh:Di:Dj:Dk:Dl:Dm:Dn:Do:Dp:Dq:Dr:Ds:Dt:Du:Dv:Dw:Dx:Dy:Dz:DA:DB:DC:DD:DE:DF:DG:DH:DI:DJ:DK:DL:DM:DN:DO:DP:DQ:DR:DS:DT:DU:DV:DW:DX:DY:DZ:D-:D.:E0:E1:E2:E3:E4:E5:E6:E7:E8:E9:Ea:Eb:Ec:Ed:Ee:Ef:Eg:Eh:Ei:Ej:Ek:El:Em:En:Eo:Ep:Eq:Er:Es:Et:Eu:Ev:Ew:Ex:Ey:Ez:EA:EB:EC:ED:EE:EF:EG:EH:EI:EJ:EK:EL:EM:EN:EO:EP:EQ:ER:ES:ET:EU:EV:EW:EX:EY:EZ:E-:E.:F0:F1:F2:F3:F4:F5:F6:F7:F8:F9:Fa:Fb:Fc:Fd:Fe:Ff:Fg:Fh:Fi:Fj:Fk:Fl:Fm:Fn:Fo:Fp:Fq:Fr:Fs:Ft:Fu:Fv:Fw:Fx:Fy:Fz:FA:FB:FC:FD:FE:FF:FG:FH:FI:FJ:FK:FL:FM:FN:FO:FP:FQ:FR:FS:FT:FU:FV:FW:FX:FY:FZ:F-:F.:G0:G1:G2:G3:G4:G5:G6:G7:G8:G9:Ga:Gb:Gc:Gd:Ge:Gf:Gg:Gh:Gi:Gj:Gk:Gl:Gm:Gn:Go:Gp:Gq:Gr:Gs:Gt:Gu:Gv:Gw:Gx:Gy:Gz:GA:GB:GC:GD:GE:GF:GG:GH:GI:GJ:GK:GL:GM:GN:GO:GP:GQ:GR:GS:GT:GU:GV:GW:GX:GY:GZ:G-:G.:H0:H1:H2:H3:H4:H5:H6:H7:H8:H9:Ha:Hb:Hc:Hd:He:Hf:Hg:Hh:Hi:Hj:Hk:Hl:Hm:Hn:Ho:Hp:Hq:Hr:Hs:Ht:Hu:Hv:Hw:Hx:Hy:Hz:HA:HB:HC:HD:HE:HF:HG:HH:HI:HJ:HK:HL:HM:HN:HO:HP:HQ:HR:HS:HT:HU:HV:HW:HX:HY:HZ:H-:H.:I0:I1:I2:I3:I4:I5:I6:I7:I8:I9:Ia:Ib:Ic:Id:Ie:If:Ig:Ih:Ii:Ij:Ik:Il:Im:In:Io:Ip:Iq:Ir:Is:It:Iu:Iv:Iw:Ix:Iy:Iz:IA:IB:IC:ID:IE:IF:IG:IH:II:IJ:IK:IL:IM:IN:IO:IP:IQ:IR:IS:IT:IU:IV:IW:IX:IY:IZ:I-:I.:J0:J1:J2:J3:J4:J5:J6:J7:J8:J9:Ja:Jb:Jc:Jd:Je:Jf:Jg:Jh:Ji:Jj:Jk:Jl:Jm:Jn:Jo:Jp:Jq:Jr:Js:Jt:Ju:Jv:Jw:Jx:Jy:Jz:JA:JB:JC:JD:JE:JF:JG:JH:JI:JJ:JK:JL:JM:JN:JO:JP:JQ:JR:JS:JT:JU:JV:JW:JX:JY:JZ:J-:J.:K0:K1:K2:K3:K4:K5:K6:K7:K8:K9:Ka:Kb:Kc:Kd:Ke:Kf:Kg:Kh:Ki:Kj:Kk:Kl:Km:Kn:Ko:Kp:Kq:Kr:Ks:Kt:Ku:Kv:Kw:Kx:Ky:Kz:KA:KB:KC:KD:KE:KF:KG:KH:KI:KJ:KK:KL:KM:KN:KO:KP:KQ:KR:KS:KT:KU:KV:KW:KX:KY:KZ:K-:K.:L0:L1:L2:L3:L4:L5:L6:L7:L8:L9:La:Lb:Lc:Ld:Le:Lf:Lg:Lh:Li:Lj:Lk:Ll:Lm:Ln:Lo:Lp:Lq:Lr:Ls:Lt:Lu:Lv:Lw:Lx:Ly:Lz:LA:LB:LC:LD:LE:LF:LG:LH:LI:LJ:LK:LL:LM:LN:LO:LP:LQ:LR:LS:LT:LU:LV:LW:LX:LY:LZ:L-:L.:M0:M1:M2:M3:M4:M5:M6:M7:M8:M9:Ma:Mb:Mc:Md:Me:Mf:Mg:Mh:Mi:Mj:Mk:Ml:Mm:Mn:Mo:Mp:Mq:Mr:Ms:Mt:Mu:Mv:Mw:Mx:My:Mz:MA:MB:MC:MD:ME:MF:MG:MH:MI:MJ:MK:ML:MM:MN:MO:MP:MQ:MR:MS:MT:MU:MV:MW:MX:MY:MZ:M-:M.:N0:N1:N2:N3:N4:N5:N6:N7:N8:N9:Na:Nb:Nc:Nd:Ne:Nf:Ng:Nh:Ni:Nj:Nk:Nl:Nm:Nn:No:Np:Nq:Nr:Ns:Nt:Nu:Nv:Nw:Nx:Ny:Nz:NA:NB:NC:ND:NE:NF:NG:NH:NI:NJ:NK:NL:NM:NN:NO:NP:NQ:NR:NS:NT:NU:NV:NW:NX:NY:NZ:N-:N.:O0:O1:O2:O3:O4:O5:O6:O7:O8:O9:Oa:Ob:Oc:Od:Oe:Of:Og:Oh:Oi:Oj:Ok:Ol:Om:On:Oo:Op:Oq:Or:Os:Ot:Ou:Ov:Ow:Ox:Oy:Oz:OA:OB:OC:OD:OE:OF:OG:OH:OI:OJ:OK:OL:OM:ON:OO:OP:OQ:OR:OS:OT:OU:OV:OW:OX:OY:OZ:O-:O.:P0:P1:P2:P3:P4:P5:P6:P7:P8:P9:Pa:Pb:Pc:Pd:Pe:Pf:Pg:Ph:Pi:Pj:Pk:Pl:Pm:Pn:Po:Pp:Pq:Pr:Ps:Pt:Pu:Pv:Pw:Px:Py:Pz:PA:PB:PC:PD:PE:PF:PG:PH:PI:PJ:PK:PL:PM:PN:PO:PP:PQ:PR:PS:PT:PU:PV:PW:PX:PY:PZ:P-:P.:Q0:Q1:Q2:Q3:Q4:Q5:Q6:Q7:Q8:Q9:Qa:Qb:Qc:Qd:Qe:Qf:Qg:Qh:Qi:Qj:Qk:Ql:Qm:Qn:Qo:Qp:Qq:Qr:Qs:Qt:Qu:Qv:Qw:Qx:Qy:Qz:QA:QB:QC:QD:QE:QF:QG:QH:QI:QJ:QK:QL:QM:QN:QO:QP:QQ:QR:QS:QT:QU:QV:QW:QX:QY:QZ:Q-:Q.:R0:R1:R2:R3:R4:R5:R6:R7:R8:R9:Ra:Rb:Rc:Rd:Re:Rf:Rg:Rh:Ri:Rj:Rk:Rl:Rm:Rn:Ro:Rp:Rq:Rr:Rs:Rt:Ru:Rv:Rw:Rx:Ry:Rz:RA:RB:RC:RD:RE:RF:RG:RH:RI:RJ:RK:RL:RM:RN:RO:RP:RQ:RR:RS:RT:RU:RV:RW:RX:RY:RZ:R-:R.:S0:S1:S2:S3:S4:S5:S6:S7:S8:S9:Sa:Sb:Sc:Sd:Se:Sf:Sg:Sh:Si:Sj:Sk:Sl:Sm:Sn:So:Sp:Sq:Sr:Ss:St:Su:Sv:Sw:Sx:Sy:Sz:SA:SB:SC:SD:SE:SF:SG:SH:SI:SJ:SK:SL:SM:SN:SO:SP:SQ:SR:SS:ST:SU:SV:SW:SX:SY:SZ:S-:S.:T0:T1:T2:T3:T4:T5:T6:T7:T8:T9:Ta:Tb:Tc:Td:Te:Tf:Tg:Th:Ti:Tj:Tk:Tl:Tm:Tn:To:Tp:Tq:Tr:Ts:Tt:Tu:Tv:Tw:Tx:Ty:Tz:TA:TB:TC:TD:TE:TF:TG:TH:TI:TJ:TK:TL:TM:TN:TO:TP:TQ:TR:TS:TT:TU:TV:TW:TX:TY:TZ:T-:T.:U0:U1:U2:U3:U4:U5:U6:U7:U8:U9:Ua:Ub:Uc:Ud:Ue:Uf:Ug:Uh:Ui:Uj:Uk:Ul:Um:Un:Uo:Up:Uq:Ur:Us:Ut:Uu:Uv:Uw:Ux:Uy:Uz:UA:UB:UC:UD:UE:UF:UG:UH:UI:UJ:UK:UL:UM:UN:UO:UP:UQ:UR:US:UT:UU:UV:UW:UX:UY:UZ:U-:U.:V0:V1:V2:V3:V4:V5:V6:V7:V8:V9:Va:Vb:Vc:Vd:Ve:Vf:Vg:Vh:Vi:Vj:Vk:Vl:Vm:Vn:Vo:Vp:Vq:Vr:Vs:Vt:Vu:Vv:Vw:Vx:Vy:Vz:VA:VB:VC:VD:VE:VF:VG:VH:VI:VJ:VK:VL:VM:VN:VO:VP:VQ:VR:VS:VT:VU:VV:VW:VX:VY:VZ:V-:V.:W0:W1:W2:W3:W4:W5:W6:W7:W8:W9:Wa:Wb:Wc:Wd:We:Wf:Wg:Wh:Wi:Wj:Wk:Wl:Wm:Wn:Wo:Wp:Wq:Wr:Ws:Wt:Wu:Wv:Ww:Wx:Wy:Wz:WA:WB:WC:WD:WE:WF:WG:WH:WI:WJ:WK:WL:WM:WN:WO:WP:WQ:WR:WS:WT:WU:WV:WW:WX:WY:WZ:W-:W.:X0:X1:X2:X3:X4:X5:X6:X7:X8:X9:Xa:Xb:Xc:Xd:Xe:Xf:Xg:Xh:Xi:Xj:Xk:Xl:Xm:Xn:Xo:Xp:Xq:Xr:Xs:Xt:Xu:Xv:Xw:Xx:Xy:Xz:XA:XB:XC:XD:XE:XF:XG:XH:XI:XJ:XK:XL:XM:XN:XO:XP:XQ:XR:XS:XT:XU:XV:XW:XX:XY:XZ:X-:X.:Y0:Y1:Y2:Y3:Y4:Y5:Y6:Y7:Y8:Y9:Ya:Yb:Yc:Yd:Ye:Yf:Yg:Yh:Yi:Yj:Yk:Yl:Ym:Yn:Yo:Yp:Yq:Yr:Ys:Yt:Yu:Yv:Yw:Yx:Yy:Yz:YA:YB:YC:YD:YE:YF:YG:YH:YI:YJ:YK:YL:YM:YN:YO:YP:YQ:YR:YS:YT:YU:YV:YW:YX:YY:YZ:Y-:Y.:Z0:Z1:Z2:Z3:Z4:Z5:Z6:Z7:Z8:Z9:Za:Zb:Zc:Zd:Ze:Zf:Zg:Zh:Zi:Zj:Zk:Zl:Zm:Zn:Zo:Zp:Zq:Zr:Zs:Zt:Zu:Zv:Zw:Zx:Zy:Zz:ZA:ZB:ZC:ZD:ZE:ZF:ZG:ZH:ZI:ZJ:ZK:ZL:ZM:ZN:ZO:ZP:ZQ:ZR:ZS:ZT:ZU:ZV:ZW:ZX:ZY:ZZ:Z-:Z.:-0:-1:-2:-3:-4:-5:-6:-7:-8:-9:-a:-b:-c:-d:-e:-f:-g:-h:-i:-j:-k:-l:-m:-n:-o:-p:-q:-r:-s:-t:-u:-v:-w:-x:-y:-z:-A:-B:-C:-D:-E:-F:-G:-H:-I:-J:-K:-L:-M:-N:-O:-P:-Q:-R:-S:-T:-U:-V:-W:-X:-Y:-Z:--:-.:.0:.1:.2:.3:.4:.5:.6:.7:.8:.9:.a:.b:.c:.d:.e:.f:.g:.h:.i:.j:.k:.l:.m:.n:.o:.p:.q:.r:.s:.t:.u:.v:.w:.x:.y:.z:.A:.B:.C:.D:.E:.F:.G:.H:.I:.J:.K:.L:.M:.N:.O:.P:.Q:.R:.S:.T:.U:.V:.W:.X:.Y:.Z:.-:..".split(':');
+  this._s64_t_decode2 = new Object();
+  for (i=0; i<4096; i++) {
+    e = this._s64_t_encode2[i];
+    this._s64_t_decode2[e] = i;
+  }
+};
+
+OOP_FIELD(S64, _s64_t_encode1) = new Array();
+OOP_FIELD(S64, _s64_t_encode2) = new Array();
+OOP_FIELD(S64, _s64_t_decode1) = new Object();
+OOP_FIELD(S64, _s64_t_decode2) = new Object();
+
+#define _S64_ENCODE1(v) this._s64_t_encode1[(v) & 63]
+#define _S64_ENCODE2(v) this._s64_t_encode2[(v) & 4095]
+#define _S64_DECODE1(s) this._s64_t_decode1[s]
+#define _S64_DECODE2(s) this._s64_t_decode2[s]
+
+OOP_METHOD(S64, encodeU1) = function(value)
+{
+  var v = 0;
+  if (IS_NUMBER(value)) {
+    v = value;
+  }
+  return _S64_ENCODE1(v);
+};
+
+OOP_METHOD(S64, decodeU1) = function(str)
+{
+  var v = 0;
+  if (IS_STRING(str)) {
+    if (str.match(/^([-.0-9a-zA-Z])/)) {
+      v = _S64_DECODE1(RegExp.$1);
+    }
+  }
+  return v;
+};
+
+OOP_METHOD(S64, encodeU2) = function(value)
+{
+  var v = 0;
+  if (IS_NUMBER(value)) {
+    v = value;
+  }
+  return _S64_ENCODE2(v);
+};
+
+OOP_METHOD(S64, decodeU2) = function(str)
+{
+  var v = 0;
+  if (IS_STRING(str)) {
+    if (str.match(/^([-.0-9a-zA-Z]{2,2})/)) {
+      v = _S64_DECODE2(RegExp.$1);
+    }
+  }
+  return v;
+};
+
+OOP_METHOD(S64, encodeU3) = function(value)
+{
+  var v = 0;
+  if (IS_NUMBER(value)) {
+    v = value;
+  }
+  return _S64_ENCODE1(value >>> 12) + _S64_ENCODE2(value);
+};
+
+OOP_METHOD(S64, decodeU3) = function(str)
+{
+  var v = 0;
+  if (IS_STRING(str)) {
+    if (str.match(/^([-.0-9a-zA-Z])([-.0-9a-zA-Z]{2,2})/)) {
+      v = _S64_DECODE1(RegExp.$1) * 4096 + _S64_DECODE2(RegExp.$2);
+    }
+  }
+  return v;
+};
+
+OOP_METHOD(S64, encodeU4) = function(value)
+{
+  var v = 0;
+  if (IS_NUMBER(value)) {
+    v = value;
+  }
+  return _S64_ENCODE2(value >>> 12) + _S64_ENCODE2(value);
+};
+
+OOP_METHOD(S64, decodeU4) = function(str)
+{
+  var v = 0;
+  if (IS_STRING(str)) {
+    if (str.match(/^([-.0-9a-zA-Z]{2,2})([-.0-9a-zA-Z]{2,2})/)) {
+      v = _S64_DECODE2(RegExp.$1) * 4096 + _S64_DECODE2(RegExp.$2);
+    }
+  }
+  return v;
+};
+
+OOP_METHOD(S64, encodeU5) = function(value)
+{
+  var v = 0;
+  if (IS_NUMBER(value)) {
+    v = value;
+  }
+  return _S64_ENCODE1(value >>> 24) +
+         _S64_ENCODE2(value >>> 12) +
+         _S64_ENCODE2(value);
+};
+
+OOP_METHOD(S64, decodeU5) = function(str)
+{
+  var v = 0;
+  if (IS_STRING(str)) {
+    if (str.match(/^([-.0-9a-zA-Z])([-.0-9a-zA-Z]{2,2})([-.0-9a-zA-Z]{2,2})/)) {
+      v = ( _S64_DECODE1(RegExp.$1)  * 4096 +
+            _S64_DECODE2(RegExp.$2)) * 4096 +
+            _S64_DECODE2(RegExp.$3);
+    }
+  }
+  return v;
+};
+
+OOP_METHOD(S64, encodeU6) = function(value)
+{
+  var v = 0;
+  if (IS_NUMBER(value)) {
+    v = value;
+  }
+  return _S64_ENCODE2(value >>> 24) +
+         _S64_ENCODE2(value >>> 12) +
+         _S64_ENCODE2(value);
+};
+
+OOP_METHOD(S64, decodeU6) = function(str)
+{
+  var v = 0;
+  if (IS_STRING(str)) {
+    if (str.match(/^([-.0-9a-zA-Z]{2,2})([-.0-9a-zA-Z]{2,2})([-.0-9a-zA-Z]{2,2})/)) {
+      v = (   _S64_DECODE2(RegExp.$1)  * 4096 +
+              _S64_DECODE2(RegExp.$2)) * 4096 +
+              _S64_DECODE2(RegExp.$3);
+    }
+  }
+  return v;
+};
+
+OOP_METHOD(S64, encodeU7) = function(value)
+{
+  var v = 0;
+  if (IS_NUMBER(value)) {
+    v = value;
+  }
+  return _S64_ENCODE1(value >>> 36) +
+         _S64_ENCODE2(value >>> 24) +
+         _S64_ENCODE2(value >>> 12) +
+         _S64_ENCODE2(value);
+};
+
+OOP_METHOD(S64, decodeU7) = function(str)
+{
+  var v = 0;
+  if (IS_STRING(str)) {
+    if (str.match(/^([-.0-9a-zA-Z])([-.0-9a-zA-Z]{2,2})([-.0-9a-zA-Z]{2,2})([-.0-9a-zA-Z]{2,2})/)) {
+      v = ( ( _S64_DECODE1(RegExp.$1)  * 4096 +
+              _S64_DECODE2(RegExp.$2)) * 4096 +
+              _S64_DECODE2(RegExp.$3)) * 4096 +
+              _S64_DECODE2(RegExp.$4);
+    }
+  }
+  return v;
+};
+
+OOP_METHOD(S64, encodeU8) = function(value)
+{
+  var v = 0;
+  if (IS_NUMBER(value)) {
+    v = value;
+  }
+  return _S64_ENCODE2(value >>> 36) +
+         _S64_ENCODE2(value >>> 24) +
+         _S64_ENCODE2(value >>> 12) +
+         _S64_ENCODE2(value);
+};
+
+OOP_METHOD(S64, decodeU8) = function(str)
+{
+  var v = 0;
+  if (IS_STRING(str)) {
+    if (str.match(/^([-.0-9a-zA-Z]{2,2})([-.0-9a-zA-Z]{2,2})([-.0-9a-zA-Z]{2,2})([-.0-9a-zA-Z]{2,2})/)) {
+      v = ( ( _S64_DECODE2(RegExp.$1)  * 4096 +
+              _S64_DECODE2(RegExp.$2)) * 4096 +
+              _S64_DECODE2(RegExp.$3)) * 4096 +
+              _S64_DECODE2(RegExp.$4);
+    }
+  }
+  return v;
+};
+
+
+#define _DELEGATEUtoS(n) \
+  OOP_METHOD(S64, encodeS##n) = function (value) { return this.encodeU##n(value); };
+
+_DELEGATEUtoS(1)
+_DELEGATEUtoS(2)
+_DELEGATEUtoS(3)
+_DELEGATEUtoS(4)
+_DELEGATEUtoS(5)
+_DELEGATEUtoS(6)
+_DELEGATEUtoS(7)
+_DELEGATEUtoS(8)
+
+#undef _DELEGATEUtoS
+
+#define DEF_DECODE(n, b1, b2) \
+OOP_METHOD(S64, decodeS##n) = function (str)\
+{\
+  var v = this.decodeU##n(str);\
+  if (v >= b2) v -= b1;\
+  return v;\
+};
+
+DEF_DECODE(1, 64, 32)
+DEF_DECODE(2, 4096, 2048)
+DEF_DECODE(3, 262144, 131072)
+DEF_DECODE(4, 16777216, 8388608)
+DEF_DECODE(5, 1073741824, 536870912)
+DEF_DECODE(6, 68719476736, 34359738368)
+DEF_DECODE(7, 4398046511104, 2199023255552)
+DEF_DECODE(8, 281474976710656, 140737488355328)
+
+#undef DEF_DECODE
+
+#endif /* _JDISP_UTIL_S64_JSH */
diff --git a/src/js/include/jdisp/util/SerialNumberGenerator.jsh b/src/js/include/jdisp/util/SerialNumberGenerator.jsh
new file mode 100644 (file)
index 0000000..fa1ee39
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef _JDISP_UTIL_SERIALNUMBERGENERATOR_JS\r
+#define _JDISP_UTIL_SERIALNUMBERGENERATOR_JS\r
+\r
+OOP_CLASS(SerialNumberGenerator) = function()\r
+{\r
+  var nextValue = 0;\r
+  return {\r
+    next : function () {\r
+      var value = nextValue;\r
+      nextValue += 1;\r
+      return value;\r
+    }\r
+  };\r
+};\r
+\r
+#endif /* _JDISP_UTIL_SERIALNUMBERGENERATOR_JS */\r
diff --git a/src/js/include/jdisp/util/package.jsh b/src/js/include/jdisp/util/package.jsh
new file mode 100644 (file)
index 0000000..dd6edaf
--- /dev/null
@@ -0,0 +1,18 @@
+#ifndef _JDISP_UTIL_PACKAGE_JSH\r
+#define _JDISP_UTIL_PACKAGE_JSH\r
+\r
+#define OOP_NAMESPACE PROJECT_PREFIX.util\r
+OOP_DECLARE_NAMESPACE2(PROJECT_PREFIX, util)\r
+\r
+#include "MultiValueMap.jsh"\r
+#include "SerialNumberGenerator.jsh"\r
+#include "S64.jsh"\r
+\r
+PROJECT_PREFIX.util.serialNumberGenerator\r
+  = new PROJECT_PREFIX.util.SerialNumberGenerator();\r
+PROJECT_PREFIX.util.s64 = new PROJECT_PREFIX.util.S64();\r
+\r
+#undef OOP_NAMESPACE\r
+\r
+#endif /* _JDISP_UTIL_PACKAGE_JSH */\r
+\r