```packT←{(⎕IO ⎕ML)←1 3                        ⍝ Simple text vector packager.

cmp←{
ec←{                                ⍝ find the suitable esc character
c←1⊃⎕AV ⋄ n←+/⍵=c ⋄ n=0:c
d←2⊃⎕AV ⋄ o←+/⍵=d ⋄ o=0:d
e←3⊃⎕AV ⋄ p←+/⍵=e ⋄ p=0:e
m←⌊/n o p ⋄ (c d e)[n o p⍳m]
},⍵

lv←1,2≠/,⍵ ⋄ e←ec=,⍵                ⍝ repeat lengths
((e<¯1↓1 0 0 1⍷lv,1)/1⌽lv)←1        ⍝ remove 2's and 3's
((e<¯1↓1 0 1⍷lv,1)/1⌽lv)←1          ⍝
ln←{¯2-/(⍵,1)/⍳1+⍴⍵}lv              ⍝ packables

(lv/lv)←1+⌊ln÷256                   ⍝ adjust for 256 length

ln←∊{⍵<257:⍵                        ⍝ now we have to adjust the long
q←256|⍵ ⋄ n←⌊⍵÷256              ⍝ sequences so that the last
{                               ⍝ sequence will be
3<¯1↑⍵:⍵                    ⍝ properly done, ie:
(¯2↓⍵),¯4 4+¯2↑⍵            ⍝   257 -> 252 5,
}(n/256),⍵-n×256                ⍝   NOT    256 1.
}¨ln

q←lv/,⍵                             ⍝ reduce data
b←(ln>3)∨{(↑⍵),2</⍵}q=ec            ⍝ find places where
(b/q)←(b/q){ec,⍺,⍵}¨⎕AV[b/ln]       ⍝  to put pack sequences
ec,∊q                               ⍝ remove nesting
}

exp←{
ec←↑⍵                               ⍝ "esc"
~ec∊1↓⍵:1↓⍵                         ⍝ packed?

bv←{(↑⍵),2</⍵}1↓⍵=ec                ⍝ reduce vector
ln←0@{                              ⍝ lengths (remove escs)
¯2⌽bv}(⎕AV⍳(¯2⌽bv)/1↓⍵)@{¯1⌽bv  ⍝ remove ascs
}~bv                                ⍝ lengths of characters
ln/1↓⍵                              ⍝ do it!
}

⍺←1 ⋄ ⍺:cmp ⍵ ⋄ exp ⍵                   ⍝ compress or expand.
}

code_colours

test script

Back to: notes

Back to: Workspaces
```