File: plio.js

package info (click to toggle)
picolisp 25.12-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 7,388 kB
  • sloc: ansic: 3,092; javascript: 1,004; makefile: 107; sh: 2
file content (65 lines) | stat: -rw-r--r-- 1,581 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/* 22nov21 Software Lab. Alexander Burger */

function plio(lst) {
   var NIX = 0;
   var BEG = 1;
   var DOT = 2;
   var END = 3;

   var NUMBER    = 0;
   var INTERN    = 1;
   var TRANSIENT = 2;

   var PlioPos = 1;
   var PlioLst = lst;
   var PlioCnt, PlioMore;

   function byte() {
      if (PlioCnt == 0) {
         if (!PlioMore || (PlioCnt = PlioLst[PlioPos++]) == 0)
            return -1;
         PlioMore = PlioCnt == 255;
      }
      --PlioCnt;
      return PlioLst[PlioPos++];
   }

   function expr(c) {
      if ((c & ~3) !== 0) {  // Atom
         PlioMore = (PlioCnt = c >> 2) === 63;
         if ((c & 3) === NUMBER) {
            c = byte();
            var n = c >> 1;
            var s = c & 1;
            var m = 128;
            while ((c = byte()) >= 0) {
               n += c * m;
               m *= 256;
            }
            return s == 0? n : -n;
         }
         var str = "";  // TRANSIENT
         while ((c = byte()) >= 0) {
            if ((c & 0x80) != 0) {
               if ((c & 0x20) == 0)
                  c &= 0x1F;
               else
                  c = (c & 0xF) << 6 | byte() & 0x3F;
               c = c << 6 | byte() & 0x3F;
            }
            str += String.fromCharCode(c);
         }
         return str;
      }
      if (c !== BEG)  // NIX, DOT or END
         return null;
      var i = 0;
      var lst = new Array();
      lst[0] = expr(PlioLst[PlioPos++]);
      while ((c = PlioLst[PlioPos++]) !== END  &&  c !== DOT)
         lst[++i] = expr(c);
      return lst;
   }

   return expr(PlioLst[0]);
}