Skip to content

Instantly share code, notes, and snippets.

@mwgamera
Last active November 1, 2017 06:05
Show Gist options
  • Save mwgamera/eedfd221caa52fcf6cf51093ca7e4661 to your computer and use it in GitHub Desktop.
Save mwgamera/eedfd221caa52fcf6cf51093ca7e4661 to your computer and use it in GitHub Desktop.
PNM in GNU APL. Slow, but usable.
⍝!
⍝ PBM/PGM/PPM
⍝ klg, Aug 2016
PNM∆∆WS←⎕UCS 32 9 13 10
∇PNM∆∆Assert X
'PNM Syntax Error' ⎕ES (~X)/5 4
∇R←N PNM∆∆ParseHdr S;K;L;⎕IO
R←0⍴K←⎕IO←0
NEXT:
K←K+(S[K+⍳15]∊PNM∆∆WS)⍳0
→('#'≡S[K])/COM
L←(S[K+⍳15]∊'0123456789')⍳0
PNM∆∆Assert L>0
R←R,⍎S[K+⍳L]
K←K+L
→(N>⍴R)/NEXT
PNM∆∆Assert S[K]∊PNM∆∆WS
R←(⊂(K+1)↓S),R
→0
COM:
K←K+1+((K↓S)⍳⎕UCS 10)
→NEXT
∇R←PNM∆∆P1 S;W;H
(S W H)←2 PNM∆∆ParseHdr S
PNM∆∆Assert ∧/S∊PNM∆∆WS,'01'
R←H W⍴ '1'≠(S∊'01')/S
∇R←PNM∆∆P2 S;W;H;M
(S W H M)←3 PNM∆∆ParseHdr S
S←(~S∊PNM∆∆WS)⊂S
PNM∆∆Assert ∧/(∊S)∊'0123456789'
R←H W⍴ (10⊥¨(⎕UCS¨S)-(⎕UCS'0'))÷M
∇R←PNM∆∆P3 S;W;H;M
(S W H M)←3 PNM∆∆ParseHdr S
S←(~S∊PNM∆∆WS)⊂S
PNM∆∆Assert ∧/(∊S)∊'0123456789'
R←H W 3⍴ (10⊥¨(⎕UCS¨S)-(⎕UCS'0'))÷M
∇R←PNM∆∆P4 S;W;H
(S W H)←2 PNM∆∆ParseHdr S
R←~H W↑⊃,/(⊂8⍴2)⊤¨⎕UCS (H,⌈W÷8)⍴S
∇R←PNM∆∆P5 S;W;H;M
(S W H M)←3 PNM∆∆ParseHdr S
R←256⊥⎕UCS ⍉(W×H)(1+M>255)⍴S
R←(H W)⍴R÷M
∇R←PNM∆∆P6 S;W;H;M
(S W H M)←3 PNM∆∆ParseHdr S
R←256⊥⎕UCS ⍉(W×H×3)(1+M>255)⍴S
R←(H W 3)⍴R÷M
∇R←PNM∆Parse S;K;H
PNM∆∆Assert 'P'≡S[⎕IO]
K←('123456'⍳S[⎕IO+1])-⎕IO
PNM∆∆Assert K<6
S←2↓S
→⎕LC+K+1
R←PNM∆∆P1 S ⋄ →0
R←PNM∆∆P2 S ⋄ →0
R←PNM∆∆P3 S ⋄ →0
R←PNM∆∆P4 S ⋄ →0
R←PNM∆∆P5 S ⋄ →0
R←PNM∆∆P6 S ⋄ →0
PNM∆∆Assert 0
∇R←PNM∆Read FILE
R←PNM∆Parse (⎕FIO[26] FILE)
∇FILE PNM∆Write IMG;H;FD
'Bad image' ⎕ES (∧/2 3≠⍴⍴IMG)/5 4
IMG←(3↑1,⍨⍴IMG)⍴IMG
'Bad image' ⎕ES (∧/1 3≠¯1↑⍴IMG)/5 4
H←'P',↑(1<¯1↑⍴IMG)↓'56'
H←H (⍕⌽2↑⍴IMG) '255'
H←∊(⎕UCS¨H),¨10
FD←'w'⎕FIO[3] FILE
⊣(H,∊0⌈255⌊⌊255×IMG) ⎕FIO[7] FD
⊣(⎕FIO[4]FD)
∇FILE PNM∆Write16 IMG;H;FD
'Bad image' ⎕ES (∧/2 3≠⍴⍴IMG)/5 4
IMG←(3↑1,⍨⍴IMG)⍴IMG
'Bad image' ⎕ES (∧/1 3≠¯1↑⍴IMG)/5 4
H←'P',↑(1<¯1↑⍴IMG)↓'56'
H←H (⍕⌽2↑⍴IMG) '65535'
H←∊(⎕UCS¨H),¨10
IMG←,⍉256 256⊤ ∊0⌈65535⌊⌊65535×IMG
FD←'w'⎕FIO[3] FILE
⊣(H,IMG) ⎕FIO[7] FD
⊣(⎕FIO[4]FD)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment