11% Barcode Writer in Pure PostScript
22% https://bwipp.terryburton.co.uk
33%
4- % Copyright (c) 2004-2024 Terry Burton
4+ % Copyright (c) 2004-2025 Terry Burton
55%
66% $Id$
77%
3838currentglobal
3939true setglobal
4040/setpacking where {pop currentpacking true setpacking} if
41- 10 dict
42- dup /loadctx dup /uk.co.terryburton.bwipp findresource put
43- dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
41+ 50 dict
4442dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
4543dup /processoptions dup /uk.co.terryburton.bwipp findresource put
4644dup /renlinear dup /uk.co.terryburton.bwipp findresource put
4745begin
46+
47+ /plessey.barchars (0123456789ABCDEF) readonly def
48+
49+ /plessey.encs [
50+ (14141414) (32141414) (14321414) (32321414)
51+ (14143214) (32143214) (14323214) (32323214)
52+ (14141432) (32141432) (14321432) (32321432)
53+ (14143232) (32143232) (14323232) (32323232)
54+ (32321432) (541412323) (323)
55+ ] readonly def
56+
57+ /plessey.checksalt [ 1 1 1 1 0 1 0 0 1 ] readonly def
58+
59+ /plessey.checkinit [ 0 0 0 0 0 0 0 0 ] readonly def
60+
61+ /plessey.latevars dup 1 dict def load /init {
62+
63+ currentglobal
64+ true setglobal
65+
66+ //plessey.latevars begin
67+
68+ /charvals 16 dict def
69+ 0 1 15 {
70+ charvals exch dup //plessey.barchars exch 1 getinterval exch put
71+ } for
72+ /charvals charvals readonly def
73+
74+ /init { //plessey.latevars {def} forall } def
75+
76+ end
77+
78+ //plessey.latevars /init get exec
79+
80+ setglobal
81+
82+ } bind put
83+
4884/plessey {
4985
50- 20 dict begin % Confine variables to local scope
86+ 20 dict begin
5187
5288 /ctx null def
89+
5390 /dontdraw false def
5491 /includetext false def % Enable/disable text
5592 /validatecheck false def
@@ -63,29 +100,15 @@ begin
63100 //processoptions exec /options exch def
64101 /barcode exch def
65102
103+ //plessey.latevars /init get exec
104+
66105 barcode () eq {
67106 /bwipp.plesseyEmptyData (The data must not be empty) //raiseerror exec
68107 } if
69108
70- /plessey //loadctx exec
71-
72- % Create a string of the available characters
73- {
74- /barchars (0123456789ABCDEF) def
75- /charvals 16 dict def
76- 0 1 15 {charvals exch dup barchars exch 1 getinterval exch put} for
77-
78- % Create an array containing the character mappings
79- /encs
80- [ (14141414) (32141414) (14321414) (32321414)
81- (14143214) (32143214) (14323214) (32323214)
82- (14141432) (32141432) (14321432) (32321432)
83- (14143232) (32143232) (14323232) (32323232)
84- (32321432) (541412323) (323)
85- ] def
86- } ctxdef
87-
109+ %
88110 % Validate the input
111+ %
89112 0 1 barcode length 1 sub {
90113 barcode exch 1 getinterval charvals exch known not {
91114 /bwipp.plesseyBadCharacter (Plessey must contain only digits and letters A B C D E F) //raiseerror exec
@@ -94,9 +117,11 @@ begin
94117
95118 /barlen barcode length validatecheck {2 sub} if def
96119
120+ %
97121 % Calculate the checksums
122+ %
98123 /checkbits barlen 4 mul 8 add array def
99- checkbits barlen 4 mul [ 0 0 0 0 0 0 0 0 ] putinterval
124+ checkbits barlen 4 mul //plessey.checkinit putinterval
100125 0 1 barlen 1 sub {
101126 /i exch def
102127 /indx charvals barcode i 1 getinterval get def
@@ -107,13 +132,12 @@ begin
107132 indx -3 bitshift
108133 ] putinterval
109134 } for
110- /checksalt [ 1 1 1 1 0 1 0 0 1 ] def
111135 0 1 barlen 4 mul 1 sub {
112136 /i exch def
113137 checkbits i get 1 eq {
114138 0 1 8 {
115139 /j exch def
116- checkbits i j add checkbits i j add get checksalt j get xor put
140+ checkbits i j add checkbits i j add get //plessey. checksalt j get xor put
117141 } for
118142 } if
119143 } for
@@ -125,8 +149,8 @@ begin
125149 /checksum1 checkval 15 and def
126150 /checksum2 checkval -4 bitshift def
127151 validatecheck {
128- barcode barlen get barchars checksum1 get ne
129- barcode barlen 1 add get barchars checksum2 get ne or {
152+ barcode barlen get //plessey. barchars checksum1 get ne
153+ barcode barlen 1 add get //plessey. barchars checksum2 get ne or {
130154 /bwipp.plesseyBadCheckDigits (Incorrect Plessey check digits provided) //raiseerror exec
131155 } if
132156 /barcode barcode 0 barlen getinterval def
@@ -135,31 +159,36 @@ begin
135159 /sbs barlen 8 mul unidirectional {27} {33} ifelse add string def
136160 /txt barlen 2 add array def
137161
162+ %
138163 % Put start character
139- sbs 0 encs 16 get putinterval
164+ %
165+ sbs 0 //plessey.encs 16 get putinterval
140166
141167 0 1 barlen 1 sub {
142168 /i exch def
143169 /indx charvals barcode i 1 getinterval get def
144- sbs i 8 mul 8 add encs indx get putinterval
170+ sbs i 8 mul 8 add //plessey. encs indx get putinterval
145171 txt i [barcode i 1 getinterval i 20 mul 20 add textyoffset textfont textsize] put
146172 } for
147173
174+ %
148175 % Put the checksum characters
149- sbs barlen 8 mul 8 add encs checksum1 get putinterval
150- sbs barlen 8 mul 16 add encs checksum2 get putinterval
176+ %
177+ sbs barlen 8 mul 8 add //plessey.encs checksum1 get putinterval
178+ sbs barlen 8 mul 16 add //plessey.encs checksum2 get putinterval
151179 includecheckintext {
152- txt barlen [barchars checksum1 1 getinterval barlen 20 mul 20 add textyoffset textfont textsize] put
153- txt barlen 1 add [barchars checksum2 1 getinterval barlen 1 add 20 mul 20 add textyoffset textfont textsize] put
180+ txt barlen [//plessey. barchars checksum1 1 getinterval barlen 20 mul 20 add textyoffset textfont textsize] put
181+ txt barlen 1 add [//plessey. barchars checksum2 1 getinterval barlen 1 add 20 mul 20 add textyoffset textfont textsize] put
154182 } {
155183 txt barlen [( ) barlen 20 mul 20 add textyoffset textfont textsize] put
156184 txt barlen 1 add [( ) barlen 1 add 20 mul 20 add textyoffset textfont textsize] put
157185 } ifelse
158186
187+ %
159188 % Put end character
160- sbs barlen 8 mul 24 add encs unidirectional {18} {17} ifelse get putinterval
189+ %
190+ sbs barlen 8 mul 24 add //plessey.encs unidirectional {18} {17} ifelse get putinterval
161191
162- % Return the arguments
163192 <<
164193 /ren /renlinear
165194 /sbs [sbs {48 sub} forall]
@@ -173,8 +202,6 @@ begin
173202
174203 dontdraw not //renlinear if
175204
176- //unloadctx exec
177-
178205 end
179206
180207}
0 commit comments