Subversion Repositories Scribus

Compare Revisions

Ignore whitespace Rev 25124 → Rev 25125

/branches/Version15x/Scribus/scribus/plugins/barcodegenerator/barcode.ps
1,6 → 1,6
%!PS
 
% Barcode Writer in Pure PostScript - Version 2021-09-28
% Barcode Writer in Pure PostScript - Version 2022-07-29
% https://bwipp.terryburton.co.uk
%
% Copyright (c) 2004-2022 Terry Burton
32,7 → 32,7
% --BEGIN TEMPLATE--
 
% --BEGIN RESOURCE preamble--
%%BeginResource: Category uk.co.terryburton.bwipp 0.0 2021092800 29733 32838
%%BeginResource: Category uk.co.terryburton.bwipp 0.0 2022072900 29629 32838
%%BeginData: 6 ASCII Lines
currentglobal
true setglobal
44,19 → 44,74
%%EndResource
% --END RESOURCE preamble--
 
% --BEGIN RESOURCE loadctx--
% --REQUIRES preamble--
%%BeginResource: uk.co.terryburton.bwipp loadctx 0.0 2022072900 40205 39999
%%BeginData: 25 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
begin
/loadctx {
% Place a context dictionary just below the current dictionary, which can
% be populated with static data on the first run and then carried between
% invocations of the encoder
/ctxname exch def
ctx null ne {
ctx ctxname known not {
ctx ctxname 10 dict put
/ctxdef {ctx ctxname get begin exec end} def
} {
/ctxdef {pop} def % No need to redefine within the existing context
} ifelse
currentdict ctx ctxname get end begin begin
} {
/ctxdef {exec} def % No context provided, so define ephemerally
} ifelse
}
[/barcode] {null def} forall
bind def
/loadctx dup load /uk.co.terryburton.bwipp defineresource pop
end
/setpacking where {pop setpacking} if
%%EndData
%%EndResource
% --END RESOURCE loadctx--
 
% --BEGIN RESOURCE unloadctx--
% --REQUIRES preamble--
%%BeginResource: uk.co.terryburton.bwipp unloadctx 0.0 2022072900 38856 38677
%%BeginData: 14 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
begin
/unloadctx {
% Remove the context which is expected to be just underneath currentdict
ctx null ne {
currentdict end end begin
} if
}
[/barcode] {null def} forall
bind def
/unloadctx dup load /uk.co.terryburton.bwipp defineresource pop
end
/setpacking where {pop setpacking} if
%%EndData
%%EndResource
% --END RESOURCE unloadctx--
 
% --BEGIN RESOURCE raiseerror--
% --REQUIRES preamble--
%%BeginResource: uk.co.terryburton.bwipp raiseerror 0.0 2021092800 39041 38872
%%BeginResource: uk.co.terryburton.bwipp raiseerror 0.0 2022072900 39029 38860
%%BeginData: 15 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
begin
/raiseerror {
$error exch /errorinfo exch put
$error exch /errorname exch put
$error /command null put
$error /newerror true put
stop
$error exch /errorinfo exch put
$error exch /errorname exch put
$error /command null put
$error /newerror true put
stop
}
[/barcode] {null def} forall
bind def
68,17 → 123,21
% --END RESOURCE raiseerror--
 
% --BEGIN RESOURCE parseinput--
% --REQUIRES preamble raiseerror--
%%BeginResource: uk.co.terryburton.bwipp parseinput 0.0 2021092800 58513 58076
%%BeginData: 129 ASCII Lines
% --REQUIRES preamble loadctx unloadctx raiseerror--
%%BeginResource: uk.co.terryburton.bwipp parseinput 0.0 2022072900 73481 69190
%%BeginData: 174 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
4 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
begin
/parseinput {
 
6 dict begin
20 dict begin
 
/parseinput //loadctx exec
 
/fncvals exch def
/barcode exch def
 
87,6 → 146,21
/parseonly dup dup fncvals exch known def fncvals exch undef
/eci dup dup fncvals exch known def fncvals exch undef
 
% Control character names to ordinals
{
<<
[
/NUL /SOH /STX /ETX /EOT /ENQ /ACK /BEL
/BS /TAB /LF /VT /FF /CR () () % SO and SI prefix clash with SOH
/DLE /DC1 /DC2 /DC3 /DC4 /NAK /SYN /ETB
/CAN /EM /SUB /ESC /FS /GS /RS /US
]
0 exch {
1 index 1 add 3 1 roll exch 3 -1 roll
} forall pop
>> /ctrl exch def
} ctxdef
 
/msg barcode length array def
/j 0 def
barcode { % loop
111,11 → 185,35
 
% parse
parse {
dup length 3 ge {
dup length 3 ge { % "^XXX" byte
dup 0 3 getinterval ctrl exch
2 copy known {
/j j 1 sub def % Replace "^" with ordinal
get msg exch j exch put
/j j 1 add def
dup length 3 sub 3 exch getinterval
exit
} {
pop pop
} ifelse
} if
dup length 2 ge { % "^XX" to byte
dup 0 2 getinterval ctrl exch
2 copy known {
/j j 1 sub def % Replace "^" with ordinal
get msg exch j exch put
/j j 1 add def
dup length 2 sub 2 exch getinterval
exit
} {
pop pop
} ifelse
} if
dup length 3 ge { % "^NNN" to byte
dup 0 3 getinterval true exch {
dup 48 lt exch 57 gt or { pop false } if
} forall
{ % "^NNN" to byte
{
dup 0 3 getinterval cvi dup 255 gt {
pop pop
/bwipp.invalidOrdinal (Ordinal must be 000 to 255) //raiseerror exec
192,6 → 290,8
0 1 j 1 sub { 1 index exch dup msg exch get put } for
} ifelse
 
//unloadctx exec
 
end
 
}
204,762 → 304,231
%%EndResource
% --END RESOURCE parseinput--
 
% --BEGIN RESOURCE gs1lint--
% --REQUIRES preamble raiseerror--
%%BeginResource: uk.co.terryburton.bwipp gs1lint 0.0 2021092800 346062 386888
%%BeginData: 1674 ASCII Lines
% --BEGIN RESOURCE gs1process--
% --REQUIRES preamble loadctx unloadctx parseinput raiseerror--
%%BeginResource: uk.co.terryburton.bwipp gs1process 0.0 2022072900 564308 592071
%%BeginData: 2899 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
2 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
begin
/gs1lint {
/gs1process {
 
20 dict begin
 
/vals exch def
/ais exch def
/gs1process //loadctx exec
 
/lintnumeric {
true exch {
dup 48 lt exch 57 gt or { pop false exit } if
} forall
not { pop /bwipp.GS1notNumeric (Not numeric) false exit } if
} bind def
 
/lintcset82 {
true exch {
1 string dup 0 4 -1 roll put
(!"%&'()*+,-./0123456789:;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz)
exch search not { pop pop false exit } if
pop pop pop
} forall
not { pop /bwipp.GS1badCSET82character (Invalid CSET 82 character) false exit } if
} bind def
 
/lintcset39 {
true exch {
1 string dup 0 4 -1 roll put
(#-/0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ)
exch search not { pop pop false exit } if
pop pop pop
} forall
not { pop /bwipp.GS1badCSET39character (Invalid CSET 39 character) false exit } if
} bind def
 
/lintkey {
dup length 2 lt { pop pop /bwipp.GS1keyTooShort (Key is too short) false exit } if
dup 0 get dup 48 lt exch 57 gt or exch
1 get dup 48 lt exch 57 gt or or {
pop /bwipp.GS1badGCP (Non-numeric company prefix) false exit
} if
} bind def
 
/lintimporteridx {
(-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz)
exch search not {pop pop /bwipp.GS1badImporterIndex (Invalid importer index) false exit} if
pop pop pop
} bind def
 
/lintcsum {
mark exch
dup length 2 mod 0 eq {3} {1} ifelse
exch { 48 sub 1 index mul exch 4 exch sub } forall pop
0 counttomark 1 sub {add} repeat exch pop
10 mod 0 ne { pop /bwipp.GS1badChecksum (Bad checksum) false exit } if
} bind def
 
/cset82 <<
0 (!"%&'\(\)*+,-./0123456789:;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz)
{ exch dup 1 add } forall pop
>> def
 
/cset32 <<
0 (23456789ABCDEFGHJKLMNPQRSTUVWXYZ)
{ exch dup 1 add } forall pop
>> def
 
/lintcsumalpha {
dup length 2 lt { pop pop /bwipp.GS1alphaTooShort (Alphanumeric string is too short to check) false exit} if
dup length 2 sub
2 copy
0 exch getinterval mark exch {
dup cset82 exch known { cset82 exch get } { -1 exit } ifelse
} forall
dup -1 eq { cleartomark pop pop pop /bwipp.GS1UnknownCSET82Character (Unknown CSET 82 character) false exit} if
counttomark array astore exch pop
3 1 roll
2 getinterval mark exch {
dup cset32 exch known { cset32 exch get } { -1 exit } ifelse
} forall
dup -1 eq { cleartomark pop pop /bwipp.GS1UnknownCSET32Character (Unknown CSET 32 character) false exit} if
counttomark array astore exch pop
dup 0 get 5 bitshift exch 1 get add exch
[ 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 ]
1 index length
dup 2 index length gt { pop pop pop pop pop /bwipp.GS1alphaTooLong (Alphanumeric string is too long to check) false exit} if
0 exch getinterval {exch} forall
0 exch { 3 -1 roll exch mul add } forall 1021 mod
ne { pop /bwipp.GS1badAlphaCheckCharacters (Bad alphanumeric check characters) false exit} if
} bind def
 
/iso3166 << [
/004 /008 /010 /012 /016 /020 /024 /028 /031 /032 /036 /040 /044 /048
/050 /051 /052 /056 /060 /064 /068 /070 /072 /074 /076 /084 /086 /090 /092 /096
/100 /104 /108 /112 /116 /120 /124 /132 /136 /140 /144 /148
/152 /156 /158 /162 /166 /170 /174 /175 /178 /180 /184 /188 /191 /192 /196
/203 /204 /208 /212 /214 /218 /222 /226 /231 /232 /233 /234 /238 /239 /242 /246 /248
/250 /254 /258 /260 /262 /266 /268 /270 /275 /276 /288 /292 /296
/300 /304 /308 /312 /316 /320 /324 /328 /332 /334 /336 /340 /344 /348
/352 /356 /360 /364 /368 /372 /376 /380 /384 /388 /392 /398
/400 /404 /408 /410 /414 /417 /418 /422 /426 /428 /430 /434 /438 /440 /442 /446
/450 /454 /458 /462 /466 /470 /474 /478 /480 /484 /492 /496 /498 /499
/500 /504 /508 /512 /516 /520 /524 /528 /531 /533 /534 /535 /540 /548
/554 /558 /562 /566 /570 /574 /578 /580 /581 /583 /584 /585 /586 /591 /598
/600 /604 /608 /612 /616 /620 /624 /626 /630 /634 /638 /642 /643 /646
/652 /654 /659 /660 /662 /663 /666 /670 /674 /678 /682 /686 /688 /690 /694
/702 /703 /704 /705 /706 /710 /716 /724 /728 /729 /732 /740 /744 /748
/752 /756 /760 /762 /764 /768 /772 /776 /780 /784 /788 /792 /795 /796 /798
/800 /804 /807 /818 /826 /831 /832 /833 /834 /840
/850 /854 /858 /860 /862 /876 /882 /887 /894
] {dup} forall >> def
 
/lintiso3166 {
iso3166 exch known not { pop /bwipp.GS1UnknownCountry (Unknown country code) false exit } if
} bind def
 
/lintiso3166999 {
dup /999 ne {
iso3166 exch known not { pop /bwipp.GS1UnknownCountryOr999 (Unknown country code or not 999) false exit } if
} {
pop
} ifelse
} bind def
 
/lintiso3166list {
dup length 3 mod 0 ne {
pop pop /bwipp.GS1BadCountryListLength (Not a group of three-digit country codes) false exit
} if
true
0 3 3 index length 1 sub {
2 index exch 3 getinterval
iso3166 exch known not { pop pop false exit } if
} for
not { pop /bwipp.GS1UnknownCountry (Unknown country code) false exit } if
pop
} bind def
 
/iso3166alpha2 << [
/AD /AE /AF /AG /AI /AL /AM /AO /AQ /AR /AS /AT /AU /AW /AX /AZ
/BA /BB /BD /BE /BF /BG /BH /BI /BJ /BL /BM /BN /BO /BQ /BR /BS /BT /BV /BW /BY /BZ
/CA /CC /CD /CF /CG /CH /CI /CK /CL /CM /CN /CO /CR /CU /CV /CW /CX /CY /CZ
/DE /DJ /DK /DM /DO /DZ
/EC /EE /EG /EH /ER /ES /ET
/FI /FJ /FK /FM /FO /FR
/GA /GB /GD /GE /GF /GG /GH /GI /GL /GM /GN /GP /GQ /GR /GS /GT /GU /GW /GY
/HK /HM /HN /HR /HT /HU
/ID /IE /IL /IM /IN /IO /IQ /IR /IS /IT /JE /JM /JO /JP
/KE /KG /KH /KI /KM /KN /KP /KR /KW /KY /KZ
/LA /LB /LC /LI /LK /LR /LS /LT /LU /LV /LY
/MA /MC /MD /ME /MF /MG /MH /MK /ML /MM /MN /MO /MP /MQ /MR /MS /MT /MU /MV /MW /MX /MY /MZ
/NA /NC /NE /NF /NG /NI /NL /NO /NP /NR /NU /NZ
/OM
/PA /PE /PF /PG /PH /PK /PL /PM /PN /PR /PS /PT /PW /PY
/QA
/RE /RO /RS /RU /RW
/SA /SB /SC /SD /SE /SG /SH /SI /SJ /SK /SL /SM /SN /SO /SR /SS /ST /SV /SX /SY /SZ
/TC /TD /TF /TG /TH /TJ /TK /TL /TM /TN /TO /TR /TT /TV /TW /TZ
/UA /UG /UM /US /UY /UZ
/VA /VC /VE /VG /VI /VN /VU
/WF /WS
/YE /YT
/ZA /ZM /ZW
] {dup} forall >> def
 
/lintiso3166alpha2 {
iso3166alpha2 exch known not { pop /bwipp.GS1UnknownCountryAlpha (Unknown country alpha code) false exit } if
} bind def
 
/iso4217 << [
/008 /012 /032 /036 /044 /048
/050 /051 /052 /060 /064 /068 /072 /084 /090 /096
/104 /108 /116 /124 /132 /136 /144
/152 /156 /170 /174 /188 /191 /192
/203 /208 /214 /222 /230 /232 /238 /242 /262 /270 /292
/320 /324 /328 /332 /340 /344 /348
/352 /356 /360 /364 /368 /376 /388 /392 /398
/400 /404 /408 /410 /414 /417 /418
/422 /426 /430 /434 /446
/454 /458 /462 /480 /484 /496 /498
/504 /512 /516 /524 /532 /533 /548
/554 /558 /566 /578 /586 /590 /598
/600 /604 /608 /634 /643 /646 /654 /682 /690 /694
/702 /704 /706 /710 /728 /748
/752 /756 /760 /764 /776 /780 /784 /788
/800 /807 /818 /826 /834 /840 /858 /860 /882 /886
/901 /927 /928 /929 /930 /931 /932 /933 /934 /936 /938
/940 /941 /943 /944 /946 /947 /948 /949
/950 /951 /952 /953 /955 /956 /957 /958 /959
/960 /961 /962 /963 /964 /965 /967 /968 /969
/970 /971 /972 /973 /975 /976 /977 /978 /979
/980 /981 /984 /985 /986 /990 /994 /997 /999
] {dup} forall >> def
 
/lintiso4217 {
iso4217 exch known not { pop /bwipp.GS1UnknownCurrency (Unknown currency code) false exit } if
} bind def
 
/lintiban {
dup length 4 le { pop pop /bwipp.GS1tooShort (IBAN too short) false exit } if
dup true exch {
1 string dup 0 4 -1 roll put
(0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ)
exch search not { pop pop false exit } if
pop pop pop
} forall
not { pop /bwipp.GS1badIBANcharacter (Invalid IBAN character) false exit } if
dup mark exch mark exch {} forall counttomark -4 roll counttomark array astore exch pop {
48 sub dup 9 gt {7 sub dup 10 idiv exch 10 mod} if
} forall counttomark array astore exch pop
0 exch {exch 10 mul add 97 mod} forall
1 ne { pop pop /bwipp.GS1badIBANchecksum (IBAN checksum incorrect) false exit } if
0 2 getinterval lintiso3166alpha2
} bind def
 
/lintzero {
(0) ne { pop /bwipp.GS1zeroRequired (Zero is required) false exit } if
} bind def
 
/lintnonzero {
false exch { 48 ne {pop true} if } forall
not { pop /bwipp.GS1zeroNotPermitted (Zero not permitted) false exit } if
} bind def
 
/lintnozeroprefix {
dup length 1 gt exch 0 get 48 eq and {
pop /bwipp.GS1badZeroPrefix (Zero prefix is not permitted) false exit
} if
} bind def
 
/lintyymmd0 {
dup 2 2 getinterval cvi dup 1 lt exch 12 gt or { pop /bwipp.GS1badMonth (Invalid month) false exit } if
dup 0 2 getinterval cvi dup 21 sub % Update 20YY periodically for century calculation
dup 51 ge {pop 1900 add} { -50 le {2100 add} {2000 add} ifelse} ifelse % YYYY
dup 400 mod 0 eq exch dup 4 mod 0 eq exch 100 mod 0 ne and or % Leap year?
[ 31 3 -1 roll {29} {28} ifelse 31 30 31 30 31 31 30 31 30 31 ]
1 index 2 2 getinterval cvi 1 sub get
exch 4 2 getinterval cvi lt { pop /bwipp.GS1badDay (Invalid day of month) false exit } if
} bind def
 
/lintyymmdd {
dup length 6 ne { pop /bwipp.GS1badDateLength (Invalid length for date) false exit } if
dup 4 2 getinterval cvi 1 lt { pop /bwipp.GS1badDay (Invalid day of month) false exit } if
lintyymmd0
} bind def
 
/lintyymmddhh {
dup length 8 ne { pop /bwipp.GS1badYYMMDDHHLength (Invalid length for date with hour) false exit } if
dup 6 2 getinterval cvi 23 gt { pop pop /bwipp.GS1badHour (Invalid hour of day) false exit } if
0 6 getinterval lintyymmdd
} bind def
 
/linthhmm {
dup 0 2 getinterval cvi 23 gt { pop pop /bwipp.GS1badHour (Invalid hour of day) false exit } if
2 2 getinterval cvi 59 gt { pop /bwipp.GS1badMinute (Invalid minute in the hour) false exit } if
} bind def
 
/lintmmoptss {
dup length dup 2 ne exch 4 ne and {
pop /bwipp.GS1badTimeLength (Invalid length for optional minutes and seconds) false exit
} if
dup 0 2 getinterval cvi 59 gt { pop pop /bwipp.GS1badMinute (Invalid minute in the hour) false exit } if
dup length 4 ge {
dup 2 2 getinterval cvi 59 gt { pop pop /bwipp.GS1badSecond (Invalid second in the minute) false exit } if
} if
pop
} bind def
 
/lintyesno {
dup (0) ne exch (1) ne and {
pop /bwipp.GS1badBoolean (Neither 0 nor 1 for yes or no) false exit
} if
} bind def
 
/lintwinding {
dup (0) ne exch dup (1) ne exch (9) ne and and {
pop /bwipp.GS1badWinding (Invalid winding direction) false exit
} if
} bind def
 
/lintpieceoftotal {
dup length 2 mod 0 ne { pop pop /bwipp.GS1badPieceTotalLength (Invalid piece/total length) false exit } if
dup dup length 2 idiv 0 exch getinterval cvi
dup 0 eq { pop pop pop /bwipp.GS1badPieceNumber (Invalid piece number) false exit } if
exch dup length 2 idiv dup getinterval cvi
dup 0 eq { pop pop pop /bwipp.GS1badPieceTotal (Invalid total number) false exit } if
gt { pop /bwipp.GS1pieceExceedsTotal (Piece number exceeds total) false exit } if
} bind def
 
/lintpcenc {
{
(%) search not {pop exit} if
pop pop dup length 2 lt { pop pop /bwipp.GS1badPercentEscape (Invalid % escape) false exit } if
dup 0 2 getinterval true exch {
1 string dup 0 4 -1 roll put
(0123456789ABCDEFabcdef)
exch search not { pop pop false exit } if
pop pop pop
} forall
not { pop pop /bwipp.GS1badPercentChars (Invalid characters for percent encoding) false exit } if
} loop
} bind def
 
/lintcouponcode {
dup true exch {
dup 48 lt exch 57 gt or { pop false exit } if
} forall
not { pop pop /bwipp.GS1couponNotNumeric (Coupon not numeric) false exit } if
 
% GCP VLI and value
dup length 1 lt {
pop pop /bwipp.GS1couponTooShortGCPVLI (Coupon too short: Missing GCP VLI) false exit
} if
dup 0 1 getinterval cvi dup 6 gt {
pop pop /bwipp.GS1couponBadGCPVLI (Coupon GCP length indicator must be 0-6) false exit
} if
6 add 1 add
2 copy exch length gt {
pop pop pop /bwipp.GS1couponTooShortGCP (Coupon too short: GCP truncated) false exit
} if
dup 2 index length exch sub getinterval
 
% Offer Code
dup length 6 lt {
pop pop /bwipp.GS1couponTooShortOfferCode (Coupon too short: Offer Code truncated) false exit
} if
dup length 6 sub 6 exch getinterval
 
% Save Value VLI and value
dup length 1 lt {
pop pop /bwipp.GS1couponTooShortSaveValueVLI (Coupon too short: Missing Save Value VLI) false exit
} if
dup 0 1 getinterval cvi dup dup 1 lt exch 5 gt or {
pop pop /bwipp.GS1couponBadSaveValueVLI (Coupon Save Value length indicator must be 1-5) false exit
} if
1 add
2 copy exch length gt {
pop pop pop /bwipp.GS1couponTooShortSaveValue (Coupon too short: Save Value truncated) false exit
} if
dup 2 index length exch sub getinterval
 
% 1st Purchase Requirement VLI and value
dup length 1 lt {
pop pop /bwipp.GS1couponTooShort1stPurchaseRequirementVLI (Coupon too short: Missing 1st Purchase Requirement VLI) false exit
} if
dup 0 1 getinterval cvi dup dup 1 lt exch 5 gt or {
pop pop /bwipp.GS1couponBad1stPurchaseRequirementVLI (Coupon 1st Purchase Requirement length indicator must be 1-5) false exit
} if
1 add
2 copy exch length gt {
pop pop pop /bwipp.GS1couponTooShort1stPurchaseRequirement (Coupon too short: 1st Purchase Requirement truncated) false exit
} if
dup 2 index length exch sub getinterval
 
% 1st Purchase Requirement Code
dup length 1 lt {
pop pop /bwipp.GS1couponTooShort1stPurchaseRequirementCode (Coupon too short: Missing 1st Purchase Requirement Code) false exit
} if
dup 0 1 getinterval cvi dup 4 gt exch 9 ne and {
pop pop /bwipp.GS1couponBad1stPurchaseRequirementCode (Coupon 1st Purchase Requirement Code must be 0-4 or 9) false exit
} if
dup length 1 sub 1 exch getinterval
 
% 1st Purchase Family Code
dup length 3 lt {
pop pop /bwipp.GS1couponTooShort1stPurchaseFamilyCode (Coupon too short: 1st Purchase Family Code truncated) false exit
} if
dup length 3 sub 3 exch getinterval
 
% Optional field 1
dup length 1 ge { dup 0 1 getinterval cvi 1 eq {
1 dup 2 index length exch sub getinterval
 
% Additional Purchase Rules Code
dup length 1 lt {
pop pop /bwipp.GS1couponTooShortAdditionalPurchaseRulesCode (Coupon too short: Missing Additional Purchase Rules Code) false exit
} if
dup 0 1 getinterval cvi 3 gt {
pop pop /bwipp.GS1couponBadAdditionalPurchaseRulesCode (Coupon Additional Purchase Rules Code must be 0-3) false exit
} if
dup length 1 sub 1 exch getinterval
 
% 2nd Purchase RequirementVLI and value
dup length 1 lt {
pop pop /bwipp.GS1couponTooShort2ndPurchaseRequirementVLI (Coupon too short: Missing 2nd Purchase Requirement VLI) false exit
} if
dup 0 1 getinterval cvi dup dup 1 lt exch 5 gt or {
pop pop /bwipp.GS1couponBad2ndPurchaseRequirementVLI (Coupon 2nd Purchase Requirement length indicator must be 1-5) false exit
} if
1 add
2 copy exch length gt {
pop pop pop /bwipp.GS1couponTooShort2ndPurchaseRequirement (Coupon too short: 2nd Purchase Requirement truncated) false exit
} if
dup 2 index length exch sub getinterval
 
% 2nd Purchase Requirement Code
dup length 1 lt {
pop pop /bwipp.GS1couponTooShort2ndPurchaseRequirementCode (Coupon too short: Missing 2nd Purchase Requirement Code) false exit
} if
dup 0 1 getinterval cvi dup 4 gt exch 9 ne and {
pop pop /bwipp.GS1couponBad2ndPurchaseRequirementCode (Coupon 2nd Purchase Requirement Code must be 0-4 or 9) false exit
} if
dup length 1 sub 1 exch getinterval
 
% 2nd Purchase Family Code
dup length 3 lt {
pop pop /bwipp.GS1couponTooShort2ndPurchaseFamilyCode (Coupon too short: 2nd Purchase Family Code truncated) false exit
} if
dup length 3 sub 3 exch getinterval
 
% 2nd Purchase GCP VLI and value
dup length 1 lt {
pop pop /bwipp.GS1couponTooShort2ndPurchaseGCPVLI (Coupon too short: Missing 2nd Purchase GCP VLI) false exit
} if
dup 0 1 getinterval cvi dup dup 6 gt exch 9 ne and {
pop pop /bwipp.GS1couponBad2ndPurchaseGCPVLI (Coupon 2nd Purchase GCP length indicator must be 0-6 or 9) false exit
} if
dup 9 ne {6 add} {pop 0} ifelse 1 add
2 copy exch length gt {
pop pop pop /bwipp.GS1couponTooShort2ndPurchaseGCP (Coupon too short: 2nd Purchase GCP truncated) false exit
} if
dup 2 index length exch sub getinterval
 
} if } if
 
% Optional field 2
dup length 1 ge { dup 0 1 getinterval cvi 2 eq {
1 dup 2 index length exch sub getinterval
 
% 3rd Purchase RequirementVLI and value
dup length 1 lt {
pop pop /bwipp.GS1couponTooShort3rdPurchaseRequirementVLI (Coupon too short: Missing 3rd Purchase Requirement VLI) false exit
} if
dup 0 1 getinterval cvi dup dup 1 lt exch 5 gt or {
pop pop /bwipp.GS1couponBad3rdPurchaseRequirementVLI (Coupon 3rd Purchase Requirement length indicator must be 1-5) false exit
} if
1 add
2 copy exch length gt {
pop pop pop /bwipp.GS1couponTooShort3rdPurchaseRequirement (Coupon too short: 3rd Purchase Requirement truncated) false exit
} if
dup 2 index length exch sub getinterval
 
% 3rd Purchase Requirement Code
dup length 1 lt {
pop pop /bwipp.GS1couponTooShort3rdPurchaseRequirementCode (Coupon too short: Missing 3rd Purchase Requirement Code) false exit
} if
dup 0 1 getinterval cvi dup 4 gt exch 9 ne and {
pop pop /bwipp.GS1couponBad3rdPurchaseRequirementCode (Coupon 3rd Purchase Requirement Code must be 0-4 or 9) false exit
} if
dup length 1 sub 1 exch getinterval
 
% 3rd Purchase Family Code
dup length 3 lt {
pop pop /bwipp.GS1couponTooShort3rdPurchaseFamilyCode (Coupon too short: 3rd Purchase Family Code truncated) false exit
} if
dup length 3 sub 3 exch getinterval
 
% 3rd Purchase GCP VLI and value
dup length 1 lt {
pop pop /bwipp.GS1couponTooShort3rdPurchaseGCPVLI (Coupon too short: Missing 3rd Purchase GCP VLI) false exit
} if
dup 0 1 getinterval cvi dup dup 6 gt exch 9 ne and {
pop pop /bwipp.GS1couponBad3rdPurchaseGCPVLI (Coupon 3rd Purchase GCP length indicator must be 0-6 or 9) false exit
} if
dup 9 ne {6 add} {pop 0} ifelse 1 add
2 copy exch length gt {
pop pop pop /bwipp.GS1couponTooShort3rdPurchaseGCP (Coupon too short: 3rd Purchase GCP truncated) false exit
} if
dup 2 index length exch sub getinterval
 
} if } if
 
% Optional field 3
/couponexpire -1 def
dup length 1 ge { dup 0 1 getinterval cvi 3 eq {
1 dup 2 index length exch sub getinterval
 
% Expiration date
dup length 6 lt {
pop pop /bwipp.GS1couponTooShortExpirationDate (Coupon too short: Expiration date) false exit
} if
dup 2 2 getinterval cvi dup 1 lt exch 12 gt or { pop pop /bwipp.GS1couponExpirationDateBadMonth (Invalid month in expiration date) false exit } if
dup 0 2 getinterval cvi dup 21 sub % Update 20YY periodically for century calculation
dup 51 ge {pop 1900 add} { -50 le {2100 add} {2000 add} ifelse} ifelse % YYYY
dup 400 mod 0 eq exch dup 4 mod 0 eq exch 100 mod 0 ne and or % Leap year?
[ 31 3 -1 roll {29} {28} ifelse 31 30 31 30 31 31 30 31 30 31 ]
1 index 2 2 getinterval cvi 1 sub get
1 index 4 2 getinterval cvi dup 3 1 roll lt
exch 1 lt or { pop pop /bwipp.GS1couponExpirationDateBadDay (Invalid day of month in expiration date) false exit } if
dup 0 6 getinterval cvi /couponexpire exch def
dup length 6 sub 6 exch getinterval
 
} if } if
 
% Optional field 4
dup length 1 ge { dup 0 1 getinterval cvi 4 eq {
1 dup 2 index length exch sub getinterval
 
% Start date
dup length 6 lt {
pop pop /bwipp.GS1couponTooShortStartDate (Coupon too short: Start date) false exit
} if
dup 2 2 getinterval cvi dup 1 lt exch 12 gt or { pop pop /bwipp.GS1couponStartDateBadMonth (Invalid month in start date) false exit } if
dup 0 2 getinterval cvi dup 21 sub % Update 20YY periodically for century calculation
dup 51 ge {pop 1900 add} { -50 le {2100 add} {2000 add} ifelse} ifelse % YYYY
dup 400 mod 0 eq exch dup 4 mod 0 eq exch 100 mod 0 ne and or % Leap year?
[ 31 3 -1 roll {29} {28} ifelse 31 30 31 30 31 31 30 31 30 31 ]
1 index 2 2 getinterval cvi 1 sub get
1 index 4 2 getinterval cvi dup 3 1 roll lt
exch 1 lt or { pop pop /bwipp.GS1couponStartDateBadDay (Invalid day of month in start date) false exit } if
dup 0 6 getinterval cvi /couponstart exch def
couponexpire -1 ne couponexpire couponstart lt and {
pop pop /bwipp.GS1couponExpireDateBeforeStartDate (Coupon expires before it starts) false exit
} if
dup length 6 sub 6 exch getinterval
 
} if } if
 
% Optional field 5
dup length 1 ge { dup 0 1 getinterval cvi 5 eq {
1 dup 2 index length exch sub getinterval
 
% Serial Number VLI and value
dup length 1 lt {
pop pop /bwipp.GS1couponTooShortSerialNumberVLI (Coupon too short: Missing Serial Number VLI) false exit
} if
dup 0 1 getinterval cvi 6 add 1 add
2 copy exch length gt {
pop pop pop /bwipp.GS1couponTooShortSerialNumber (Coupon too short: Serial Number truncated) false exit
} if
dup 2 index length exch sub getinterval
 
} if } if
 
% Optional field 6
dup length 1 ge { dup 0 1 getinterval cvi 6 eq {
1 dup 2 index length exch sub getinterval
 
% Retailer GCP/GLN VLI and value
dup length 1 lt {
pop pop /bwipp.GS1couponTooShortRetailerGCPGLNVLI (Coupon too short: Missing Retailer GCP/GLN VLI) false exit
} if
dup 0 1 getinterval cvi dup dup 1 lt exch 7 gt or {
pop pop /bwipp.GS1couponBadRetailerGCPGLNVLI (Coupon Retailer GCP/GLN length indicator must be 1-7) false exit
} if
6 add 1 add
2 copy exch length gt {
pop pop pop /bwipp.GS1couponTooShortRetailerGCPGLN (Coupon too short: Retailer GCP/GLN truncated) false exit
} if
dup 2 index length exch sub getinterval
 
} if } if
 
% Optional field 9
dup length 1 ge { dup 0 1 getinterval cvi 9 eq {
1 dup 2 index length exch sub getinterval
 
% Save Value Code
dup length 1 lt {
pop pop /bwipp.GS1couponTooShortSaveValueCode (Coupon too short: Missing Save Value Code) false exit
} if
dup 0 1 getinterval cvi dup 6 gt exch dup 3 eq exch 4 eq or or {
pop pop /bwipp.GS1couponBadSaveValueCode (Coupon Save Value Code must be 0,1,2,5 or 6) false exit
} if
dup length 1 sub 1 exch getinterval
 
% Save Value Applies to Item
dup length 1 lt {
pop pop /bwipp.GS1couponTooShortSaveValueAppliesToItem (Coupon too short: Missing Save Value Applies to Item) false exit
} if
dup 0 1 getinterval cvi 2 gt {
pop pop /bwipp.GS1couponBadSaveValueAppliesToItem (Coupon Save Value Applies to Item must be 0-2) false exit
} if
dup length 1 sub 1 exch getinterval
 
% Store Coupon Flag
dup length 1 lt {
pop pop /bwipp.GS1couponTooShortStoreCouponFlag (Coupon too short: Missing Store Coupon Flag) false exit
} if
dup length 1 sub 1 exch getinterval
 
% Don't Multiply Flag
dup length 1 lt {
pop pop /bwipp.GS1couponTooShortDontMultiplyFlag (Coupon too short: Missing Don't Multiply Flag) false exit
} if
dup 0 1 getinterval cvi 1 gt {
pop pop /bwipp.GS1couponBadDontMultiplyFlag (Don't Multiply Flag must be 0 or 1) false exit
} if
dup length 1 sub 1 exch getinterval
 
} if } if
 
dup length 0 ne {
pop pop /bwipp.GS1couponUnrecognisedOptionalField (Coupon fields must be 1,2,3,4,5,6 or 9, increasing order) false exit
} if
pop
} bind def
 
/lintcouponposoffer {
dup true exch {
dup 48 lt exch 57 gt or { pop false exit } if
} forall
not { pop pop /bwipp.GS1couponNotNumeric (Coupon not numeric) false exit } if
% Format Code
dup length 1 lt {
pop pop /bwipp.GS1couponTooShortFormatCode (Coupon too short: Missing Format Code) false exit
} if
dup 0 1 getinterval dup (0) ne exch (1) ne and {
pop pop /bwipp.GS1couponBadFormatCode (Coupon format must be 0 or 1) false exit
} if
dup length 1 sub 1 exch getinterval
% Funder ID VLI and Funder ID
dup length 1 lt {
pop pop /bwipp.GS1couponTooShortFunderVLI (Coupon too short: Missing Funder VLI) false exit
} if
dup 0 1 getinterval cvi dup 6 gt {
pop pop pop /bwipp.GS1couponBadFunderVLI (Coupon Funder length indicator must be 0-6) false exit
} if
6 add 1 add
2 copy exch length gt {
pop pop pop /bwipp.GS1couponTooShortFunder (Coupon too short: Truncated Funder ID) false exit
} if
dup 2 index length exch sub getinterval
% Offer Code
dup length 6 lt {
pop pop /bwipp.GS1couponTooShortOfferCode (Coupon too short: Truncated Offer Code) false exit
} if
dup length 6 sub 6 exch getinterval
% Serial Number VLI and Serial Number
dup length 1 lt {
pop pop /bwipp.GS1couponTooShortSnVLI (Coupon too short: Missing SN VLI) false exit
} if
dup 0 1 getinterval cvi
6 add 1 add
2 copy exch length gt {
pop pop pop /bwipp.GS1couponTooShortSn (Coupon too short: Truncated SN) false exit
} if
dup 2 index length exch sub getinterval
dup length 0 ne {
pop pop /bwipp.GS1couponTooLong (Coupon too long) false exit
} if
pop
} bind def
 
{
% Extracted from the GS1 Syntax Dictionary
/gs1syntax <<
 
[
<< /cset /N /min 18 /max 18 /check [ /lintcsum /lintkey ] >>
]
<<
/parts [
<< /cset /N /min 18 /max 18 /opt false /linters [ /lintcsum /lintkey ] >>
]
/dlpkey [ ]
>>
(00) exch dup
pop
 
[
<< /cset /N /min 14 /max 14 /check [ /lintcsum /lintkey ] >>
]
<<
/parts [
<< /cset /N /min 14 /max 14 /opt false /linters [ /lintcsum /lintkey ] >>
]
/ex [ (02) (255) (37) ]
/dlpkey [ [ (22) (10) (21) ] [ (235) ] ]
>>
(01) exch dup
pop
 
<<
/parts [
<< /cset /N /min 14 /max 14 /opt false /linters [ /lintcsum /lintkey ] >>
]
/req [ [ (37) ] ]
>>
(02) exch dup
pop
 
[
<< /cset /X /min 1 /max 20 /check [] >>
]
<<
/parts [
<< /cset /X /min 1 /max 20 /opt false /linters [] >>
]
/req [ [ (01) (02) (8006) (8026) ] ]
>>
(10) exch dup
pop
 
[
<< /cset /N /min 6 /max 6 /check [ /lintyymmd0 ] >>
]
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [ /lintyymmd0 ] >>
]
/req [ [ (01) (02) (8006) (8026) ] ]
>>
(11) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [ /lintyymmd0 ] >>
]
/req [ [ (8020) ] ]
>>
(12) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [ /lintyymmd0 ] >>
]
/req [ [ (01) (02) (8006) (8026) ] ]
>>
(13) exch dup
(15) exch dup
(16) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [ /lintyymmd0 ] >>
]
/req [ [ (01) (02) (255) (8006) (8026) ] ]
>>
(17) exch dup
pop
 
[
<< /cset /N /min 2 /max 2 /check [] >>
]
<<
/parts [
<< /cset /N /min 2 /max 2 /opt false /linters [] >>
]
/req [ [ (01) (02) (8006) (8026) ] ]
>>
(20) exch dup
pop
 
[
<< /cset /X /min 1 /max 20 /check [] >>
]
<<
/parts [
<< /cset /X /min 1 /max 20 /opt false /linters [] >>
]
/ex [ (235) ]
/req [ [ (01) (8006) ] ]
>>
(21) exch dup
pop
 
<<
/parts [
<< /cset /X /min 1 /max 20 /opt false /linters [] >>
]
/req [ [ (01) ] ]
>>
(22) exch dup
pop
 
[
<< /cset /X /min 1 /max 28 /check [] >>
]
<<
/parts [
<< /cset /X /min 1 /max 28 /opt false /linters [] >>
]
/req [ [ (01) ] ]
>>
(235) exch dup
pop
 
[
<< /cset /X /min 1 /max 30 /check [] >>
]
<<
/parts [
<< /cset /X /min 1 /max 30 /opt false /linters [] >>
]
/req [ [ (01) (02) (8006) (8026) ] ]
>>
(240) exch dup
(241) exch dup
pop
 
[
<< /cset /N /min 1 /max 6 /check [] >>
]
<<
/parts [
<< /cset /N /min 1 /max 6 /opt false /linters [] >>
]
/req [ [ (01) (02) (8006) (8026) ] ]
>>
(242) exch dup
pop
 
[
<< /cset /X /min 1 /max 20 /check [] >>
]
<<
/parts [
<< /cset /X /min 1 /max 20 /opt false /linters [] >>
]
/req [ [ (01) ] ]
>>
(243) exch dup
pop
 
[
<< /cset /X /min 1 /max 30 /check [] >>
]
<<
/parts [
<< /cset /X /min 1 /max 30 /opt false /linters [] >>
]
/req [ [ (01) (8006) ] [ (21) ] ]
>>
(250) exch dup
pop
 
<<
/parts [
<< /cset /X /min 1 /max 30 /opt false /linters [] >>
]
/req [ [ (01) (8006) ] ]
>>
(251) exch dup
pop
 
[
<< /cset /N /min 13 /max 13 /check [ /lintcsum /lintkey ] >>
<< /cset /X /min 0 /max 17 /check [] >>
]
<<
/parts [
<< /cset /N /min 13 /max 13 /opt false /linters [ /lintcsum /lintkey ] >>
<< /cset /X /min 1 /max 17 /opt true /linters [] >>
]
/dlpkey [ ]
>>
(253) exch dup
pop
 
[
<< /cset /X /min 1 /max 20 /check [] >>
]
<<
/parts [
<< /cset /X /min 1 /max 20 /opt false /linters [] >>
]
/req [ [ (414) ] ]
>>
(254) exch dup
pop
 
[
<< /cset /N /min 13 /max 13 /check [ /lintcsum /lintkey ] >>
<< /cset /N /min 0 /max 12 /check [] >>
]
<<
/parts [
<< /cset /N /min 13 /max 13 /opt false /linters [ /lintcsum /lintkey ] >>
<< /cset /N /min 1 /max 12 /opt true /linters [] >>
]
/ex [ (01) (02) (415) (8006) (8020) (8026) ]
/dlpkey [ ]
>>
(255) exch dup
pop
 
[
<< /cset /N /min 1 /max 8 /check [] >>
]
<<
/parts [
<< /cset /N /min 1 /max 8 /opt false /linters [] >>
]
/req [ [ (01) (02) ] ]
>>
(30) exch dup
pop
 
[
<< /cset /N /min 6 /max 6 /check [] >>
]
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (310n) ]
/req [ [ (01) (02) ] ]
>>
(3100) exch dup
(3101) exch dup
(3102) exch dup
966,6 → 535,15
(3103) exch dup
(3104) exch dup
(3105) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (311n) ]
/req [ [ (01) (02) ] ]
>>
(3110) exch dup
(3111) exch dup
(3112) exch dup
972,6 → 550,15
(3113) exch dup
(3114) exch dup
(3115) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (312n) ]
/req [ [ (01) (02) ] ]
>>
(3120) exch dup
(3121) exch dup
(3122) exch dup
978,6 → 565,15
(3123) exch dup
(3124) exch dup
(3125) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (313n) ]
/req [ [ (01) (02) ] ]
>>
(3130) exch dup
(3131) exch dup
(3132) exch dup
984,6 → 580,15
(3133) exch dup
(3134) exch dup
(3135) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (314n) ]
/req [ [ (01) (02) ] ]
>>
(3140) exch dup
(3141) exch dup
(3142) exch dup
990,6 → 595,15
(3143) exch dup
(3144) exch dup
(3145) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (315n) ]
/req [ [ (01) (02) ] ]
>>
(3150) exch dup
(3151) exch dup
(3152) exch dup
996,6 → 610,15
(3153) exch dup
(3154) exch dup
(3155) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (316n) ]
/req [ [ (01) (02) ] ]
>>
(3160) exch dup
(3161) exch dup
(3162) exch dup
1002,6 → 625,15
(3163) exch dup
(3164) exch dup
(3165) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (320n) ]
/req [ [ (01) (02) ] ]
>>
(3200) exch dup
(3201) exch dup
(3202) exch dup
1008,6 → 640,15
(3203) exch dup
(3204) exch dup
(3205) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (321n) ]
/req [ [ (01) (02) ] ]
>>
(3210) exch dup
(3211) exch dup
(3212) exch dup
1014,6 → 655,15
(3213) exch dup
(3214) exch dup
(3215) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (322n) ]
/req [ [ (01) (02) ] ]
>>
(3220) exch dup
(3221) exch dup
(3222) exch dup
1020,6 → 670,15
(3223) exch dup
(3224) exch dup
(3225) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (323n) ]
/req [ [ (01) (02) ] ]
>>
(3230) exch dup
(3231) exch dup
(3232) exch dup
1026,6 → 685,15
(3233) exch dup
(3234) exch dup
(3235) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (324n) ]
/req [ [ (01) (02) ] ]
>>
(3240) exch dup
(3241) exch dup
(3242) exch dup
1032,6 → 700,15
(3243) exch dup
(3244) exch dup
(3245) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (325n) ]
/req [ [ (01) (02) ] ]
>>
(3250) exch dup
(3251) exch dup
(3252) exch dup
1038,6 → 715,15
(3253) exch dup
(3254) exch dup
(3255) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (326n) ]
/req [ [ (01) (02) ] ]
>>
(3260) exch dup
(3261) exch dup
(3262) exch dup
1044,6 → 730,15
(3263) exch dup
(3264) exch dup
(3265) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (327n) ]
/req [ [ (01) (02) ] ]
>>
(3270) exch dup
(3271) exch dup
(3272) exch dup
1050,6 → 745,15
(3273) exch dup
(3274) exch dup
(3275) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (328n) ]
/req [ [ (01) (02) ] ]
>>
(3280) exch dup
(3281) exch dup
(3282) exch dup
1056,6 → 760,15
(3283) exch dup
(3284) exch dup
(3285) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (329n) ]
/req [ [ (01) (02) ] ]
>>
(3290) exch dup
(3291) exch dup
(3292) exch dup
1062,6 → 775,15
(3293) exch dup
(3294) exch dup
(3295) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (330n) ]
/req [ [ (00) (01) ] ]
>>
(3300) exch dup
(3301) exch dup
(3302) exch dup
1068,6 → 790,15
(3303) exch dup
(3304) exch dup
(3305) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (331n) ]
/req [ [ (00) (01) ] ]
>>
(3310) exch dup
(3311) exch dup
(3312) exch dup
1074,6 → 805,15
(3313) exch dup
(3314) exch dup
(3315) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (332n) ]
/req [ [ (00) (01) ] ]
>>
(3320) exch dup
(3321) exch dup
(3322) exch dup
1080,6 → 820,15
(3323) exch dup
(3324) exch dup
(3325) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (333n) ]
/req [ [ (00) (01) ] ]
>>
(3330) exch dup
(3331) exch dup
(3332) exch dup
1086,6 → 835,15
(3333) exch dup
(3334) exch dup
(3335) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (334n) ]
/req [ [ (00) (01) ] ]
>>
(3340) exch dup
(3341) exch dup
(3342) exch dup
1092,6 → 850,15
(3343) exch dup
(3344) exch dup
(3345) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (335n) ]
/req [ [ (00) (01) ] ]
>>
(3350) exch dup
(3351) exch dup
(3352) exch dup
1098,6 → 865,15
(3353) exch dup
(3354) exch dup
(3355) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (336n) ]
/req [ [ (00) (01) ] ]
>>
(3360) exch dup
(3361) exch dup
(3362) exch dup
1104,6 → 880,15
(3363) exch dup
(3364) exch dup
(3365) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (337n) ]
/req [ [ (01) ] ]
>>
(3370) exch dup
(3371) exch dup
(3372) exch dup
1110,6 → 895,15
(3373) exch dup
(3374) exch dup
(3375) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (340n) ]
/req [ [ (00) (01) ] ]
>>
(3400) exch dup
(3401) exch dup
(3402) exch dup
1116,6 → 910,15
(3403) exch dup
(3404) exch dup
(3405) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (341n) ]
/req [ [ (00) (01) ] ]
>>
(3410) exch dup
(3411) exch dup
(3412) exch dup
1122,6 → 925,15
(3413) exch dup
(3414) exch dup
(3415) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (342n) ]
/req [ [ (00) (01) ] ]
>>
(3420) exch dup
(3421) exch dup
(3422) exch dup
1128,6 → 940,15
(3423) exch dup
(3424) exch dup
(3425) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (343n) ]
/req [ [ (00) (01) ] ]
>>
(3430) exch dup
(3431) exch dup
(3432) exch dup
1134,6 → 955,15
(3433) exch dup
(3434) exch dup
(3435) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (344n) ]
/req [ [ (00) (01) ] ]
>>
(3440) exch dup
(3441) exch dup
(3442) exch dup
1140,6 → 970,15
(3443) exch dup
(3444) exch dup
(3445) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (345n) ]
/req [ [ (00) (01) ] ]
>>
(3450) exch dup
(3451) exch dup
(3452) exch dup
1146,6 → 985,15
(3453) exch dup
(3454) exch dup
(3455) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (346n) ]
/req [ [ (00) (01) ] ]
>>
(3460) exch dup
(3461) exch dup
(3462) exch dup
1152,6 → 1000,15
(3463) exch dup
(3464) exch dup
(3465) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (347n) ]
/req [ [ (00) (01) ] ]
>>
(3470) exch dup
(3471) exch dup
(3472) exch dup
1158,6 → 1015,15
(3473) exch dup
(3474) exch dup
(3475) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (348n) ]
/req [ [ (00) (01) ] ]
>>
(3480) exch dup
(3481) exch dup
(3482) exch dup
1164,6 → 1030,15
(3483) exch dup
(3484) exch dup
(3485) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (349n) ]
/req [ [ (00) (01) ] ]
>>
(3490) exch dup
(3491) exch dup
(3492) exch dup
1170,6 → 1045,15
(3493) exch dup
(3494) exch dup
(3495) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (350n) ]
/req [ [ (01) (02) ] ]
>>
(3500) exch dup
(3501) exch dup
(3502) exch dup
1176,6 → 1060,15
(3503) exch dup
(3504) exch dup
(3505) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (351n) ]
/req [ [ (01) (02) ] ]
>>
(3510) exch dup
(3511) exch dup
(3512) exch dup
1182,6 → 1075,15
(3513) exch dup
(3514) exch dup
(3515) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (352n) ]
/req [ [ (01) (02) ] ]
>>
(3520) exch dup
(3521) exch dup
(3522) exch dup
1188,6 → 1090,15
(3523) exch dup
(3524) exch dup
(3525) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (353n) ]
/req [ [ (00) (01) ] ]
>>
(3530) exch dup
(3531) exch dup
(3532) exch dup
1194,6 → 1105,15
(3533) exch dup
(3534) exch dup
(3535) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (354n) ]
/req [ [ (00) (01) ] ]
>>
(3540) exch dup
(3541) exch dup
(3542) exch dup
1200,6 → 1120,15
(3543) exch dup
(3544) exch dup
(3545) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (355n) ]
/req [ [ (00) (01) ] ]
>>
(3550) exch dup
(3551) exch dup
(3552) exch dup
1206,6 → 1135,15
(3553) exch dup
(3554) exch dup
(3555) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (356n) ]
/req [ [ (01) (02) ] ]
>>
(3560) exch dup
(3561) exch dup
(3562) exch dup
1212,6 → 1150,15
(3563) exch dup
(3564) exch dup
(3565) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (357n) ]
/req [ [ (01) (02) ] ]
>>
(3570) exch dup
(3571) exch dup
(3572) exch dup
1218,6 → 1165,15
(3573) exch dup
(3574) exch dup
(3575) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (360n) ]
/req [ [ (01) (02) ] ]
>>
(3600) exch dup
(3601) exch dup
(3602) exch dup
1224,6 → 1180,15
(3603) exch dup
(3604) exch dup
(3605) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (361n) ]
/req [ [ (01) (02) ] ]
>>
(3610) exch dup
(3611) exch dup
(3612) exch dup
1230,6 → 1195,15
(3613) exch dup
(3614) exch dup
(3615) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (362n) ]
/req [ [ (00) (01) ] ]
>>
(3620) exch dup
(3621) exch dup
(3622) exch dup
1236,6 → 1210,15
(3623) exch dup
(3624) exch dup
(3625) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (363n) ]
/req [ [ (00) (01) ] ]
>>
(3630) exch dup
(3631) exch dup
(3632) exch dup
1242,6 → 1225,15
(3633) exch dup
(3634) exch dup
(3635) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (364n) ]
/req [ [ (01) (02) ] ]
>>
(3640) exch dup
(3641) exch dup
(3642) exch dup
1248,6 → 1240,15
(3643) exch dup
(3644) exch dup
(3645) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (365n) ]
/req [ [ (01) (02) ] ]
>>
(3650) exch dup
(3651) exch dup
(3652) exch dup
1254,6 → 1255,15
(3653) exch dup
(3654) exch dup
(3655) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (366n) ]
/req [ [ (01) (02) ] ]
>>
(3660) exch dup
(3661) exch dup
(3662) exch dup
1260,6 → 1270,15
(3663) exch dup
(3664) exch dup
(3665) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (367n) ]
/req [ [ (00) (01) ] ]
>>
(3670) exch dup
(3671) exch dup
(3672) exch dup
1266,6 → 1285,15
(3673) exch dup
(3674) exch dup
(3675) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (368n) ]
/req [ [ (00) (01) ] ]
>>
(3680) exch dup
(3681) exch dup
(3682) exch dup
1272,6 → 1300,15
(3683) exch dup
(3684) exch dup
(3685) exch dup
pop
 
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (369n) ]
/req [ [ (00) (01) ] ]
>>
(3690) exch dup
(3691) exch dup
(3692) exch dup
1280,15 → 1317,22
(3695) exch dup
pop
 
[
<< /cset /N /min 1 /max 8 /check [] >>
]
<<
/parts [
<< /cset /N /min 1 /max 8 /opt false /linters [] >>
]
/req [ [ (00) ] [ (02) (8026) ] ]
>>
(37) exch dup
pop
 
[
<< /cset /N /min 1 /max 15 /check [] >>
]
<<
/parts [
<< /cset /N /min 1 /max 15 /opt false /linters [] >>
]
/ex [ (390n) (391n) (394n) (8111) ]
/req [ [ (255) (8020) ] ]
>>
(3900) exch dup
(3901) exch dup
(3902) exch dup
1301,10 → 1345,14
(3909) exch dup
pop
 
[
<< /cset /N /min 3 /max 3 /check [ /lintiso4217 ] >>
<< /cset /N /min 1 /max 15 /check [] >>
]
<<
/parts [
<< /cset /N /min 3 /max 3 /opt false /linters [ /lintiso4217 ] >>
<< /cset /N /min 1 /max 15 /opt false /linters [] >>
]
/ex [ (391n) ]
/req [ [ (8020) ] ]
>>
(3910) exch dup
(3911) exch dup
(3912) exch dup
1317,9 → 1365,13
(3919) exch dup
pop
 
[
<< /cset /N /min 1 /max 15 /check [] >>
]
<<
/parts [
<< /cset /N /min 1 /max 15 /opt false /linters [] >>
]
/ex [ (392n) (393n) ]
/req [ [ (01) ] [ (30) (31nn) (32nn) (35nn) (36nn) ] ]
>>
(3920) exch dup
(3921) exch dup
(3922) exch dup
1332,10 → 1384,14
(3929) exch dup
pop
 
[
<< /cset /N /min 3 /max 3 /check [ /lintiso4217 ] >>
<< /cset /N /min 1 /max 15 /check [] >>
]
<<
/parts [
<< /cset /N /min 3 /max 3 /opt false /linters [ /lintiso4217 ] >>
<< /cset /N /min 1 /max 15 /opt false /linters [] >>
]
/ex [ (393n) ]
/req [ [ (30) (31nn) (32nn) (35nn) (36nn) ] ]
>>
(3930) exch dup
(3931) exch dup
(3932) exch dup
1348,9 → 1404,13
(3939) exch dup
pop
 
[
<< /cset /N /min 4 /max 4 /check [] >>
]
<<
/parts [
<< /cset /N /min 4 /max 4 /opt false /linters [] >>
]
/ex [ (394n) (8111) ]
/req [ [ (255) ] ]
>>
(3940) exch dup
(3941) exch dup
(3942) exch dup
1357,9 → 1417,13
(3943) exch dup
pop
 
[
<< /cset /N /min 6 /max 6 /check [] >>
]
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/ex [ (392n) (393n) (395n) (8005) ]
/req [ [ (30) (31nn) (32nn) (35nn) (36nn) ] ]
>>
(3950) exch dup
(3951) exch dup
(3952) exch dup
1368,264 → 1432,470
(3955) exch dup
pop
 
[
<< /cset /X /min 1 /max 30 /check [] >>
]
<<
/parts [
<< /cset /X /min 1 /max 30 /opt false /linters [] >>
]
>>
(400) exch dup
pop
 
[
<< /cset /X /min 1 /max 30 /check [ /lintkey ] >>
]
<<
/parts [
<< /cset /X /min 1 /max 30 /opt false /linters [ /lintkey ] >>
]
/dlpkey [ ]
>>
(401) exch dup
pop
 
[
<< /cset /N /min 17 /max 17 /check [ /lintcsum /lintkey ] >>
]
<<
/parts [
<< /cset /N /min 17 /max 17 /opt false /linters [ /lintcsum /lintkey ] >>
]
/dlpkey [ ]
>>
(402) exch dup
pop
 
[
<< /cset /X /min 1 /max 30 /check [] >>
]
<<
/parts [
<< /cset /X /min 1 /max 30 /opt false /linters [] >>
]
/req [ [ (00) ] ]
>>
(403) exch dup
pop
 
[
<< /cset /N /min 13 /max 13 /check [ /lintcsum /lintkey ] >>
]
<<
/parts [
<< /cset /N /min 13 /max 13 /opt false /linters [ /lintcsum /lintkey ] >>
]
>>
(410) exch dup
(411) exch dup
(412) exch dup
(413) exch dup
pop
 
<<
/parts [
<< /cset /N /min 13 /max 13 /opt false /linters [ /lintcsum /lintkey ] >>
]
/dlpkey [ [ (254) ] [ (7040) ] ]
>>
(414) exch dup
pop
 
<<
/parts [
<< /cset /N /min 13 /max 13 /opt false /linters [ /lintcsum /lintkey ] >>
]
/req [ [ (8020) ] ]
>>
(415) exch dup
pop
 
<<
/parts [
<< /cset /N /min 13 /max 13 /opt false /linters [ /lintcsum /lintkey ] >>
]
>>
(416) exch dup
pop
 
<<
/parts [
<< /cset /N /min 13 /max 13 /opt false /linters [ /lintcsum /lintkey ] >>
]
/dlpkey [ [ (7040) ] ]
>>
(417) exch dup
pop
 
[
<< /cset /X /min 1 /max 20 /check [] >>
]
<<
/parts [
<< /cset /X /min 1 /max 20 /opt false /linters [] >>
]
/ex [ (421) ]
>>
(420) exch dup
pop
 
[
<< /cset /N /min 3 /max 3 /check [ /lintiso3166 ] >>
<< /cset /X /min 1 /max 9 /check [] >>
]
<<
/parts [
<< /cset /N /min 3 /max 3 /opt false /linters [ /lintiso3166 ] >>
<< /cset /X /min 1 /max 9 /opt false /linters [] >>
]
/ex [ (4307) ]
>>
(421) exch dup
pop
 
[
<< /cset /N /min 3 /max 3 /check [ /lintiso3166 ] >>
]
<<
/parts [
<< /cset /N /min 3 /max 3 /opt false /linters [ /lintiso3166 ] >>
]
/ex [ (426) ]
/req [ [ (01) (02) (8006) (8026) ] ]
>>
(422) exch dup
pop
 
[
<< /cset /N /min 3 /max 15 /check [ /lintiso3166list ] >>
]
<<
/parts [
<< /cset /N /min 1 /max 15 /opt false /linters [ /lintiso3166list ] >>
]
/ex [ (426) ]
/req [ [ (01) (02) ] ]
>>
(423) exch dup
pop
 
[
<< /cset /N /min 3 /max 3 /check [ /lintiso3166 ] >>
]
<<
/parts [
<< /cset /N /min 3 /max 3 /opt false /linters [ /lintiso3166 ] >>
]
/ex [ (426) ]
/req [ [ (01) (02) ] ]
>>
(424) exch dup
pop
 
[
<< /cset /N /min 3 /max 15 /check [ /lintiso3166list ] >>
]
<<
/parts [
<< /cset /N /min 1 /max 15 /opt false /linters [ /lintiso3166list ] >>
]
/ex [ (426) ]
/req [ [ (01) (02) ] ]
>>
(425) exch dup
pop
 
[
<< /cset /N /min 3 /max 3 /check [ /lintiso3166 ] >>
]
<<
/parts [
<< /cset /N /min 3 /max 3 /opt false /linters [ /lintiso3166 ] >>
]
/req [ [ (01) (02) ] ]
>>
(426) exch dup
pop
 
[
<< /cset /X /min 1 /max 3 /check [] >>
]
<<
/parts [
<< /cset /X /min 1 /max 3 /opt false /linters [] >>
]
/req [ [ (01) (02) ] [ (422) ] ]
>>
(427) exch dup
pop
 
[
<< /cset /X /min 1 /max 35 /check [ /lintpcenc ] >>
]
<<
/parts [
<< /cset /X /min 1 /max 35 /opt false /linters [ /lintpcenc ] >>
]
/req [ [ (00) ] ]
>>
(4300) exch dup
(4301) exch dup
pop
 
[
<< /cset /X /min 1 /max 70 /check [ /lintpcenc ] >>
]
<<
/parts [
<< /cset /X /min 1 /max 70 /opt false /linters [ /lintpcenc ] >>
]
/req [ [ (00) ] ]
>>
(4302) exch dup
pop
 
<<
/parts [
<< /cset /X /min 1 /max 70 /opt false /linters [ /lintpcenc ] >>
]
/req [ [ (4302) ] ]
>>
(4303) exch dup
pop
 
<<
/parts [
<< /cset /X /min 1 /max 70 /opt false /linters [ /lintpcenc ] >>
]
/req [ [ (00) ] ]
>>
(4304) exch dup
(4305) exch dup
(4306) exch dup
pop
 
[
<< /cset /X /min 2 /max 2 /check [ /lintiso3166alpha2 ] >>
]
<<
/parts [
<< /cset /X /min 2 /max 2 /opt false /linters [ /lintiso3166alpha2 ] >>
]
/req [ [ (00) ] ]
>>
(4307) exch dup
pop
 
[
<< /cset /X /min 1 /max 30 /check [] >>
]
<<
/parts [
<< /cset /X /min 1 /max 30 /opt false /linters [] >>
]
/req [ [ (00) ] ]
>>
(4308) exch dup
pop
 
[
<< /cset /X /min 1 /max 35 /check [ /lintpcenc ] >>
]
<<
/parts [
<< /cset /N /min 20 /max 20 /opt false /linters [ /lintlatlong ] >>
]
/req [ [ (00) ] ]
>>
(4309) exch dup
pop
 
<<
/parts [
<< /cset /X /min 1 /max 35 /opt false /linters [ /lintpcenc ] >>
]
/req [ [ (00) ] ]
>>
(4310) exch dup
(4311) exch dup
pop
 
[
<< /cset /X /min 1 /max 70 /check [ /lintpcenc ] >>
]
<<
/parts [
<< /cset /X /min 1 /max 70 /opt false /linters [ /lintpcenc ] >>
]
/req [ [ (00) ] ]
>>
(4312) exch dup
pop
 
<<
/parts [
<< /cset /X /min 1 /max 70 /opt false /linters [ /lintpcenc ] >>
]
/req [ [ (4312) ] ]
>>
(4313) exch dup
pop
 
<<
/parts [
<< /cset /X /min 1 /max 70 /opt false /linters [ /lintpcenc ] >>
]
/req [ [ (00) ] ]
>>
(4314) exch dup
(4315) exch dup
(4316) exch dup
pop
 
[
<< /cset /X /min 2 /max 2 /check [ /lintiso3166alpha2 ] >>
]
<<
/parts [
<< /cset /X /min 2 /max 2 /opt false /linters [ /lintiso3166alpha2 ] >>
]
/req [ [ (00) ] ]
>>
(4317) exch dup
pop
 
[
<< /cset /X /min 1 /max 20 /check [] >>
]
<<
/parts [
<< /cset /X /min 1 /max 20 /opt false /linters [] >>
]
/req [ [ (00) ] ]
>>
(4318) exch dup
pop
 
[
<< /cset /X /min 1 /max 30 /check [] >>
]
<<
/parts [
<< /cset /X /min 1 /max 30 /opt false /linters [] >>
]
/req [ [ (00) ] ]
>>
(4319) exch dup
pop
 
[
<< /cset /X /min 1 /max 35 /check [ /lintpcenc ] >>
]
<<
/parts [
<< /cset /X /min 1 /max 35 /opt false /linters [ /lintpcenc ] >>
]
/req [ [ (00) ] ]
>>
(4320) exch dup
pop
 
[
<< /cset /N /min 1 /max 1 /check [ /lintyesno ] >>
]
<<
/parts [
<< /cset /N /min 1 /max 1 /opt false /linters [ /lintyesno ] >>
]
/req [ [ (00) ] ]
>>
(4321) exch dup
(4322) exch dup
(4323) exch dup
pop
 
[
<< /cset /N /min 6 /max 6 /check [ /lintyymmd0 ] >>
<< /cset /N /min 4 /max 4 /check [ /linthhmm ] >>
]
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [ /lintyymmd0 ] >>
<< /cset /N /min 4 /max 4 /opt false /linters [ /linthhmm ] >>
]
/req [ [ (00) ] ]
>>
(4324) exch dup
(4325) exch dup
pop
 
[
<< /cset /N /min 6 /max 6 /check [ /lintyymmdd ] >>
]
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [ /lintyymmdd ] >>
]
/req [ [ (00) ] ]
>>
(4326) exch dup
pop
 
[
<< /cset /N /min 13 /max 13 /check [] >>
]
<<
/parts [
<< /cset /N /min 13 /max 13 /opt false /linters [] >>
]
/req [ [ (01) (02) (8006) (8026) ] ]
>>
(7001) exch dup
pop
 
[
<< /cset /X /min 1 /max 30 /check [] >>
]
<<
/parts [
<< /cset /X /min 1 /max 30 /opt false /linters [] >>
]
/req [ [ (01) (02) ] ]
>>
(7002) exch dup
pop
 
[
<< /cset /N /min 6 /max 6 /check [ /lintyymmdd ] >>
<< /cset /N /min 4 /max 4 /check [ /linthhmm ] >>
]
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [ /lintyymmdd ] >>
<< /cset /N /min 4 /max 4 /opt false /linters [ /linthhmm ] >>
]
/req [ [ (01) (02) ] ]
>>
(7003) exch dup
pop
 
[
<< /cset /N /min 1 /max 4 /check [] >>
]
<<
/parts [
<< /cset /N /min 1 /max 4 /opt false /linters [] >>
]
/req [ [ (01) ] [ (10) ] ]
>>
(7004) exch dup
pop
 
[
<< /cset /X /min 1 /max 12 /check [] >>
]
<<
/parts [
<< /cset /X /min 1 /max 12 /opt false /linters [] >>
]
/req [ [ (01) (02) ] ]
>>
(7005) exch dup
pop
 
[
<< /cset /N /min 6 /max 6 /check [ /lintyymmdd ] >>
]
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [ /lintyymmdd ] >>
]
/req [ [ (01) (02) ] ]
>>
(7006) exch dup
pop
 
[
<< /cset /N /min 6 /max 6 /check [ /lintyymmdd ] >>
<< /cset /N /min 0 /max 6 /check [ /lintyymmdd ] >>
]
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [ /lintyymmdd ] >>
<< /cset /N /min 6 /max 6 /opt true /linters [ /lintyymmdd ] >>
]
/req [ [ (01) (02) ] ]
>>
(7007) exch dup
pop
 
[
<< /cset /X /min 1 /max 3 /check [] >>
]
<<
/parts [
<< /cset /X /min 1 /max 3 /opt false /linters [] >>
]
/req [ [ (01) (02) ] ]
>>
(7008) exch dup
pop
 
[
<< /cset /X /min 1 /max 10 /check [] >>
]
<<
/parts [
<< /cset /X /min 1 /max 10 /opt false /linters [] >>
]
/req [ [ (01) (02) ] ]
>>
(7009) exch dup
pop
 
[
<< /cset /X /min 1 /max 2 /check [] >>
]
<<
/parts [
<< /cset /X /min 1 /max 2 /opt false /linters [] >>
]
/req [ [ (01) (02) ] ]
>>
(7010) exch dup
pop
 
[
<< /cset /X /min 1 /max 20 /check [] >>
]
<<
/parts [
<< /cset /X /min 1 /max 20 /opt false /linters [] >>
]
/req [ [ (01) (8006) ] [ (416) ] ]
>>
(7020) exch dup
pop
 
<<
/parts [
<< /cset /X /min 1 /max 20 /opt false /linters [] >>
]
/req [ [ (01) (8006) ] ]
>>
(7021) exch dup
pop
 
<<
/parts [
<< /cset /X /min 1 /max 20 /opt false /linters [] >>
]
/req [ [ (7021) ] ]
>>
(7022) exch dup
pop
 
[
<< /cset /X /min 1 /max 30 /check [ /lintkey ] >>
]
<<
/parts [
<< /cset /X /min 1 /max 30 /opt false /linters [ /lintkey ] >>
]
>>
(7023) exch dup
pop
 
[
<< /cset /N /min 3 /max 3 /check [ /lintiso3166999 ] >>
<< /cset /X /min 1 /max 27 /check [] >>
]
<<
/parts [
<< /cset /N /min 3 /max 3 /opt false /linters [ /lintiso3166999 ] >>
<< /cset /X /min 1 /max 27 /opt false /linters [] >>
]
/req [ [ (01) (02) ] ]
>>
(7030) exch dup
(7031) exch dup
(7032) exch dup
1638,18 → 1908,23
(7039) exch dup
pop
 
[
<< /cset /N /min 1 /max 1 /check [] >>
<< /cset /X /min 1 /max 1 /check [] >>
<< /cset /X /min 1 /max 1 /check [] >>
<< /cset /X /min 1 /max 1 /check [ /lintimporteridx ] >>
]
<<
/parts [
<< /cset /N /min 1 /max 1 /opt false /linters [] >>
<< /cset /X /min 1 /max 1 /opt false /linters [] >>
<< /cset /X /min 1 /max 1 /opt false /linters [] >>
<< /cset /X /min 1 /max 1 /opt false /linters [ /lintimporteridx ] >>
]
>>
(7040) exch dup
pop
 
[
<< /cset /X /min 1 /max 20 /check [] >>
]
<<
/parts [
<< /cset /X /min 1 /max 20 /opt false /linters [] >>
]
/req [ [ (01) ] ]
>>
(710) exch dup
(711) exch dup
(712) exch dup
1658,10 → 1933,13
(715) exch dup
pop
 
[
<< /cset /X /min 2 /max 2 /check [] >>
<< /cset /X /min 1 /max 28 /check [] >>
]
<<
/parts [
<< /cset /X /min 2 /max 2 /opt false /linters [] >>
<< /cset /X /min 1 /max 28 /opt false /linters [] >>
]
/req [ [ (01) (8004) ] ]
>>
(7230) exch dup
(7231) exch dup
(7232) exch dup
1674,157 → 1952,235
(7239) exch dup
pop
 
[
<< /cset /X /min 1 /max 20 /check [] >>
]
<<
/parts [
<< /cset /X /min 1 /max 20 /opt false /linters [] >>
]
/req [ [ (01) (8006) ] ]
>>
(7240) exch dup
pop
 
[
<< /cset /N /min 4 /max 4 /check [ /lintnonzero ] >>
<< /cset /N /min 5 /max 5 /check [ /lintnonzero ] >>
<< /cset /N /min 3 /max 3 /check [ /lintnonzero ] >>
<< /cset /N /min 1 /max 1 /check [ /lintwinding ] >>
<< /cset /N /min 1 /max 1 /check [] >>
]
<<
/parts [
<< /cset /N /min 4 /max 4 /opt false /linters [ /lintnonzero ] >>
<< /cset /N /min 5 /max 5 /opt false /linters [ /lintnonzero ] >>
<< /cset /N /min 3 /max 3 /opt false /linters [ /lintnonzero ] >>
<< /cset /N /min 1 /max 1 /opt false /linters [ /lintwinding ] >>
<< /cset /N /min 1 /max 1 /opt false /linters [] >>
]
/req [ [ (01) ] ]
>>
(8001) exch dup
pop
 
[
<< /cset /X /min 1 /max 20 /check [] >>
]
<<
/parts [
<< /cset /X /min 1 /max 20 /opt false /linters [] >>
]
>>
(8002) exch dup
pop
 
[
<< /cset /N /min 1 /max 1 /check [ /lintzero ] >>
<< /cset /N /min 13 /max 13 /check [ /lintcsum /lintkey ] >>
<< /cset /X /min 0 /max 16 /check [] >>
]
<<
/parts [
<< /cset /N /min 1 /max 1 /opt false /linters [ /lintzero ] >>
<< /cset /N /min 13 /max 13 /opt false /linters [ /lintcsum /lintkey ] >>
<< /cset /X /min 1 /max 16 /opt true /linters [] >>
]
/dlpkey [ ]
>>
(8003) exch dup
pop
 
[
<< /cset /X /min 1 /max 30 /check [ /lintkey ] >>
]
<<
/parts [
<< /cset /X /min 1 /max 30 /opt false /linters [ /lintkey ] >>
]
/dlpkey [ [ (7040) ] ]
>>
(8004) exch dup
pop
 
[
<< /cset /N /min 6 /max 6 /check [] >>
]
<<
/parts [
<< /cset /N /min 6 /max 6 /opt false /linters [] >>
]
/req [ [ (01) (02) ] ]
>>
(8005) exch dup
pop
 
[
<< /cset /N /min 14 /max 14 /check [ /lintcsum ] >>
<< /cset /N /min 4 /max 4 /check [ /lintpieceoftotal ] >>
]
<<
/parts [
<< /cset /N /min 14 /max 14 /opt false /linters [ /lintcsum ] >>
<< /cset /N /min 4 /max 4 /opt false /linters [ /lintpieceoftotal ] >>
]
/ex [ (01) (37) ]
/dlpkey [ [ (22) (10) (21) ] ]
>>
(8006) exch dup
pop
 
[
<< /cset /X /min 1 /max 34 /check [ /lintiban ] >>
]
<<
/parts [
<< /cset /X /min 1 /max 34 /opt false /linters [ /lintiban ] >>
]
/req [ [ (415) ] ]
>>
(8007) exch dup
pop
 
[
<< /cset /N /min 8 /max 8 /check [ /lintyymmddhh ] >>
<< /cset /N /min 0 /max 4 /check [ /lintmmoptss ] >>
]
<<
/parts [
<< /cset /N /min 8 /max 8 /opt false /linters [ /lintyymmddhh ] >>
<< /cset /N /min 1 /max 4 /opt true /linters [ /lintmmoptss ] >>
]
/req [ [ (01) (02) ] ]
>>
(8008) exch dup
pop
 
[
<< /cset /X /min 1 /max 50 /check [] >>
]
<<
/parts [
<< /cset /X /min 1 /max 50 /opt false /linters [] >>
]
/req [ [ (00) (01) ] ]
>>
(8009) exch dup
pop
 
[
<< /cset /C /min 1 /max 30 /check [ /lintkey ] >>
]
<<
/parts [
<< /cset /Y /min 1 /max 30 /opt false /linters [ /lintkey ] >>
]
/dlpkey [ [ (8011) ] ]
>>
(8010) exch dup
pop
 
[
<< /cset /N /min 1 /max 12 /check [ /lintnozeroprefix ] >>
]
<<
/parts [
<< /cset /N /min 1 /max 12 /opt false /linters [ /lintnozeroprefix ] >>
]
/req [ [ (8010) ] ]
>>
(8011) exch dup
pop
 
[
<< /cset /X /min 1 /max 20 /check [] >>
]
<<
/parts [
<< /cset /X /min 1 /max 20 /opt false /linters [] >>
]
/req [ [ (01) (8006) ] ]
>>
(8012) exch dup
pop
 
[
<< /cset /X /min 1 /max 25 /check [ /lintcsumalpha /lintkey ] >>
]
<<
/parts [
<< /cset /X /min 1 /max 25 /opt false /linters [ /lintcsumalpha /lintkey ] >>
]
/dlpkey [ ]
>>
(8013) exch dup
pop
 
[
<< /cset /N /min 18 /max 18 /check [ /lintcsum ] >>
]
<<
/parts [
<< /cset /N /min 18 /max 18 /opt false /linters [ /lintcsum ] >>
]
/dlpkey [ [ (8019) ] ]
>>
(8017) exch dup
pop
 
<<
/parts [
<< /cset /N /min 18 /max 18 /opt false /linters [ /lintcsum ] >>
]
/ex [ (8017) ]
/dlpkey [ [ (8019) ] ]
>>
(8018) exch dup
pop
 
[
<< /cset /N /min 1 /max 10 /check [] >>
]
<<
/parts [
<< /cset /N /min 1 /max 10 /opt false /linters [] >>
]
/req [ [ (8017) (8018) ] ]
>>
(8019) exch dup
pop
 
[
<< /cset /X /min 1 /max 25 /check [] >>
]
<<
/parts [
<< /cset /X /min 1 /max 25 /opt false /linters [] >>
]
/req [ [ (415) ] ]
>>
(8020) exch dup
pop
 
[
<< /cset /N /min 14 /max 14 /check [ /lintcsum ] >>
<< /cset /N /min 4 /max 4 /check [ /lintpieceoftotal ] >>
]
<<
/parts [
<< /cset /N /min 14 /max 14 /opt false /linters [ /lintcsum ] >>
<< /cset /N /min 4 /max 4 /opt false /linters [ /lintpieceoftotal ] >>
]
/ex [ (02) (8006) ]
/req [ [ (37) ] ]
>>
(8026) exch dup
pop
 
[
<< /cset /X /min 1 /max 70 /check [ /lintcouponcode ] >>
]
<<
/parts [
<< /cset /X /min 1 /max 70 /opt false /linters [ /lintcouponcode ] >>
]
>>
(8110) exch dup
pop
 
[
<< /cset /N /min 4 /max 4 /check [] >>
]
<<
/parts [
<< /cset /N /min 4 /max 4 /opt false /linters [] >>
]
/req [ [ (255) ] ]
>>
(8111) exch dup
pop
 
[
<< /cset /X /min 1 /max 70 /check [ /lintcouponposoffer ] >>
]
<<
/parts [
<< /cset /X /min 1 /max 70 /opt false /linters [ /lintcouponposoffer ] >>
]
>>
(8112) exch dup
pop
 
[
<< /cset /X /min 1 /max 70 /check [] >>
]
<<
/parts [
<< /cset /X /min 1 /max 70 /opt false /linters [] >>
]
/req [ [ (01) ] ]
>>
(8200) exch dup
pop
 
[
<< /cset /X /min 1 /max 30 /check [] >>
]
<<
/parts [
<< /cset /X /min 1 /max 30 /opt false /linters [] >>
]
>>
(90) exch dup
pop
 
[
<< /cset /X /min 1 /max 90 /check [] >>
]
<<
/parts [
<< /cset /X /min 1 /max 90 /opt false /linters [] >>
]
>>
(91) exch dup
(92) exch dup
(93) exch dup
1837,61 → 2193,1030
pop
 
>> def
} ctxdef
 
true
0 1 vals length 1 sub {
dup ais exch get /ai exch def
vals exch get /val exch def
gs1syntax ai known {
gs1syntax ai get { % For each element of the AI
/props exch def
props /max get val length 2 copy gt {exch} if pop
val exch 0 exch getinterval /eval exch def
/val val eval length dup val length exch sub getinterval def
eval length props /min get lt {
pop /bwipp.GS1valueTooShort (Too short) false exit
% Extract AIs and vals from provided GS1 data in the indicated format
 
/ai eq { % Bracketed AI element string
 
% Parse out AIs and values
(\() anchorsearch not {
pop /bwipp.GS1aiMissingOpenParen (AIs must start with '\(') //raiseerror exec
} if
pop
mark exch { % loop
dup () eq {pop exit} if
(\)) search not {
cleartomark /bwipp.GS1aiMissingCloseParen (AIs must end with '\)') //raiseerror exec
} if
exch pop exch
(\() search { exch pop exch } { () } ifelse
} loop
counttomark dup 0 gt {dup 2 idiv 1 add -1 exch {-1 roll} for} {pop} ifelse
counttomark 2 idiv array astore /ais exch def
counttomark array astore [ exch { % Expand ordinals of the form ^NNN to ASCII
<< /parse parse /parseonly true /parsefnc false >> //parseinput exec
} forall ] /vals exch def
pop
 
} { % Digital Link URI
 
% Validate and strip the scheme
(http://) anchorsearch not {
(https://) anchorsearch not {
pop /bwipp.GS1dlURIbadScheme (Scheme must be http:// or https://) //raiseerror exec
} if} if
pop
 
% Strip the domain
(/) search not {
pop /bwipp.GS1dlMissingDomainOrPathInfo (URI must contain a domain and path info) //raiseerror exec
} if
pop pop
 
% Fragment delimits end of data
(#) search {
exch pop exch pop
} if
 
% Query parameter marker splits path info and query parameters
(?) search not {
() exch null exch
} if
/pp exch def
pop
/qp exch def
 
% Find positions of character immediately following "/" in the path info
mark 0
0 pp {
(/) search not {pop exit} if
length 1 add exch pop 2 index add exch
} loop
counttomark 1 sub array astore /pipos exch def pop pop
pipos length 1 le {
/bwipp.GS1dlNoAIinfo (The path was too short to contain AI info) //raiseerror exec
} if
 
% Walk backwards to find the right-most path element that is a valid dlpkey
false
pipos length 2 sub -2 0 {
dup
dup pipos exch get
exch pipos exch 1 add get 1 index sub 1 sub pp 3 1 roll getinterval
dup gs1syntax exch known {
gs1syntax exch get /dlpkey known {
exch pop true exit
} if
<< /N /lintnumeric /X /lintcset82 /C /lintcset39 >> props /cset get get eval exch load exec
eval length 0 gt {
props /check get { eval exch load exec } forall
} if
} {
pop
} ifelse
pop
} for
not {
/bwipp.GS1dlNoAIinfo (The path does not contain a valid primary key) //raiseerror exec
} if
pipos exch get dup pp length exch sub pp 3 1 roll getinterval /pp exch def
 
/uriunescape {
/in exch def
/out in length string def
0 0 {
1 index in length ge {exit} if
in 2 index get
dup 43 eq { % "+" -> " "
pop out 1 index 32 put
1 add exch 1 add exch
} {
dup 37 eq 3 index in length 2 sub lt and { % "%nn" -> ord
pop
(< >) 4 string copy dup 1 in 5 index 1 add 2 getinterval putinterval cvx
stopped {
pop pop raiseerror_invalid_hex_character
} if
0 get out exch 2 index exch put
1 add exch 3 add exch
} {
out exch 2 index exch put
1 add exch 1 add exch
} ifelse } ifelse
} loop
out exch 0 exch getinterval /out exch def
pop
out
} def
 
/ais 99 array def
/vals 99 array def
0
 
% Extract AIs from the path components
pp {
(/) search {
ais exch 4 index exch put
pop
(/) search {exch pop} {() exch} ifelse
vals exch 3 index exch uriunescape put
} {
pop exit
} ifelse
exch 1 add exch
} loop
 
% Validate the key-qualifiers in the path info sequence
dup 1 gt {
false
gs1syntax ais 0 get get /dlpkey get {
/seq exch def
/i 1 def /j 0 def
{
i ais length ge {exit} if
j seq length ge {exit} if
ais i get seq j get eq {
/i i 1 add def
} if
/j j 1 add def
} loop
i 2 index eq {pop true exit} if
} forall
dup not {exit} if
val length 0 ne {
pop /bwipp.GS1valueTooLong (Too long) false exit
not {
pop /bwipp.GS1dlBadPathInfo (The AIs in the path are not a valid key-qualifier sequence for the key) //raiseerror exec
} if
} if
 
% Extract AIs from the query parameters
qp {
dup () eq {pop exit} if
(&) search {exch pop} {() exch} ifelse
(=) search {
true 1 index {dup 48 ge exch 57 le and and} forall {
ais exch 5 index exch put
pop
vals exch 3 index exch uriunescape put
exch 1 add exch
} { % Ignore non-numeric parameters
pop pop pop
} ifelse
} { % Ignore singletons and empty parameters
pop
} ifelse
} loop
 
/ais ais 0 3 index getinterval def
/vals vals 0 3 index getinterval def
pop
 
% Expand any extracted GTINs
0 1 ais length 1 sub {
dup ais exch get (01) eq {
dup vals exch get
dup length dup 8 eq exch dup 12 eq exch 13 eq or or {
(00000000000000) 14 string copy dup 3 -1 roll dup length 14 exch sub exch putinterval
vals exch 2 index exch put
} {
pop
} ifelse
} if
pop
} for
 
} ifelse
 
% AIs not requiring FNC1 separation
{
/aifixed << [
(00) (01) (02) (03) (04)
(11) (12) (13) (14) (15) (16) (17) (18) (19) (20)
% (23) % Reassigned to variable-length AI (235)!
(31) (32) (33) (34) (35) (36)
(41)
] {dup} forall >> def
} ctxdef
 
/fncs [
ais {
true exch
dup length 2 ge {
0 2 getinterval aifixed exch known {pop false} if
} {
pop
} ifelse
} forall
] def
 
 
% Linter routines for validating AI components
 
/lintnumeric {
true exch {
dup 48 lt exch 57 gt or { pop false exit } if
} forall
not { pop /bwipp.GS1notNumeric (Not numeric) false exit } if
} def
 
/lintcset82 {
true exch {
1 string dup 0 4 -1 roll put
(!"%&'()*+,-./0123456789:;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz)
exch search not { pop pop false exit } if
pop pop pop
} forall
not { pop /bwipp.GS1badCSET82character (Invalid CSET 82 character) false exit } if
} def
 
/lintcset39 {
true exch {
1 string dup 0 4 -1 roll put
(#-/0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ)
exch search not { pop pop false exit } if
pop pop pop
} forall
not { pop /bwipp.GS1badCSET39character (Invalid CSET 39 character) false exit } if
} def
 
/lintkey {
dup length 2 lt { pop pop /bwipp.GS1keyTooShort (Key is too short) false exit } if
dup 0 get dup 48 lt exch 57 gt or exch
1 get dup 48 lt exch 57 gt or or {
pop /bwipp.GS1badGCP (Non-numeric company prefix) false exit
} if
} def
 
/lintimporteridx {
(-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz)
exch search not {pop pop /bwipp.GS1badImporterIndex (Invalid importer index) false exit} if
pop pop pop
} def
 
/lintcsum {
mark exch
dup length 2 mod 0 eq {3} {1} ifelse
exch { 48 sub 1 index mul exch 4 exch sub } forall pop
0 counttomark 1 sub {add} repeat exch pop
10 mod 0 ne { pop /bwipp.GS1badChecksum (Bad checksum) false exit } if
} def
 
{
/cset82 <<
0 (!"%&'\(\)*+,-./0123456789:;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz)
{ exch dup 1 add } forall pop
>> def
 
/cset32 <<
0 (23456789ABCDEFGHJKLMNPQRSTUVWXYZ)
{ exch dup 1 add } forall pop
>> def
} ctxdef
 
/lintcsumalpha {
dup length 2 lt { pop pop /bwipp.GS1alphaTooShort (Alphanumeric string is too short to check) false exit} if
dup length 2 sub
2 copy
0 exch getinterval mark exch {
dup cset82 exch known { cset82 exch get } { -1 exit } ifelse
} forall
dup -1 eq { cleartomark pop pop pop /bwipp.GS1UnknownCSET82Character (Unknown CSET 82 character) false exit} if
counttomark array astore exch pop
3 1 roll
2 getinterval mark exch {
dup cset32 exch known { cset32 exch get } { -1 exit } ifelse
} forall
dup -1 eq { cleartomark pop pop /bwipp.GS1UnknownCSET32Character (Unknown CSET 32 character) false exit} if
counttomark array astore exch pop
dup 0 get 5 bitshift exch 1 get add exch
[ 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 ]
1 index length
dup 2 index length gt { pop pop pop pop pop /bwipp.GS1alphaTooLong (Alphanumeric string is too long to check) false exit} if
0 exch getinterval {exch} forall
0 exch { 3 -1 roll exch mul add } forall 1021 mod
ne { pop /bwipp.GS1badAlphaCheckCharacters (Bad alphanumeric check characters) false exit} if
} def
 
{
/iso3166 << [
/004 /008 /010 /012 /016 /020 /024 /028 /031 /032 /036 /040 /044 /048
/050 /051 /052 /056 /060 /064 /068 /070 /072 /074 /076 /084 /086 /090 /092 /096
/100 /104 /108 /112 /116 /120 /124 /132 /136 /140 /144 /148
/152 /156 /158 /162 /166 /170 /174 /175 /178 /180 /184 /188 /191 /192 /196
/203 /204 /208 /212 /214 /218 /222 /226 /231 /232 /233 /234 /238 /239 /242 /246 /248
/250 /254 /258 /260 /262 /266 /268 /270 /275 /276 /288 /292 /296
/300 /304 /308 /312 /316 /320 /324 /328 /332 /334 /336 /340 /344 /348
/352 /356 /360 /364 /368 /372 /376 /380 /384 /388 /392 /398
/400 /404 /408 /410 /414 /417 /418 /422 /426 /428 /430 /434 /438 /440 /442 /446
/450 /454 /458 /462 /466 /470 /474 /478 /480 /484 /492 /496 /498 /499
/500 /504 /508 /512 /516 /520 /524 /528 /531 /533 /534 /535 /540 /548
/554 /558 /562 /566 /570 /574 /578 /580 /581 /583 /584 /585 /586 /591 /598
/600 /604 /608 /612 /616 /620 /624 /626 /630 /634 /638 /642 /643 /646
/652 /654 /659 /660 /662 /663 /666 /670 /674 /678 /682 /686 /688 /690 /694
/702 /703 /704 /705 /706 /710 /716 /724 /728 /729 /732 /740 /744 /748
/752 /756 /760 /762 /764 /768 /772 /776 /780 /784 /788 /792 /795 /796 /798
/800 /804 /807 /818 /826 /831 /832 /833 /834 /840
/850 /854 /858 /860 /862 /876 /882 /887 /894
] {dup} forall >> def
} ctxdef
 
/lintiso3166 {
iso3166 exch known not { pop /bwipp.GS1UnknownCountry (Unknown country code) false exit } if
} def
 
/lintiso3166999 {
dup /999 ne {
iso3166 exch known not { pop /bwipp.GS1UnknownCountryOr999 (Unknown country code or not 999) false exit } if
} {
pop /bwipp.GS1unknownAI (Unrecognised AI) false exit
pop
} ifelse
} for
not {
dup length ai length add 5 add string
dup 0 (AI ) putinterval
dup 3 ai putinterval
dup 3 ai length add (: ) putinterval
dup 5 ai length add 4 -1 roll putinterval
//raiseerror exec
} if
true
} def
 
/lintiso3166list {
dup length 3 mod 0 ne {
pop pop /bwipp.GS1BadCountryListLength (Not a group of three-digit country codes) false exit
} if
true
0 3 3 index length 1 sub {
2 index exch 3 getinterval
iso3166 exch known not { pop pop false exit } if
} for
not { pop /bwipp.GS1UnknownCountry (Unknown country code) false exit } if
pop
} def
 
{
/iso3166alpha2 << [
/AD /AE /AF /AG /AI /AL /AM /AO /AQ /AR /AS /AT /AU /AW /AX /AZ
/BA /BB /BD /BE /BF /BG /BH /BI /BJ /BL /BM /BN /BO /BQ /BR /BS /BT /BV /BW /BY /BZ
/CA /CC /CD /CF /CG /CH /CI /CK /CL /CM /CN /CO /CR /CU /CV /CW /CX /CY /CZ
/DE /DJ /DK /DM /DO /DZ
/EC /EE /EG /EH /ER /ES /ET
/FI /FJ /FK /FM /FO /FR
/GA /GB /GD /GE /GF /GG /GH /GI /GL /GM /GN /GP /GQ /GR /GS /GT /GU /GW /GY
/HK /HM /HN /HR /HT /HU
/ID /IE /IL /IM /IN /IO /IQ /IR /IS /IT /JE /JM /JO /JP
/KE /KG /KH /KI /KM /KN /KP /KR /KW /KY /KZ
/LA /LB /LC /LI /LK /LR /LS /LT /LU /LV /LY
/MA /MC /MD /ME /MF /MG /MH /MK /ML /MM /MN /MO /MP /MQ /MR /MS /MT /MU /MV /MW /MX /MY /MZ
/NA /NC /NE /NF /NG /NI /NL /NO /NP /NR /NU /NZ
/OM
/PA /PE /PF /PG /PH /PK /PL /PM /PN /PR /PS /PT /PW /PY
/QA
/RE /RO /RS /RU /RW
/SA /SB /SC /SD /SE /SG /SH /SI /SJ /SK /SL /SM /SN /SO /SR /SS /ST /SV /SX /SY /SZ
/TC /TD /TF /TG /TH /TJ /TK /TL /TM /TN /TO /TR /TT /TV /TW /TZ
/UA /UG /UM /US /UY /UZ
/VA /VC /VE /VG /VI /VN /VU
/WF /WS
/YE /YT
/ZA /ZM /ZW
] {dup} forall >> def
} ctxdef
 
/lintiso3166alpha2 {
iso3166alpha2 exch known not { pop /bwipp.GS1UnknownCountryAlpha (Unknown country alpha code) false exit } if
} def
 
{
/iso4217 << [
/008 /012 /032 /036 /044 /048
/050 /051 /052 /060 /064 /068 /072 /084 /090 /096
/104 /108 /116 /124 /132 /136 /144
/152 /156 /170 /174 /188 /191 /192
/203 /208 /214 /222 /230 /232 /238 /242 /262 /270 /292
/320 /324 /328 /332 /340 /344 /348
/352 /356 /360 /364 /368 /376 /388 /392 /398
/400 /404 /408 /410 /414 /417 /418
/422 /426 /430 /434 /446
/454 /458 /462 /480 /484 /496 /498
/504 /512 /516 /524 /532 /533 /548
/554 /558 /566 /578 /586 /590 /598
/600 /604 /608 /634 /643 /646 /654 /682 /690 /694
/702 /704 /706 /710 /728 /748
/752 /756 /760 /764 /776 /780 /784 /788
/800 /807 /818 /826 /834 /840 /858 /860 /882 /886
/901 /925 /927 /928 /929 /930 /931 /932 /933 /934 /936 /938
/940 /941 /943 /944 /946 /947 /948 /949
/950 /951 /952 /953 /955 /956 /957 /958 /959
/960 /961 /962 /963 /964 /965 /967 /968 /969
/970 /971 /972 /973 /975 /976 /977 /978 /979
/980 /981 /984 /985 /986 /990 /994 /997 /999
] {dup} forall >> def
} ctxdef
 
/lintiso4217 {
iso4217 exch known not { pop /bwipp.GS1UnknownCurrency (Unknown currency code) false exit } if
} def
 
/lintiban {
dup length 4 le { pop pop /bwipp.GS1tooShort (IBAN too short) false exit } if
dup true exch {
1 string dup 0 4 -1 roll put
(0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ)
exch search not { pop pop false exit } if
pop pop pop
} forall
not { pop /bwipp.GS1badIBANcharacter (Invalid IBAN character) false exit } if
dup mark exch mark exch {} forall counttomark -4 roll counttomark array astore exch pop {
48 sub dup 9 gt {7 sub dup 10 idiv exch 10 mod} if
} forall counttomark array astore exch pop
0 exch {exch 10 mul add 97 mod} forall
1 ne { pop pop /bwipp.GS1badIBANchecksum (IBAN checksum incorrect) false exit } if
0 2 getinterval lintiso3166alpha2
} def
 
/lintzero {
(0) ne { pop /bwipp.GS1zeroRequired (Zero is required) false exit } if
} def
 
/lintnonzero {
false exch { 48 ne {pop true} if } forall
not { pop /bwipp.GS1zeroNotPermitted (Zero not permitted) false exit } if
} def
 
/lintnozeroprefix {
dup length 1 gt exch 0 get 48 eq and {
pop /bwipp.GS1badZeroPrefix (Zero prefix is not permitted) false exit
} if
} def
 
/lintyymmd0 {
dup 2 2 getinterval cvi dup 1 lt exch 12 gt or { pop /bwipp.GS1badMonth (Invalid month) false exit } if
dup 0 2 getinterval cvi dup 21 sub % Update 20YY periodically for century calculation
dup 51 ge {pop 1900 add} { -50 le {2100 add} {2000 add} ifelse} ifelse % YYYY
dup 400 mod 0 eq exch dup 4 mod 0 eq exch 100 mod 0 ne and or % Leap year?
[ 31 3 -1 roll {29} {28} ifelse 31 30 31 30 31 31 30 31 30 31 ]
1 index 2 2 getinterval cvi 1 sub get
exch 4 2 getinterval cvi lt { pop /bwipp.GS1badDay (Invalid day of month) false exit } if
} def
 
/lintyymmdd {
dup length 6 ne { pop /bwipp.GS1badDateLength (Invalid length for date) false exit } if
dup 4 2 getinterval cvi 1 lt { pop /bwipp.GS1badDay (Invalid day of month) false exit } if
lintyymmd0
} def
 
/lintyymmddhh {
dup length 8 ne { pop /bwipp.GS1badYYMMDDHHLength (Invalid length for date with hour) false exit } if
dup 6 2 getinterval cvi 23 gt { pop pop /bwipp.GS1badHour (Invalid hour of day) false exit } if
0 6 getinterval lintyymmdd
} def
 
/linthhmm {
dup 0 2 getinterval cvi 23 gt { pop pop /bwipp.GS1badHour (Invalid hour of day) false exit } if
2 2 getinterval cvi 59 gt { pop /bwipp.GS1badMinute (Invalid minute in the hour) false exit } if
} def
 
/lintmmoptss {
dup length dup 2 ne exch 4 ne and {
pop /bwipp.GS1badTimeLength (Invalid length for optional minutes and seconds) false exit
} if
dup 0 2 getinterval cvi 59 gt { pop pop /bwipp.GS1badMinute (Invalid minute in the hour) false exit } if
dup length 4 ge {
dup 2 2 getinterval cvi 59 gt { pop pop /bwipp.GS1badSecond (Invalid second in the minute) false exit } if
} if
pop
} def
 
/lintyesno {
dup (0) ne exch (1) ne and {
pop /bwipp.GS1badBoolean (Neither 0 nor 1 for yes or no) false exit
} if
} def
 
/lintwinding {
dup (0) ne exch dup (1) ne exch (9) ne and and {
pop /bwipp.GS1badWinding (Invalid winding direction) false exit
} if
} def
 
/lintpieceoftotal {
dup length 2 mod 0 ne { pop pop /bwipp.GS1badPieceTotalLength (Invalid piece/total length) false exit } if
dup dup length 2 idiv 0 exch getinterval cvi
dup 0 eq { pop pop pop /bwipp.GS1badPieceNumber (Invalid piece number) false exit } if
exch dup length 2 idiv dup getinterval cvi
dup 0 eq { pop pop pop /bwipp.GS1badPieceTotal (Invalid total number) false exit } if
gt { pop /bwipp.GS1pieceExceedsTotal (Piece number exceeds total) false exit } if
} def
 
/lintpcenc {
{
(%) search not {pop exit} if
pop pop dup length 2 lt { pop pop /bwipp.GS1badPercentEscape (Invalid % escape) false exit } if
dup 0 2 getinterval true exch {
1 string dup 0 4 -1 roll put
(0123456789ABCDEFabcdef)
exch search not { pop pop false exit } if
pop pop pop
} forall
not { pop pop /bwipp.GS1badPercentChars (Invalid characters for percent encoding) false exit } if
} loop
} bind def
 
/lintcouponcode {
dup true exch {
dup 48 lt exch 57 gt or { pop false exit } if
} forall
not { pop pop /bwipp.GS1couponNotNumeric (Coupon not numeric) false exit } if
 
% GCP VLI and value
dup length 1 lt {
pop pop /bwipp.GS1couponTooShortGCPVLI (Coupon too short: Missing GCP VLI) false exit
} if
dup 0 1 getinterval cvi dup 6 gt {
pop pop /bwipp.GS1couponBadGCPVLI (Coupon GCP length indicator must be 0-6) false exit
} if
6 add 1 add
2 copy exch length gt {
pop pop pop /bwipp.GS1couponTooShortGCP (Coupon too short: GCP truncated) false exit
} if
dup 2 index length exch sub getinterval
 
% Offer Code
dup length 6 lt {
pop pop /bwipp.GS1couponTooShortOfferCode (Coupon too short: Offer Code truncated) false exit
} if
dup length 6 sub 6 exch getinterval
 
% Save Value VLI and value
dup length 1 lt {
pop pop /bwipp.GS1couponTooShortSaveValueVLI (Coupon too short: Missing Save Value VLI) false exit
} if
dup 0 1 getinterval cvi dup dup 1 lt exch 5 gt or {
pop pop /bwipp.GS1couponBadSaveValueVLI (Coupon Save Value length indicator must be 1-5) false exit
} if
1 add
2 copy exch length gt {
pop pop pop /bwipp.GS1couponTooShortSaveValue (Coupon too short: Save Value truncated) false exit
} if
dup 2 index length exch sub getinterval
 
% 1st Purchase Requirement VLI and value
dup length 1 lt {
pop pop /bwipp.GS1couponTooShort1stPurchaseRequirementVLI (Coupon too short: Missing 1st Purchase Requirement VLI) false exit
} if
dup 0 1 getinterval cvi dup dup 1 lt exch 5 gt or {
pop pop /bwipp.GS1couponBad1stPurchaseRequirementVLI (Coupon 1st Purchase Requirement length indicator must be 1-5) false exit
} if
1 add
2 copy exch length gt {
pop pop pop /bwipp.GS1couponTooShort1stPurchaseRequirement (Coupon too short: 1st Purchase Requirement truncated) false exit
} if
dup 2 index length exch sub getinterval
 
% 1st Purchase Requirement Code
dup length 1 lt {
pop pop /bwipp.GS1couponTooShort1stPurchaseRequirementCode (Coupon too short: Missing 1st Purchase Requirement Code) false exit
} if
dup 0 1 getinterval cvi dup 4 gt exch 9 ne and {
pop pop /bwipp.GS1couponBad1stPurchaseRequirementCode (Coupon 1st Purchase Requirement Code must be 0-4 or 9) false exit
} if
dup length 1 sub 1 exch getinterval
 
% 1st Purchase Family Code
dup length 3 lt {
pop pop /bwipp.GS1couponTooShort1stPurchaseFamilyCode (Coupon too short: 1st Purchase Family Code truncated) false exit
} if
dup length 3 sub 3 exch getinterval
 
% Optional field 1
dup length 1 ge { dup 0 1 getinterval cvi 1 eq {
1 dup 2 index length exch sub getinterval
 
% Additional Purchase Rules Code
dup length 1 lt {
pop pop /bwipp.GS1couponTooShortAdditionalPurchaseRulesCode (Coupon too short: Missing Additional Purchase Rules Code) false exit
} if
dup 0 1 getinterval cvi 3 gt {
pop pop /bwipp.GS1couponBadAdditionalPurchaseRulesCode (Coupon Additional Purchase Rules Code must be 0-3) false exit
} if
dup length 1 sub 1 exch getinterval
 
% 2nd Purchase RequirementVLI and value
dup length 1 lt {
pop pop /bwipp.GS1couponTooShort2ndPurchaseRequirementVLI (Coupon too short: Missing 2nd Purchase Requirement VLI) false exit
} if
dup 0 1 getinterval cvi dup dup 1 lt exch 5 gt or {
pop pop /bwipp.GS1couponBad2ndPurchaseRequirementVLI (Coupon 2nd Purchase Requirement length indicator must be 1-5) false exit
} if
1 add
2 copy exch length gt {
pop pop pop /bwipp.GS1couponTooShort2ndPurchaseRequirement (Coupon too short: 2nd Purchase Requirement truncated) false exit
} if
dup 2 index length exch sub getinterval
 
% 2nd Purchase Requirement Code
dup length 1 lt {
pop pop /bwipp.GS1couponTooShort2ndPurchaseRequirementCode (Coupon too short: Missing 2nd Purchase Requirement Code) false exit
} if
dup 0 1 getinterval cvi dup 4 gt exch 9 ne and {
pop pop /bwipp.GS1couponBad2ndPurchaseRequirementCode (Coupon 2nd Purchase Requirement Code must be 0-4 or 9) false exit
} if
dup length 1 sub 1 exch getinterval
 
% 2nd Purchase Family Code
dup length 3 lt {
pop pop /bwipp.GS1couponTooShort2ndPurchaseFamilyCode (Coupon too short: 2nd Purchase Family Code truncated) false exit
} if
dup length 3 sub 3 exch getinterval
 
% 2nd Purchase GCP VLI and value
dup length 1 lt {
pop pop /bwipp.GS1couponTooShort2ndPurchaseGCPVLI (Coupon too short: Missing 2nd Purchase GCP VLI) false exit
} if
dup 0 1 getinterval cvi dup dup 6 gt exch 9 ne and {
pop pop /bwipp.GS1couponBad2ndPurchaseGCPVLI (Coupon 2nd Purchase GCP length indicator must be 0-6 or 9) false exit
} if
dup 9 ne {6 add} {pop 0} ifelse 1 add
2 copy exch length gt {
pop pop pop /bwipp.GS1couponTooShort2ndPurchaseGCP (Coupon too short: 2nd Purchase GCP truncated) false exit
} if
dup 2 index length exch sub getinterval
 
} if } if
 
% Optional field 2
dup length 1 ge { dup 0 1 getinterval cvi 2 eq {
1 dup 2 index length exch sub getinterval
 
% 3rd Purchase RequirementVLI and value
dup length 1 lt {
pop pop /bwipp.GS1couponTooShort3rdPurchaseRequirementVLI (Coupon too short: Missing 3rd Purchase Requirement VLI) false exit
} if
dup 0 1 getinterval cvi dup dup 1 lt exch 5 gt or {
pop pop /bwipp.GS1couponBad3rdPurchaseRequirementVLI (Coupon 3rd Purchase Requirement length indicator must be 1-5) false exit
} if
1 add
2 copy exch length gt {
pop pop pop /bwipp.GS1couponTooShort3rdPurchaseRequirement (Coupon too short: 3rd Purchase Requirement truncated) false exit
} if
dup 2 index length exch sub getinterval
 
% 3rd Purchase Requirement Code
dup length 1 lt {
pop pop /bwipp.GS1couponTooShort3rdPurchaseRequirementCode (Coupon too short: Missing 3rd Purchase Requirement Code) false exit
} if
dup 0 1 getinterval cvi dup 4 gt exch 9 ne and {
pop pop /bwipp.GS1couponBad3rdPurchaseRequirementCode (Coupon 3rd Purchase Requirement Code must be 0-4 or 9) false exit
} if
dup length 1 sub 1 exch getinterval
 
% 3rd Purchase Family Code
dup length 3 lt {
pop pop /bwipp.GS1couponTooShort3rdPurchaseFamilyCode (Coupon too short: 3rd Purchase Family Code truncated) false exit
} if
dup length 3 sub 3 exch getinterval
 
% 3rd Purchase GCP VLI and value
dup length 1 lt {
pop pop /bwipp.GS1couponTooShort3rdPurchaseGCPVLI (Coupon too short: Missing 3rd Purchase GCP VLI) false exit
} if
dup 0 1 getinterval cvi dup dup 6 gt exch 9 ne and {
pop pop /bwipp.GS1couponBad3rdPurchaseGCPVLI (Coupon 3rd Purchase GCP length indicator must be 0-6 or 9) false exit
} if
dup 9 ne {6 add} {pop 0} ifelse 1 add
2 copy exch length gt {
pop pop pop /bwipp.GS1couponTooShort3rdPurchaseGCP (Coupon too short: 3rd Purchase GCP truncated) false exit
} if
dup 2 index length exch sub getinterval
 
} if } if
 
% Optional field 3
/couponexpire -1 def
dup length 1 ge { dup 0 1 getinterval cvi 3 eq {
1 dup 2 index length exch sub getinterval
 
% Expiration date
dup length 6 lt {
pop pop /bwipp.GS1couponTooShortExpirationDate (Coupon too short: Expiration date) false exit
} if
dup 2 2 getinterval cvi dup 1 lt exch 12 gt or { pop pop /bwipp.GS1couponExpirationDateBadMonth (Invalid month in expiration date) false exit } if
dup 0 2 getinterval cvi dup 21 sub % Update 20YY periodically for century calculation
dup 51 ge {pop 1900 add} { -50 le {2100 add} {2000 add} ifelse} ifelse % YYYY
dup 400 mod 0 eq exch dup 4 mod 0 eq exch 100 mod 0 ne and or % Leap year?
[ 31 3 -1 roll {29} {28} ifelse 31 30 31 30 31 31 30 31 30 31 ]
1 index 2 2 getinterval cvi 1 sub get
1 index 4 2 getinterval cvi dup 3 1 roll lt
exch 1 lt or { pop pop /bwipp.GS1couponExpirationDateBadDay (Invalid day of month in expiration date) false exit } if
dup 0 6 getinterval cvi /couponexpire exch def
dup length 6 sub 6 exch getinterval
 
} if } if
 
% Optional field 4
dup length 1 ge { dup 0 1 getinterval cvi 4 eq {
1 dup 2 index length exch sub getinterval
 
% Start date
dup length 6 lt {
pop pop /bwipp.GS1couponTooShortStartDate (Coupon too short: Start date) false exit
} if
dup 2 2 getinterval cvi dup 1 lt exch 12 gt or { pop pop /bwipp.GS1couponStartDateBadMonth (Invalid month in start date) false exit } if
dup 0 2 getinterval cvi dup 21 sub % Update 20YY periodically for century calculation
dup 51 ge {pop 1900 add} { -50 le {2100 add} {2000 add} ifelse} ifelse % YYYY
dup 400 mod 0 eq exch dup 4 mod 0 eq exch 100 mod 0 ne and or % Leap year?
[ 31 3 -1 roll {29} {28} ifelse 31 30 31 30 31 31 30 31 30 31 ]
1 index 2 2 getinterval cvi 1 sub get
1 index 4 2 getinterval cvi dup 3 1 roll lt
exch 1 lt or { pop pop /bwipp.GS1couponStartDateBadDay (Invalid day of month in start date) false exit } if
dup 0 6 getinterval cvi /couponstart exch def
couponexpire -1 ne couponexpire couponstart lt and {
pop pop /bwipp.GS1couponExpireDateBeforeStartDate (Coupon expires before it starts) false exit
} if
dup length 6 sub 6 exch getinterval
 
} if } if
 
% Optional field 5
dup length 1 ge { dup 0 1 getinterval cvi 5 eq {
1 dup 2 index length exch sub getinterval
 
% Serial Number VLI and value
dup length 1 lt {
pop pop /bwipp.GS1couponTooShortSerialNumberVLI (Coupon too short: Missing Serial Number VLI) false exit
} if
dup 0 1 getinterval cvi 6 add 1 add
2 copy exch length gt {
pop pop pop /bwipp.GS1couponTooShortSerialNumber (Coupon too short: Serial Number truncated) false exit
} if
dup 2 index length exch sub getinterval
 
} if } if
 
% Optional field 6
dup length 1 ge { dup 0 1 getinterval cvi 6 eq {
1 dup 2 index length exch sub getinterval
 
% Retailer GCP/GLN VLI and value
dup length 1 lt {
pop pop /bwipp.GS1couponTooShortRetailerGCPGLNVLI (Coupon too short: Missing Retailer GCP/GLN VLI) false exit
} if
dup 0 1 getinterval cvi dup dup 1 lt exch 7 gt or {
pop pop /bwipp.GS1couponBadRetailerGCPGLNVLI (Coupon Retailer GCP/GLN length indicator must be 1-7) false exit
} if
6 add 1 add
2 copy exch length gt {
pop pop pop /bwipp.GS1couponTooShortRetailerGCPGLN (Coupon too short: Retailer GCP/GLN truncated) false exit
} if
dup 2 index length exch sub getinterval
 
} if } if
 
% Optional field 9
dup length 1 ge { dup 0 1 getinterval cvi 9 eq {
1 dup 2 index length exch sub getinterval
 
% Save Value Code
dup length 1 lt {
pop pop /bwipp.GS1couponTooShortSaveValueCode (Coupon too short: Missing Save Value Code) false exit
} if
dup 0 1 getinterval cvi dup 6 gt exch dup 3 eq exch 4 eq or or {
pop pop /bwipp.GS1couponBadSaveValueCode (Coupon Save Value Code must be 0,1,2,5 or 6) false exit
} if
dup length 1 sub 1 exch getinterval
 
% Save Value Applies to Item
dup length 1 lt {
pop pop /bwipp.GS1couponTooShortSaveValueAppliesToItem (Coupon too short: Missing Save Value Applies to Item) false exit
} if
dup 0 1 getinterval cvi 2 gt {
pop pop /bwipp.GS1couponBadSaveValueAppliesToItem (Coupon Save Value Applies to Item must be 0-2) false exit
} if
dup length 1 sub 1 exch getinterval
 
% Store Coupon Flag
dup length 1 lt {
pop pop /bwipp.GS1couponTooShortStoreCouponFlag (Coupon too short: Missing Store Coupon Flag) false exit
} if
dup length 1 sub 1 exch getinterval
 
% Don't Multiply Flag
dup length 1 lt {
pop pop /bwipp.GS1couponTooShortDontMultiplyFlag (Coupon too short: Missing Don't Multiply Flag) false exit
} if
dup 0 1 getinterval cvi 1 gt {
pop pop /bwipp.GS1couponBadDontMultiplyFlag (Don't Multiply Flag must be 0 or 1) false exit
} if
dup length 1 sub 1 exch getinterval
 
} if } if
 
dup length 0 ne {
pop pop /bwipp.GS1couponUnrecognisedOptionalField (Coupon fields must be 1,2,3,4,5,6 or 9, increasing order) false exit
} if
pop
} def
 
/lintcouponposoffer {
dup true exch {
dup 48 lt exch 57 gt or { pop false exit } if
} forall
not { pop pop /bwipp.GS1couponNotNumeric (Coupon not numeric) false exit } if
% Format Code
dup length 1 lt {
pop pop /bwipp.GS1couponTooShortFormatCode (Coupon too short: Missing Format Code) false exit
} if
dup 0 1 getinterval dup (0) ne exch (1) ne and {
pop pop /bwipp.GS1couponBadFormatCode (Coupon format must be 0 or 1) false exit
} if
dup length 1 sub 1 exch getinterval
% Funder ID VLI and Funder ID
dup length 1 lt {
pop pop /bwipp.GS1couponTooShortFunderVLI (Coupon too short: Missing Funder VLI) false exit
} if
dup 0 1 getinterval cvi dup 6 gt {
pop pop pop /bwipp.GS1couponBadFunderVLI (Coupon Funder length indicator must be 0-6) false exit
} if
6 add 1 add
2 copy exch length gt {
pop pop pop /bwipp.GS1couponTooShortFunder (Coupon too short: Truncated Funder ID) false exit
} if
dup 2 index length exch sub getinterval
% Offer Code
dup length 6 lt {
pop pop /bwipp.GS1couponTooShortOfferCode (Coupon too short: Truncated Offer Code) false exit
} if
dup length 6 sub 6 exch getinterval
% Serial Number VLI and Serial Number
dup length 1 lt {
pop pop /bwipp.GS1couponTooShortSnVLI (Coupon too short: Missing SN VLI) false exit
} if
dup 0 1 getinterval cvi
6 add 1 add
2 copy exch length gt {
pop pop pop /bwipp.GS1couponTooShortSn (Coupon too short: Truncated SN) false exit
} if
dup 2 index length exch sub getinterval
dup length 0 ne {
pop pop /bwipp.GS1couponTooLong (Coupon too long) false exit
} if
pop
} def
 
/lintlatlong {
dup length 20 ne {
pop /bwipp.GS1badGeoLength (Invalid length for a geo-location) false exit
} if
dup 0 10 getinterval cvi 1800000000 gt { pop /bwipp.GS1badLatitude (Invalid value for latitude) false exit } if
dup 10 10 getinterval cvi 3600000000 gt { pop /bwipp.GS1badLongitude (Invalid value for longitude) false exit } if
pop
} def
 
dontlint not {
 
% Validate AI contents
true
0 1 vals length 1 sub {
dup ais exch get /ai exch def
vals exch get /val exch def
gs1syntax ai known {
gs1syntax ai get /parts get
% Overall length checks, e.g. to report "too long", not "checksum failure"
dup 0 exch {dup /opt get {pop 0} {/min get} ifelse add} forall val length gt {
pop /bwipp.GS1valueTooShort (Too short) false exit
} if
dup 0 exch {/max get add} forall val length lt {
pop /bwipp.GS1valueTooLong (Too long) false exit
} if
{ % Checks for each component of the AI
/props exch def
props /max get val length 2 copy gt {exch} if pop
val exch 0 exch getinterval /eval exch def
/val val eval length dup val length exch sub getinterval def
eval length 0 eq {
props /opt get not {
pop /bwipp.GS1valueTooShort (Too short) false exit
} if
} {
eval length props /min get lt {
pop /bwipp.GS1valueTooShort (Too short) false exit
} if
<< /N /lintnumeric /X /lintcset82 /Y /lintcset39 >> props /cset get get eval exch load exec
props /linters get { eval exch load exec } forall
} ifelse
} forall
dup not {exit} if
val length 0 ne { % Not all data consumed by components
pop /bwipp.GS1valueTooLong (Too long) false exit
} if
} {
pop /bwipp.GS1unknownAI (Unrecognised AI) false exit
} ifelse
} for
not {
dup length ai length add 5 add string
dup 0 (AI ) putinterval
dup 3 ai putinterval
dup 3 ai length add (: ) putinterval
dup 5 ai length add 4 -1 roll putinterval
//raiseerror exec
} if
 
% Search for "patt" matching an AIs, excluding "this" AI
/aiexists {
/this exch def
/patt exch def
1 { % common exit
aivals patt known {true exit} if % Fast path
patt length 4 eq {
patt 3 1 getinterval (n) eq {
/pfxlen patt 2 1 getinterval (n) eq {2} {3} ifelse def
false
ais {
dup dup this ne exch length 4 eq and {
0 pfxlen getinterval patt 0 pfxlen getinterval eq {
pop true
} if
} {
pop
} ifelse
} forall
exit
} if
false exit
} if
false exit
} repeat
} def
 
% Build AI dict and validate repeats
/aivals vals length dict def
0 1 vals length 1 sub {
dup ais exch get /ai exch def
vals exch get /val exch def
aivals ai known {
aivals ai get val ne {
ai length 40 add string
dup 0 (Repeated AIs \() putinterval
dup 14 ai putinterval
dup 14 ai length add (\) must have the same value) putinterval
/bwipp.GS1repeatedDifferingAIs exch //raiseerror exec
} if
} {
aivals ai val put
} ifelse
} for
 
% Validate ex and req pairings
0 1 vals length 1 sub {
ais exch get /ai exch def
gs1syntax ai get /ex 2 copy known {
get {
/patt exch def
patt ai aiexists {
ai length patt length add 36 add string
dup 0 (AIs \() putinterval
dup 5 ai putinterval
dup 5 ai length add (\) and \() putinterval
dup 12 ai length add patt putinterval
dup 12 ai length add patt length add (\) are mutually exclusive) putinterval
/bwipp.GS1exclusiveAIs exch //raiseerror exec
} if
} forall
} {
pop pop
} ifelse
lintreqs {
gs1syntax ai get /req 2 copy known {
get { % For each req attribute group
false exch { % Any req AI in the group is fine
ai aiexists {pop true} if
} forall
not {
ai length 47 add string
dup 0 (One of more requisite AIs for AI \() putinterval
dup 34 ai putinterval
dup 34 ai length add (\) are missing) putinterval
/bwipp.GS1missingAIs exch //raiseerror exec
} if
} forall
} {
pop pop
} ifelse
} if
} for
 
} if % dontlint
 
ais vals fncs
 
//unloadctx exec
 
end
 
}
[/barcode] {null def} forall
bind def
/gs1lint dup load /uk.co.terryburton.bwipp defineresource pop
/gs1process dup load /uk.co.terryburton.bwipp defineresource pop
end
/setpacking where {pop setpacking} if
%%EndData
%%EndResource
% --END RESOURCE gs1lint--
% --END RESOURCE gs1process--
 
% --BEGIN RENDERER renlinear--
% --REQUIRES preamble raiseerror--
%%BeginResource: uk.co.terryburton.bwipp renlinear 0.0 2021092800 74624 73842
%%BeginData: 239 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp renlinear 0.0 2022072900 75424 74734
%%BeginData: 246 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
begin
/renlinear {
1970,25 → 3295,25
 
% Create bar elements and put them into the bars array
/bars sbs length 1 add 2 idiv array def
/x 0.00 def /maxh 0 def
/pixx 0 def /pixy 0 def
0 1 sbs length 1 add 2 idiv 2 mul 2 sub {
/i exch def
i 2 mod 0 eq { % i is even
/d sbs i get barratio mul barratio sub 1 add def % d=digit*r-r+1
/d sbs i get barratio mul barratio sub 1 add def % d = digit*r-r+1
sbs i get 0 ne {
/h bhs i 2 idiv get 72 mul def % Height from bhs
/c d 2 div x add def % Centre of the bar = x + d/2
/c d 2 div pixx add def % Centre of the bar = pixx + d/2
/y bbs i 2 idiv get 72 mul def % Baseline from bbs
/w d inkspread sub def % bar width = digit - inkspread
bars i 2 idiv [h c y w] put % Add the bar entry
h y add maxh gt {/maxh h y add def} if
h y add pixy gt {/pixy h y add def} if
} {
bars i 2 idiv -1 put % Dummy entry
} ifelse
} {
/d sbs i get spaceratio mul spaceratio sub 1 add def % d=digit*r-r+1
/d sbs i get spaceratio mul spaceratio sub 1 add def % d = digit*r-r+1
} ifelse
/x x d add def % x+=d
/pixx pixx d add def % pixx += d
} for
 
gsave
1997,7 → 3322,7
 
% Force symbol to given width
width 0 ne {
width 72 mul x div 1 scale
width 72 mul pixx div 1 scale
} if
 
% Set RGB or CMYK color depending on length of given hex string
2014,10 → 3339,10
% Display the border and background
newpath
borderleft neg borderbottom neg moveto
x borderleft add borderright add 0 rlineto
0 maxh borderbottom add bordertop add rlineto
x borderleft add borderright add neg 0 rlineto
0 maxh borderbottom add bordertop add neg rlineto
pixx borderleft add borderright add 0 rlineto
0 pixy borderbottom add bordertop add rlineto
pixx borderleft add borderright add neg 0 rlineto
0 pixy borderbottom add bordertop add neg rlineto
closepath
backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if
showborder {
2029,15 → 3354,22
 
% Display the bars for elements in the bars array
gsave
0 setlinecap
barcolor (unset) ne { barcolor setanycolor } if
newpath
bars {
dup -1 ne {
aload pop newpath setlinewidth moveto 0 exch rlineto stroke
aload pop % h x y w
2 index 1 index 2 div sub 2 index moveto
0 4 index rlineto
dup 0 rlineto
0 4 index neg rlineto
closepath
pop pop pop pop
} {
pop
} ifelse
} forall
fill
grestore
 
% Display the text for elements in the text array
2084,18 → 3416,18
/textascent exch def
/textwidth tstr stringwidth pop tstr length 1 sub textgaps mul add def
 
/textxpos textxoffset x textwidth sub 2 div add def
/textxpos textxoffset pixx textwidth sub 2 div add def
textxalign (left) eq { /textxpos textxoffset def } if
textxalign (right) eq { /textxpos x textxoffset sub textwidth sub def } if
textxalign (right) eq { /textxpos pixx textxoffset sub textwidth sub def } if
textxalign (offleft) eq { /textxpos textwidth textxoffset add neg def } if
textxalign (offright) eq { /textxpos x textxoffset add def } if
textxalign (justify) eq textwidth x lt and {
textxalign (offright) eq { /textxpos pixx textxoffset add def } if
textxalign (justify) eq textwidth pixx lt and {
/textxpos 0 def
/textgaps x textwidth sub tstr length 1 sub div def
/textgaps pixx textwidth sub tstr length 1 sub div def
} if
/textypos textyoffset textascent add 1 add neg def
textyalign (above) eq { /textypos textyoffset maxh add 1 add def } if
textyalign (center) eq { /textypos textyoffset maxh textascent sub 2 div add def } if
textyalign (above) eq { /textypos textyoffset pixy add 1 add def } if
textyalign (center) eq { /textypos textyoffset pixy textascent sub 2 div add def } if
textxpos textypos moveto textgaps 0 tstr ashow
} ifelse
} if
2112,7 → 3444,7
} if
guardrightpos 0 ne {
newpath
guardrightpos x add guardwidth sub guardrightypos guardheight 2 div add moveto
guardrightpos pixx add guardwidth sub guardrightypos guardheight 2 div add moveto
guardwidth guardheight -2 div rlineto
guardwidth neg guardheight -2 div rlineto
stroke
2135,10 → 3467,10
 
% --BEGIN RENDERER renmatrix--
% --REQUIRES preamble raiseerror--
%%BeginResource: uk.co.terryburton.bwipp renmatrix 0.0 2021092800 90671 89573
%%BeginResource: uk.co.terryburton.bwipp renmatrix 0.0 2022072900 90555 89769
%%BeginData: 306 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
begin
/renmatrix {
2417,14 → 3749,14
/textascent exch def
/textwidth tstr stringwidth pop tstr length 1 sub textgaps mul add def
 
/textxpos textxoffset x textwidth sub 2 div add def
/textxpos textxoffset pixx textwidth sub 2 div add def
textxalign (left) eq { /textxpos textxoffset def } if
textxalign (right) eq { /textxpos x textxoffset sub textwidth sub def } if
textxalign (right) eq { /textxpos pixx textxoffset sub textwidth sub def } if
textxalign (offleft) eq { /textxpos textwidth textxoffset add neg def } if
textxalign (offright) eq { /textxpos x textxoffset add def } if
textxalign (justify) eq textwidth x lt and {
textxalign (offright) eq { /textxpos pixx textxoffset add def } if
textxalign (justify) eq textwidth pixx lt and {
/textxpos 0 def
/textgaps x textwidth sub tstr length 1 sub div def
/textgaps pixx textwidth sub tstr length 1 sub div def
} if
/textypos textyoffset textascent add 1 add neg def
textyalign (above) eq { /textypos textyoffset pixy add 1 add def } if
2449,10 → 3781,10
 
% --BEGIN RENDERER renmaximatrix--
% --REQUIRES preamble raiseerror--
%%BeginResource: uk.co.terryburton.bwipp renmaximatrix 0.0 2021092800 50254 49916
%%BeginResource: uk.co.terryburton.bwipp renmaximatrix 0.0 2022072900 50138 49904
%%BeginData: 81 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
begin
/renmaximatrix {
2537,15 → 3869,17
% --END RENDERER renmaximatrix--
 
% --BEGIN ENCODER ean5--
% --REQUIRES preamble raiseerror renlinear--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear--
% --DESC: EAN-5 (5 digit addon)
% --EXAM: 90200
% --EXOP: includetext guardwhitespace
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp ean5 0.0 2021092800 58142 57964
%%BeginData: 137 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp ean5 0.0 2022072900 67684 63946
%%BeginData: 147 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
begin
2556,6 → 3890,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable text
/textfont /Helvetica def
2585,6 → 3920,8
/textyoffset textyoffset cvr def
} ifelse
 
/ean5 //loadctx exec
 
% Validate input
barcode length 5 ne {
/bwipp.ean5badLength (EAN-5 add-on must be 5 digits) //raiseerror exec
2595,6 → 3932,7
} if
} forall
 
{
% Create an array containing the character mappings
/encs
[ (3211) (2221) (2122) (1411) (1132)
2610,6 → 3948,8
[ (11000) (10100) (10010) (10001) (01100)
(00110) (00011) (01010) (01001) (00101)
] def
} ctxdef
 
/checksum 0 def
0 1 4 {
/i exch def
2673,6 → 4013,8
 
dontdraw not //renlinear if
 
//unloadctx exec
 
end
 
}
2686,15 → 4028,17
% --END ENCODER ean5--
 
% --BEGIN ENCODER ean2--
% --REQUIRES preamble raiseerror renlinear--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear--
% --DESC: EAN-2 (2 digit addon)
% --EXAM: 05
% --EXOP: includetext guardwhitespace
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp ean2 0.0 2021092800 56699 56466
%%BeginData: 122 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp ean2 0.0 2022072900 66331 62624
%%BeginData: 133 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
begin
2705,6 → 4049,7
/options exch def % We are given an options string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable text
/textfont /Helvetica def
2734,6 → 4079,8
/textyoffset textyoffset cvr def
} ifelse
 
/ean2 //loadctx exec
 
% Validate input
barcode length 2 ne {
/bwipp.ean2badLength (EAN-2 add-on must be 2 digits) //raiseerror exec
2744,6 → 4091,7
} if
} forall
 
{
% Create an array containing the character mappings
/encs
[ (3211) (2221) (2122) (1411) (1132)
2755,8 → 4103,11
/barchars (0123456789) def
 
% Determine the mirror map based on mod 4 checksum
/mirrormap [(00) (01) (10) (11)] barcode 0 2 getinterval cvi 4 mod get def
/mirrormaps [(00) (01) (10) (11)] def
} ctxdef
 
/mirrormap mirrormaps barcode 0 2 getinterval cvi 4 mod get def
 
/sbs 13 string def
/txt 2 array def
 
2807,6 → 4158,8
 
dontdraw not //renlinear if
 
//unloadctx exec
 
end
 
}
2820,15 → 4173,17
% --END ENCODER ean2--
 
% --BEGIN ENCODER ean13--
% --REQUIRES preamble raiseerror renlinear ean5 ean2--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear ean5 ean2--
% --DESC: EAN-13
% --EXAM: 2112345678900
% --EXOP: includetext guardwhitespace
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp ean13 0.0 2021092800 77528 80639
%%BeginData: 217 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp ean13 0.0 2022072900 87046 86773
%%BeginData: 226 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /ean2 dup /uk.co.terryburton.bwipp findresource put
2841,6 → 4196,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable text
/textfont /Helvetica def
2876,6 → 4232,8
addontextxoffset (unset) ne {/addontextxoffset addontextxoffset cvr def} if
addontextyoffset (unset) ne {/addontextyoffset addontextyoffset cvr def} if
 
/ean13 //loadctx exec
 
% Split off the addon
barcode ( ) search {
/barcode exch def
2921,6 → 4279,7
pad 12 checksum 48 add put % Put ascii for checksum at end of pad
/barcode pad def
 
{
% Create an array containing the character mappings
/encs
[ (3211) (2221) (2122) (1411) (1132)
2936,6 → 4295,7
[ (000000) (001011) (001101) (001110) (010011)
(011001) (011100) (010101) (010110) (011010)
] def
} ctxdef
 
/sbs 59 string def
/txt 13 array def
3036,6 → 4396,8
 
dontdraw not //renlinear if
 
//unloadctx exec
 
end
 
}
3049,15 → 4411,17
% --END ENCODER ean13--
 
% --BEGIN ENCODER ean8--
% --REQUIRES preamble raiseerror renlinear ean5 ean2--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear ean5 ean2--
% --DESC: EAN-8
% --EXAM: 02345673
% --EXOP: includetext guardwhitespace
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp ean8 0.0 2021092800 74726 77866
%%BeginData: 198 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp ean8 0.0 2022072900 84284 83888
%%BeginData: 207 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /ean2 dup /uk.co.terryburton.bwipp findresource put
3070,6 → 4434,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable text
/textfont /Helvetica def
3105,6 → 4470,8
addontextxoffset (unset) ne {/addontextxoffset addontextxoffset cvr def} if
addontextyoffset (unset) ne {/addontextyoffset addontextyoffset cvr def} if
 
/ean8 //loadctx exec
 
% Split off the addon
barcode ( ) search {
/barcode exch def
3151,6 → 4518,7
/barcode pad def
 
% Create an array containing the character mappings
{
/encs
[ (3211) (2221) (2122) (1411) (1132)
(1231) (1114) (1312) (1213) (3112)
3159,6 → 4527,7
 
% Create a string of the available characters
/barchars (0123456789) def
} ctxdef
 
/sbs 43 string def
/txt 8 array def
3246,6 → 4615,8
 
dontdraw not //renlinear if
 
//unloadctx exec
 
end
 
}
3259,15 → 4630,17
% --END ENCODER ean8--
 
% --BEGIN ENCODER upca--
% --REQUIRES preamble raiseerror renlinear ean5 ean2--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear ean5 ean2--
% --DESC: UPC-A
% --EXAM: 416000336108
% --EXOP: includetext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp upca 0.0 2021092800 82465 85414
%%BeginData: 250 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp upca 0.0 2022072900 92023 91540
%%BeginData: 259 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /ean2 dup /uk.co.terryburton.bwipp findresource put
3280,6 → 4653,7
/options exch def
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable text
/textfont /Helvetica def
3315,6 → 4689,8
addontextxoffset (unset) ne {/addontextxoffset addontextxoffset cvr def} if
addontextyoffset (unset) ne {/addontextyoffset addontextyoffset cvr def} if
 
/upca //loadctx exec
 
% Split off the addon
barcode ( ) search {
/barcode exch def
3406,6 → 4782,7
/barcode pad def
 
% Create an array containing the character mappings
{
/encs
[ (3211) (2221) (2122) (1411) (1132)
(1231) (1114) (1312) (1213) (3112)
3414,6 → 4791,7
 
% Create a string of the available characters
/barchars (0123456789) def
} ctxdef
 
/sbs 59 string def
/txt 12 array def
3508,6 → 4886,8
 
dontdraw not //renlinear if
 
//unloadctx exec
 
end
 
}
3521,15 → 4901,17
% --END ENCODER upca--
 
% --BEGIN ENCODER upce--
% --REQUIRES preamble raiseerror renlinear ean5 ean2--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear ean5 ean2--
% --DESC: UPC-E
% --EXAM: 00123457
% --EXOP: includetext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp upce 0.0 2021092800 87070 90062
%%BeginData: 289 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp upce 0.0 2022072900 96548 96108
%%BeginData: 298 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /ean2 dup /uk.co.terryburton.bwipp findresource put
3542,6 → 4924,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable text
/textfont /Helvetica def
3577,6 → 4960,8
addontextxoffset (unset) ne {/addontextxoffset addontextxoffset cvr def} if
addontextyoffset (unset) ne {/addontextyoffset addontextyoffset cvr def} if
 
/upce //loadctx exec
 
% Split off the addon
barcode ( ) search {
/barcode exch def
3646,6 → 5031,7
/bwipp.upcEbadNumberSystem (UPC-E must have number system 0 or 1) //raiseerror exec
} if
 
{
% Create an array containing the character mappings
/encs
[ (3211) (2221) (2122) (1411) (1132)
3660,6 → 5046,7
[ (000111) (001011) (001101) (001110) (010011)
(011001) (011100) (010101) (010110) (011010)
] def
} ctxdef
 
% Derive the equivalent UPC-A for its checksum
1 { % Common exit
3809,6 → 5196,8
 
dontdraw not //renlinear if
 
//unloadctx exec
 
end
 
}
3822,15 → 5211,15
% --END ENCODER upce--
 
% --BEGIN ENCODER isbn--
% --REQUIRES preamble raiseerror renlinear ean5 ean2 ean13--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear ean5 ean2 ean13--
% --DESC: ISBN
% --EXAM: 978-1-56581-231-4 90000
% --EXOP: includetext guardwhitespace
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp isbn 0.0 2021092800 89478 88857
%%BeginData: 254 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp isbn 0.0 2022072900 95102 94623
%%BeginData: 255 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /ean13 dup /uk.co.terryburton.bwipp findresource put
3842,6 → 5231,7
/options exch def % We are given an options string
/barcode exch def % We are given the isbn text with dashes
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable ISBN text
/isbntextfont /Courier def
4088,15 → 5478,15
% --END ENCODER isbn--
 
% --BEGIN ENCODER ismn--
% --REQUIRES preamble raiseerror renlinear ean5 ean2 ean13--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear ean5 ean2 ean13--
% --DESC: ISMN
% --EXAM: 979-0-2605-3211-3
% --EXOP: includetext guardwhitespace
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp ismn 0.0 2021092800 85922 85418
%%BeginData: 233 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp ismn 0.0 2022072900 91674 91184
%%BeginData: 234 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /ean13 dup /uk.co.terryburton.bwipp findresource put
4108,6 → 5498,7
/options exch def % We are given an options string
/barcode exch def % We are given the ismn text with dashes
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable ISMN text
/ismntextfont /Courier def
4333,15 → 5724,15
% --END ENCODER ismn--
 
% --BEGIN ENCODER issn--
% --REQUIRES preamble raiseerror renlinear ean2 ean5 ean13--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear ean2 ean5 ean13--
% --DESC: ISSN
% --EXAM: 0311-175X 00 17
% --EXOP: includetext guardwhitespace
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp issn 0.0 2021092800 77354 76846
%%BeginData: 178 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp issn 0.0 2022072900 83234 82740
%%BeginData: 179 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /ean13 dup /uk.co.terryburton.bwipp findresource put
4353,6 → 5744,7
/options exch def % We are given an options string
/issntxt exch def % We are given the issn text with dashes
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable ISSN text
/issntextfont /Courier def
4523,15 → 5915,15
% --END ENCODER issn--
 
% --BEGIN ENCODER mands--
% --REQUIRES preamble raiseerror renlinear ean2 ean5 ean8--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear ean2 ean5 ean8--
% --DESC: Marks & Spencer
% --EXAM: 0642118
% --EXOP: includetext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp mands 0.0 2021092800 66033 65940
%%BeginData: 82 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp mands 0.0 2022072900 71641 71586
%%BeginData: 83 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /ean8 dup /uk.co.terryburton.bwipp findresource put
4543,6 → 5935,7
/options exch def
/barcode exch def
 
/ctx null def
/dontdraw false def
/includetext false def
 
4617,15 → 6010,17
% --END ENCODER mands--
 
% --BEGIN ENCODER code128--
% --REQUIRES preamble raiseerror parseinput renlinear--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renlinear--
% --DESC: Code 128
% --EXAM: Count01234567!
% --EXOP: includetext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp code128 0.0 2021092800 120207 119811
%%BeginData: 425 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp code128 0.0 2022072900 126029 129057
%%BeginData: 438 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
4637,6 → 6032,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable text
/textfont /Courier def
4666,12 → 6062,16
/textyoffset textyoffset cvr def
/height height cvr def
 
/code128 //loadctx exec
 
% Special function characters
{
/sta -1 def /stb -2 def /stc -3 def
/swa -4 def /swb -5 def /swc -6 def
/fn1 -7 def /fn2 -8 def /fn3 -9 def
/fn4 -10 def /sft -11 def /stp -12 def
/lka -13 def /lkc -14 def % CC-A/B and CC-C linkage
} ctxdef
 
% Parse the input
/fncvals <<
4689,6 → 6089,7
/msglen msg length def
 
% Character maps for each state
{
/charmaps [
% A B C A B C A B C
[ 32 32 (00) ] [ (!) (!) (01) ] [ (") (") (02) ] % 0-2
4743,6 → 6144,7
/seta charvals 0 get def
/setb charvals 1 get def
/setc charvals 2 get def
} ctxdef
 
% Include pseudo characters for GS1-128 Composite linkage identifiers
seta lka seta swb get put seta lkc seta swc get put
4825,17 → 6227,17
/p p 1 add def
} loop
n s
} bind def
} def
 
% Encoding for each alphabet
/enca {
seta exch get cws exch j exch put
/j j 1 add def
} bind def
} def
/encb {
setb exch get cws exch j exch put
/j j 1 add def
} bind def
} def
/encc {
dup type /arraytype ne {
setc exch get
4844,11 → 6246,11
} ifelse
cws exch j exch put
/j j 1 add def
} bind def
} def
 
% Character exclusively in either alphabet A or B
/anotb {dup seta exch known exch setb exch known not and} bind def
/bnota {dup setb exch known exch seta exch known not and} bind def
/anotb {dup seta exch known exch setb exch known not and} def
/bnota {dup setb exch known exch seta exch known not and} def
 
% Pre-compute relative position of next anotb and next bnota characters
/nextanotb [ msg length {0} repeat 9999 ] def
4868,8 → 6270,8
} for
 
% Does a-only come before b-only after given position and vice versa
/abeforeb {dup nextanotb exch get exch nextbnota exch get lt} bind def
/bbeforea {dup nextbnota exch get exch nextanotb exch get lt} bind def
/abeforeb {dup nextanotb exch get exch nextbnota exch get lt} def
/bbeforea {dup nextbnota exch get exch nextanotb exch get lt} def
 
/cws barcode length 2 mul 3 add array def
 
5002,6 → 6404,7
cws j 1 add seta stp get put
 
% Create an array containing the character mappings
{
/encs
[ (212222) (222122) (222221) (121223) (121322) (131222) (122213)
(122312) (132212) (221213) (221312) (231212) (112232) (122132)
5020,6 → 6423,7
(411311) (113141) (114131) (311141) (411131) (211412) (211214)
(211232) (2331112)
] def
} ctxdef
 
% Derive space bar succession
/sbs cws length 6 mul 1 add string def
5041,6 → 6445,8
 
dontdraw not //renlinear if
 
//unloadctx exec
 
end
 
}
5054,18 → 6460,18
% --END ENCODER code128--
 
% --BEGIN ENCODER gs1-128--
% --REQUIRES preamble raiseerror parseinput gs1lint renlinear code128--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renlinear code128--
% --DESC: GS1-128
% --EXAM: (01)95012345678903(3103)000123
% --EXOP: includetext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp gs1-128 0.0 2021092800 81345 84637
%%BeginData: 156 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp gs1-128 0.0 2022072900 80068 76461
%%BeginData: 114 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /gs1lint dup /uk.co.terryburton.bwipp findresource put
dup /gs1process dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /code128 dup /uk.co.terryburton.bwipp findresource put
begin
5076,6 → 6482,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable text
/textfont /Courier def
5087,6 → 6494,7
/linkagec false def
/parse false def
/dontlint false def
/lintreqs false def
 
% Parse the input options
options type /stringtype eq {
5107,55 → 6515,11
 
/text barcode def
 
% Expand ordinals of the form ^NNN to ASCII
/expand {
/fncvals <<
/parse parse
/parseonly true
/parsefnc false
>> def
fncvals //parseinput exec
} bind def
barcode /ai //gs1process exec
/fncs exch def
/vals exch def
/ais exch def
 
% Parse out AIs
/ais [] def
/vals [] def
barcode dup length 1 sub 1 exch getinterval
{ % loop
dup () eq {exit} if
(\)) search pop
exch pop
exch (\() search {
exch pop exch 3 1 roll
} {
() 3 1 roll
} ifelse
[ ais aload pop counttomark 2 add index ] /ais exch def
[ vals aload pop counttomark 1 add index expand ] /vals exch def
pop pop
} loop
pop
 
dontlint not { ais vals //gs1lint exec pop } if
 
% Pre-defined fixed length data field AIs
% any AI whose prefix is not included in this table must be
% terminated with "FNC1", even if it's fixed length
/aifixed 23 dict def
[
0 1 4 {} for
] {
(00) 2 string copy dup dup 1 5 -1 roll 48 add put aifixed 3 1 roll put
} forall
[
11 1 20 {} for
23
31 1 36 {} for
41
] {
10 2 string cvrs dup aifixed 3 1 roll put
} forall
 
% Create the code128 data
/fnc1 -1 def
/c128 [ fnc1 ] def
5168,7 → 6532,7
dup c128 length ai [ exch {} forall ] putinterval
dup c128 length ai length add val [ exch {} forall ] putinterval
/c128 exch def
i ais length 1 sub ne aifixed ai 0 2 getinterval known not and { % Append FNC1
i ais length 1 sub ne fncs i get and { % Append FNC1
c128 length 1 add array
dup 0 c128 putinterval
dup c128 length fnc1 put
5222,15 → 6586,15
% --END ENCODER gs1-128--
 
% --BEGIN ENCODER ean14--
% --REQUIRES preamble raiseerror parseinput renlinear code128--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renlinear code128--
% --DESC: GS1-14
% --EXAM: (01) 0 46 01234 56789 3
% --EXOP: includetext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp ean14 0.0 2021092800 63440 66700
%%BeginData: 107 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp ean14 0.0 2022072900 72622 72322
%%BeginData: 108 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /code128 dup /uk.co.terryburton.bwipp findresource put
5242,6 → 6606,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable text
/textfont /Courier def
5341,15 → 6706,15
% --END ENCODER ean14--
 
% --BEGIN ENCODER sscc18--
% --REQUIRES preamble raiseerror parseinput renlinear code128--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renlinear code128--
% --DESC: SSCC-18
% --EXAM: (00) 0 0614141 123456789 0
% --EXOP: includetext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp sscc18 0.0 2021092800 63324 66579
%%BeginData: 107 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp sscc18 0.0 2022072900 72634 72329
%%BeginData: 108 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /code128 dup /uk.co.terryburton.bwipp findresource put
5361,6 → 6726,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable text
/textfont /Courier def
5460,15 → 6826,17
% --END ENCODER sscc18--
 
% --BEGIN ENCODER code39--
% --REQUIRES preamble raiseerror renlinear--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear--
% --DESC: Code 39
% --EXAM: THIS IS CODE 39
% --EXOP: includetext includecheck includecheckintext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp code39 0.0 2021092800 62946 62513
%%BeginData: 143 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp code39 0.0 2022072900 72544 68679
%%BeginData: 154 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
begin
5479,6 → 6847,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includecheck false def
/validatecheck false def
5506,10 → 6875,14
/textyoffset textyoffset cvr def
/height height cvr def
 
/code39 //loadctx exec
 
% Create a string of the available characters
{
/barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def
/charvals 43 dict def
0 1 42 {charvals exch dup barchars exch 1 getinterval exch put} for
} ctxdef
 
% Validate the input
0 1 barcode length 1 sub {
5535,6 → 6908,7
} if
 
% Create an array containing the character mappings
{
/encs
[ (1113313111) (3113111131) (1133111131) (3133111111) (1113311131)
(3113311111) (1133311111) (1113113131) (3113113111) (1133113111)
5546,6 → 6920,7
(1331311111) (1311113131) (3311113111) (1331113111) (1313131111)
(1313111311) (1311131311) (1113131311) (1311313111)
] def
} ctxdef
 
/sbs barlen includecheck {3} {2} ifelse add 10 mul string def
/txt barlen includecheck {3} {2} ifelse add array def
5602,6 → 6977,8
 
dontdraw not //renlinear if
 
//unloadctx exec
 
end
 
}
5615,15 → 6992,17
% --END ENCODER code39--
 
% --BEGIN ENCODER code39ext--
% --REQUIRES preamble raiseerror parseinput renlinear code39--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renlinear code39--
% --DESC: Code 39 Extended
% --EXAM: Code39 Ext!
% --EXOP: includetext includecheck includecheckintext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp code39ext 0.0 2021092800 61643 64843
%%BeginData: 100 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp code39ext 0.0 2022072900 71121 70993
%%BeginData: 109 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
5636,6 → 7015,7
/options exch def % We are given an options string
/barcode exch def % We are given the code39extended text
 
/ctx null def
/dontdraw false def
/includetext false def
/parse false def
5651,6 → 7031,8
} if
options {def} forall
 
/code39ext //loadctx exec
 
% Parse ordinals of the form ^NNN to ASCII
/fncvals <<
/parse parse
5669,6 → 7051,7
} forall
 
% Extended alphabet to non-extended alphabet
{
/extencs
[ (%U) ($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)
5679,6 → 7062,7
(%W) (+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) (%P) (%Q) (%R) (%S) (%T)
] def
} ctxdef
 
/newcode barlen 2 mul string def
/newtext barlen 2 mul string def
5714,6 → 7098,8
 
dontdraw not //renlinear if
 
//unloadctx exec
 
end
 
}
5727,15 → 7113,15
% --END ENCODER code39ext--
 
% --BEGIN ENCODER code32--
% --REQUIRES preamble raiseerror renlinear code39--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear code39--
% --DESC: Italian Pharmacode
% --EXAM: 01234567
% --EXOP: includetext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp code32 0.0 2021092800 58521 58072
%%BeginData: 101 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp code32 0.0 2022072900 63967 67254
%%BeginData: 102 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /code39 dup /uk.co.terryburton.bwipp findresource put
5747,6 → 7133,7
/options exch def % We are given an options string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable code32 text
/textfont /Courier def
5840,15 → 7227,15
% --END ENCODER code32--
 
% --BEGIN ENCODER pzn--
% --REQUIRES preamble raiseerror renlinear code39--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear code39--
% --DESC: Pharmazentralnummer (PZN)
% --EXAM: 123456
% --EXOP: includetext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp pzn 0.0 2021092800 58384 58092
%%BeginData: 102 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp pzn 0.0 2022072900 64062 67274
%%BeginData: 103 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /code39 dup /uk.co.terryburton.bwipp findresource put
5860,6 → 7247,7
/options exch def % We are given an options string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable code32 text
/textfont /Courier def
5954,15 → 7342,17
% --END ENCODER pzn--
 
% --BEGIN ENCODER code93--
% --REQUIRES preamble raiseerror parseinput renlinear--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renlinear--
% --DESC: Code 93
% --EXAM: THIS IS CODE 93
% --EXOP: includetext includecheck
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp code93 0.0 2021092800 62124 61789
%%BeginData: 134 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp code93 0.0 2022072900 68234 71403
%%BeginData: 144 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
5974,6 → 7364,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includecheck false def % Enable/disable checkdigit
/includetext false def % Enable/disable text
6000,6 → 7391,9
/textyoffset textyoffset cvr def
/height height cvr def
 
/code93 //loadctx exec
 
{
/encs
[ (131112) (111213) (111312) (111411) (121113)
(121212) (121311) (111114) (131211) (141111)
6016,8 → 7410,10
% Create a string of the available characters
/barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def
 
/sft1 -1 def /sft2 -2 def /sft3 -3 def /sft4 -4 def
} ctxdef
 
% Special function characters
/sft1 -1 def /sft2 -2 def /sft3 -3 def /sft4 -4 def
/fncvals <<
/parse parse
/parsefnc parsefnc
6087,6 → 7483,8
 
dontdraw not //renlinear if
 
//unloadctx exec
 
end
 
}
6100,15 → 7498,17
% --END ENCODER code93--
 
% --BEGIN ENCODER code93ext--
% --REQUIRES preamble raiseerror parseinput renlinear code93--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renlinear code93--
% --DESC: Code 93 Extended
% --EXAM: Code93 Ext!
% --EXOP: includetext includecheck
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp code93ext 0.0 2021092800 62105 65416
%%BeginData: 104 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp code93ext 0.0 2022072900 71471 71374
%%BeginData: 113 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
6121,6 → 7521,7
/options exch def % We are given an options string
/barcode exch def % We are given the code39extended text
 
/ctx null def
/dontdraw false def
/includetext false def
/parse false def
6136,6 → 7537,8
} if
options {def} forall
 
/code93ext //loadctx exec
 
% Parse ordinals of the form ^NNN to ASCII
/fncvals <<
/parse parse
6147,6 → 7550,7
options (parse) undef
 
% Extended alphabet to non-extended alphabet
{
/extencs
[ (^SFT%U) (^SFT$A) (^SFT$B) (^SFT$C) (^SFT$D) (^SFT$E) (^SFT$F) (^SFT$G)
(^SFT$H) (^SFT$I) (^SFT$J) (^SFT$K) (^SFT$L) (^SFT$M) (^SFT$N) (^SFT$O)
6165,6 → 7569,7
(^SFT+P) (^SFT+Q) (^SFT+R) (^SFT+S) (^SFT+T) (^SFT+U) (^SFT+V) (^SFT+W)
(^SFT+X) (^SFT+Y) (^SFT+Z) (^SFT%P) (^SFT%Q) (^SFT%R) (^SFT%S) (^SFT%T)
] def
} ctxdef
 
/newcode barlen 6 mul string def
/newtext barlen 6 mul string def
6203,6 → 7608,8
 
dontdraw not //renlinear if
 
//unloadctx exec
 
end
 
}
6216,15 → 7623,17
% --END ENCODER code93ext--
 
% --BEGIN ENCODER interleaved2of5--
% --REQUIRES preamble raiseerror renlinear--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear--
% --DESC: Interleaved 2 of 5 (ITF)
% --EXAM: 2401234567
% --EXOP: height=0.5 includecheck includetext includecheckintext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp interleaved2of5 0.0 2021092800 61533 61224
%%BeginData: 152 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp interleaved2of5 0.0 2022072900 70923 67054
%%BeginData: 162 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
begin
6235,6 → 7644,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includecheck false def % Enable/disable checkdigit
/includetext false def % Enable/disable text
6260,6 → 7670,8
/textyoffset textyoffset cvr def
/height height cvr def
 
/interleaved2of5 //loadctx exec
 
% Validate the input
barcode {
dup 48 lt exch 57 gt or {
6300,6 → 7712,7
} if
 
% Create an array containing the character mappings
{
/encs
[ (11221) (21112) (12112) (22111) (11212)
(21211) (12211) (11122) (21121) (12121)
6308,6 → 7721,8
 
% Create a string of the available characters
/barchars (0123456789) def
} ctxdef
 
/sbs barlen 5 mul 8 add string def
/txt barlen array def
 
6367,6 → 7782,8
 
dontdraw not //renlinear if
 
//unloadctx exec
 
end
 
}
6380,15 → 7797,15
% --END ENCODER interleaved2of5--
 
% --BEGIN ENCODER itf14--
% --REQUIRES preamble raiseerror renlinear interleaved2of5--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear interleaved2of5--
% --DESC: ITF-14
% --EXAM: 0 46 01234 56789 3
% --EXOP: includetext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp itf14 0.0 2021092800 60903 60661
%%BeginData: 111 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp itf14 0.0 2022072900 66573 69859
%%BeginData: 112 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /interleaved2of5 dup /uk.co.terryburton.bwipp findresource put
6400,6 → 7817,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includetext false def
/includecheckintext true def
6503,15 → 7921,15
% --END ENCODER itf14--
 
% --BEGIN ENCODER identcode--
% --REQUIRES preamble raiseerror renlinear interleaved2of5--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear interleaved2of5--
% --DESC: Deutsche Post Identcode
% --EXAM: 563102430313
% --EXOP: includetext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp identcode 0.0 2021092800 57310 57220
%%BeginData: 93 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp identcode 0.0 2022072900 62988 66378
%%BeginData: 94 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /interleaved2of5 dup /uk.co.terryburton.bwipp findresource put
6523,6 → 7941,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable text
/textfont /Courier def
6608,15 → 8027,15
% --END ENCODER identcode--
 
% --BEGIN ENCODER leitcode--
% --REQUIRES preamble raiseerror renlinear interleaved2of5--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear interleaved2of5--
% --DESC: Deutsche Post Leitcode
% --EXAM: 21348075016401
% --EXOP: includetext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp leitcode 0.0 2021092800 57302 57216
%%BeginData: 93 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp leitcode 0.0 2022072900 62980 66374
%%BeginData: 94 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /interleaved2of5 dup /uk.co.terryburton.bwipp findresource put
6628,6 → 8047,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable text
/textfont /Courier def
6713,15 → 8133,17
% --END ENCODER leitcode--
 
% --BEGIN ENCODER databaromni--
% --REQUIRES preamble raiseerror renlinear renmatrix--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear renmatrix--
% --DESC: GS1 DataBar Omnidirectional
% --EXAM: (01)24012345678905
% --EXOP:
% --RNDR: renlinear renmatrix
%%BeginResource: uk.co.terryburton.bwipp databaromni 0.0 2021092800 105433 104213
%%BeginData: 425 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp databaromni 0.0 2022072900 115343 110971
%%BeginData: 436 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
20 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
6733,6 → 8155,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/height 33 72 div def
/linkage false def
6754,6 → 8177,8
/height height cvr def
/barxmult barxmult cvi def
 
/databaromni //loadctx exec
 
% Validate the input
barcode 0 4 getinterval (\(01\)) ne {
/bwipp.databaromniBadAI (GS1 DataBar Omnidirectional must begin with (01) application identifier) //raiseerror exec
6877,6 → 8302,7
/d3 right 1597 idiv def
/d4 right 1597 mod def
 
{
/tab164 [
160 0 12 4 8 1 161 1
960 161 10 6 6 3 80 10
6891,6 → 8317,7
1515 1036 9 6 6 3 48 10
1596 1516 11 4 8 1 81 1
] def
} ctxdef
 
/i 0 def {
d1 tab164 i get le {
6984,6 → 8411,7
d4w {} forall
] def
 
{
/checkweights [
1 3 9 27 2 6 18 54
58 72 24 8 29 36 12 4
6996,6 → 8424,7
3 1 9 1 1 2 7 4 1 1 2 5 6 1 1
2 3 8 1 1 1 5 7 1 1 1 3 9 1 1
] def
} ctxdef
 
/checksum 0 def
0 1 31 {
7137,6 → 8566,8
 
} ifelse
 
//unloadctx exec
 
end
 
}
7150,15 → 8581,15
% --END ENCODER databaromni--
 
% --BEGIN ENCODER databarstacked--
% --REQUIRES preamble raiseerror renlinear renmatrix databaromni--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear renmatrix databaromni--
% --DESC: GS1 DataBar Stacked
% --EXAM: (01)24012345678905
% --EXOP:
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp databarstacked 0.0 2021092800 58192 61579
%%BeginData: 75 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp databarstacked 0.0 2022072900 67414 63705
%%BeginData: 76 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
dup /databaromni dup /uk.co.terryburton.bwipp findresource put
7170,6 → 8601,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
 
% Parse the input options
7237,15 → 8669,15
% --END ENCODER databarstacked--
 
% --BEGIN ENCODER databarstackedomni--
% --REQUIRES preamble raiseerror renlinear renmatrix databaromni--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear renmatrix databaromni--
% --DESC: GS1 DataBar Stacked Omnidirectional
% --EXAM: (01)24012345678905
% --EXOP:
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp databarstackedomni 0.0 2021092800 58236 61531
%%BeginData: 75 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp databarstackedomni 0.0 2022072900 67514 63785
%%BeginData: 76 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
dup /databaromni dup /uk.co.terryburton.bwipp findresource put
7257,6 → 8689,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
 
% Parse the input options
7324,15 → 8757,15
% --END ENCODER databarstackedomni--
 
% --BEGIN ENCODER databartruncated--
% --REQUIRES preamble raiseerror renlinear renmatrix databaromni--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear renmatrix databaromni--
% --DESC: GS1 DataBar Truncated
% --EXAM: (01)24012345678905
% --EXOP:
% --RNDR: renlinear renmatrix
%%BeginResource: uk.co.terryburton.bwipp databartruncated 0.0 2021092800 58138 61491
%%BeginData: 75 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp databartruncated 0.0 2022072900 67440 63721
%%BeginData: 76 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /databaromni dup /uk.co.terryburton.bwipp findresource put
7344,6 → 8777,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
 
% Parse the input options
7411,15 → 8845,17
% --END ENCODER databartruncated--
 
% --BEGIN ENCODER databarlimited--
% --REQUIRES preamble raiseerror renlinear--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear--
% --DESC: GS1 DataBar Limited
% --EXAM: (01)15012345678907
% --EXOP:
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp databarlimited 0.0 2021092800 80912 80201
%%BeginData: 278 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp databarlimited 0.0 2022072900 90806 86511
%%BeginData: 291 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
20 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
begin
7430,6 → 8866,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/height 10 72 div def
/linkage false def
7447,6 → 8884,8
 
/height height cvr def
 
/databarlimited //loadctx exec
 
% Validate the input
barcode 0 4 getinterval (\(01\)) ne {
/bwipp.databarlimitedBadAI (GS1 DataBar Limited must begin with (01) application identifier) //raiseerror exec
7481,11 → 8920,13
/barcode exch def
 
% Strip the AI and optional check digit
{
/linkval [ 2 0 1 5 1 3 3 5 3 1 0 9 6 ] def
} ctxdef
/binval [
barcode 4 13 getinterval {48 sub} forall
] def
linkage {
/linkval [ 2 0 1 5 1 3 3 5 3 1 0 9 6 ] def
0 1 binval length 1 sub {
/i exch def
binval i binval i get linkval i get add put
7513,7 → 8954,7
1 index idiv exch 1 add exch
} loop
exch pop exch pop
} bind def
} def
 
/getRSSwidths {
/oe exch def
7552,7 → 8993,7
} for
out el 1 sub nm put
out
} bind def
} def
 
0 1 11 {
/i exch def
7575,6 → 9016,7
} ifelse
} for
 
{
/tab267 [
183063 0 17 9 6 3 6538 28
820063 183064 13 13 5 4 875 728
7584,6 → 9026,7
1996938 1979845 19 7 8 1 17094 1
2013570 1996939 7 19 1 8 1 16632
] def
} ctxdef
 
/i 0 def {
d1 tab267 i get le {
7633,6 → 9076,7
d2w {} forall
] def
 
{
/checkweights [
1 3 9 27 81 65 17 51 64 14 42 37 22 66
20 60 2 6 18 54 73 41 34 13 39 28 84 74
7653,6 → 9097,7
322 323
326 337
] def
} ctxdef
 
/checksum 0 def
0 1 27 {
7688,6 → 9133,8
 
dontdraw not //renlinear if
 
//unloadctx exec
 
end
 
}
7701,18 → 9148,19
% --END ENCODER databarlimited--
 
% --BEGIN ENCODER databarexpanded--
% --REQUIRES preamble raiseerror parseinput gs1lint renlinear renmatrix--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renlinear renmatrix--
% --DESC: GS1 DataBar Expanded
% --EXAM: (01)95012345678903(3103)000123
% --EXOP:
% --RNDR: renlinear renmatrix
%%BeginResource: uk.co.terryburton.bwipp databarexpanded 0.0 2021092800 242723 244991
%%BeginData: 886 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp databarexpanded 0.0 2022072900 246206 244983
%%BeginData: 863 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /gs1lint dup /uk.co.terryburton.bwipp findresource put
dup /gs1process dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
begin
7723,8 → 9171,10
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/parse false def
/dontlint false def
/lintreqs true def
/dontdraw false def
/height 34 72 div def
/format (expanded) def
7747,6 → 9197,8
/segments segments cvi def
/barxmult barxmult cvi def
 
/databarexpanded //loadctx exec
 
segments -1 eq {
/segments format (expandedstacked) eq {4} {22} ifelse def
} {
7755,37 → 9207,11
} if
} ifelse
 
% Expand ordinals of the form ^NNN to ASCII
/expand {
/fncvals <<
/parse parse
/parseonly true
/parsefnc false
>> def
fncvals //parseinput exec
} bind def
barcode /ai //gs1process exec
/fncs exch def
/vals exch def
/ais exch def
 
% Parse out AIs
/ais [] def
/vals [] def
barcode dup length 1 sub 1 exch getinterval
{ % loop
dup () eq {exit} if
(\)) search pop
exch pop
exch (\() search {
exch pop exch 3 1 roll
} {
() 3 1 roll
} ifelse
[ ais aload pop counttomark 2 add index ] /ais exch def
[ vals aload pop counttomark 1 add index expand ] /vals exch def
pop pop
} loop
pop
 
dontlint not { ais vals //gs1lint exec pop } if
 
% Method selection
{ % common exit
 
7883,18 → 9309,18
2 copy 20 10 getinterval exch 6 3 getinterval cvi 2 10 string cvrs dup length 10 exch sub exch putinterval
2 copy 30 10 getinterval exch 9 3 getinterval cvi 2 10 string cvrs dup length 10 exch sub exch putinterval
exch pop
} bind def
} def
 
/conv13to44 {
(00000000000000000000000000000000000000000000) 44 string copy
2 copy 0 4 getinterval exch 0 1 getinterval cvi 2 4 string cvrs dup length 4 exch sub exch putinterval
dup 3 -1 roll 1 12 getinterval conv12to40 4 exch putinterval
} bind def
} def
 
/tobin {
string dup length 1 sub 0 exch 1 exch {1 index exch 48 put} for
dup 3 -1 roll 2 2 index length string cvrs dup length 2 index length exch sub exch putinterval
} bind def
} def
 
/fnc1 -1 def /lnumeric -2 def /lalphanumeric -3 def /liso646 -4 def
 
7909,6 → 9335,7
/gpf [] def
/ais ais 1 ais length 1 sub getinterval def
/vals vals 1 vals length 1 sub getinterval def
/fncs fncs 1 fncs length 1 sub getinterval def
} if
 
method (0100) eq {
7919,6 → 9346,7
/gpf [] def
/ais [] def
/vals [] def
/fncs [] def
} if
 
method (0101) eq {
7934,6 → 9362,7
/gpf [] def
/ais [] def
/vals [] def
/fncs [] def
} if
 
method length 7 eq {
7955,6 → 9384,7
/gpf [] def
/ais [] def
/vals [] def
/fncs [] def
} if
 
method (01100) eq {
7965,6 → 9395,7
/gpf [ vals 1 get {} forall ais length 2 gt { fnc1 } if ] def
/ais ais 2 ais length 2 sub getinterval def
/vals vals 2 vals length 2 sub getinterval def
/fncs fncs 2 fncs length 2 sub getinterval def
} if
 
method (01101) eq {
7976,6 → 9407,7
/gpf [ vals 1 get dup length 3 sub 3 exch getinterval {} forall ais length 2 gt { fnc1 } if ] def
/ais ais 2 ais length 2 sub getinterval def
/vals vals 2 vals length 2 sub getinterval def
/fncs fncs 2 fncs length 2 sub getinterval def
} if
 
% Variable length symbol field
7985,24 → 9417,7
/vlf [] def
} ifelse
 
% Pre-defined fixed length data field AIs
% any AI whose prefix is not included in this table must be
% terminated with "FNC1", even if it's fixed length
/aifixed 23 dict def
[
0 1 4 {} for
] {
(00) 2 string copy dup dup 1 5 -1 roll 48 add put aifixed 3 1 roll put
} forall
[
11 1 20 {} for
23
31 1 36 {} for
41
] {
10 2 string cvrs dup aifixed 3 1 roll put
} forall
 
{
/numeric <<
0 1 119 {
dup (00) 2 string copy dup 3 -1 roll 11 2 string cvrs
8040,6 → 9455,7
lnumeric (000)
lalphanumeric (00100)
>> def
} ctxdef
 
% Append the remaining AI data
0 1 ais length 1 sub {
8051,7 → 9467,7
dup gpf length ai [ exch {} forall ] putinterval
dup gpf length ai length add val [ exch {} forall ] putinterval
/gpf exch def
i ais length 1 sub ne aifixed ai 0 2 getinterval known not and { % Append FNC1
i ais length 1 sub ne fncs i get and { % Append FNC1
gpf length 1 add array
dup 0 gpf putinterval
dup gpf length fnc1 put
8070,7 → 9486,7
pop
} ifelse
exch sub
} bind def
} def
 
/encode {
dup /raw ne {exch get} {pop} ifelse
8078,7 → 9494,7
dup length exch
gpfenc exch j exch putinterval
/j exch j add def
} bind def
} def
 
% Pre-compute alphanumeric and numeric runlengths and position of next ISO646-only characters
/numericruns [ gpf length {0} repeat 0 -1 ] def
8247,7 → 9663,7
1 index idiv exch 1 add exch
} loop
exch pop exch pop
} bind def
} def
 
/getRSSwidths {
/oe exch def
8286,8 → 9702,9
} for
out el 1 sub nm put
out
} bind def
} def
 
{
/tab174 [
347 0 12 5 7 2 87 4
1387 348 10 7 5 4 52 20
8295,6 → 9712,7
3987 2948 6 11 3 6 10 104
4191 3988 4 13 1 8 1 204
] def
} ctxdef
 
/dxw datalen array def
 
8339,6 → 9757,7
 
} for
 
{
/finderwidths [
1 8 4 1 1 1 1 4 8 1
3 6 4 1 1 1 1 4 6 3
8360,6 → 9779,7
[0 1 2 3 4 5 6 9 10 11]
[0 1 2 3 4 7 6 9 8 11 10]
] def
} ctxdef
 
/seq finderseq datalen 2 sub 2 idiv get def
/fxw seq length array def
8368,6 → 9788,7
fxw x finderwidths seq x get 5 mul 5 getinterval put
} for
 
{
/checkweights [
-1 -1 -1 -1 -1 -1 -1 -1 % A1L
77 96 32 81 27 9 3 1 % A1R
8394,6 → 9815,7
55 165 73 8 24 72 5 15 % F2L
89 100 174 58 160 194 135 45 % F2R
] def
} ctxdef
 
/checkweightseq [
seq {16 mul checkweights exch 16 getinterval aload pop} forall
8586,6 → 10008,8
 
} ifelse
 
//unloadctx exec
 
end
 
}
8599,15 → 10023,15
% --END ENCODER databarexpanded--
 
% --BEGIN ENCODER databarexpandedstacked--
% --REQUIRES preamble raiseerror parseinput gs1lint renlinear renmatrix databarexpanded--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renlinear renmatrix databarexpanded--
% --DESC: GS1 DataBar Expanded Stacked
% --EXAM: (01)95012345678903(3103)000123
% --EXOP: segments=4
% --RNDR: renlinear renmatrix
%%BeginResource: uk.co.terryburton.bwipp databarexpandedstacked 0.0 2021092800 66639 63073
%%BeginData: 45 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp databarexpandedstacked 0.0 2022072900 69203 72245
%%BeginData: 46 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
dup /databarexpanded dup /uk.co.terryburton.bwipp findresource put
8619,6 → 10043,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
 
% Parse the input options
8656,18 → 10081,17
% --END ENCODER databarexpandedstacked--
 
% --BEGIN ENCODER gs1northamericancoupon--
% --REQUIRES preamble raiseerror parseinput gs1lint renlinear renmatrix databarexpanded databarexpandedstacked--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renlinear renmatrix databarexpanded databarexpandedstacked--
% --DESC: GS1 North American Coupon
% --EXAM: (8110)106141416543213500110000310123196000
% --EXOP: includetext segments=8
% --RNDR: renlinear renmatrix
%%BeginResource: uk.co.terryburton.bwipp gs1northamericancoupon 0.0 2021092800 82792 82511
%%BeginData: 131 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp gs1northamericancoupon 0.0 2022072900 84498 91105
%%BeginData: 105 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /gs1lint dup /uk.co.terryburton.bwipp findresource put
dup /gs1process dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
dup /databarexpandedstacked dup /uk.co.terryburton.bwipp findresource put
begin
8678,8 → 10102,8
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
 
/includetext false def % Enable/disable coupon text
/coupontextfont /Helvetica def
/coupontextsize 9 def
8687,6 → 10111,7
/coupontextyoffset (unset) def
/parse false def
/dontlint false def
/lintreqs true def
 
% Parse the input options
options type /stringtype eq {
8704,34 → 10129,10
coupontextxoffset (unset) ne {/coupontextxoffset coupontextxoffset cvr def} if
coupontextyoffset (unset) ne {/coupontextyoffset coupontextyoffset cvr def} if
 
% Expand ordinals of the form ^NNN to ASCII
/expand {
/fncvals <<
/parse parse
/parseonly true
/parsefnc false
>> def
fncvals //parseinput exec
} bind def
 
% Parse out AIs
/ais [] def
/vals [] def
barcode dup length 1 sub 1 exch getinterval
{ % loop
dup () eq {exit} if
(\)) search pop
exch pop
exch (\() search {
exch pop exch 3 1 roll
} {
() 3 1 roll
} ifelse
[ ais aload pop counttomark 2 add index ] /ais exch def
[ vals aload pop counttomark 1 add index expand ] /vals exch def
pop pop
} loop
barcode /ai //gs1process exec
pop
/vals exch def
/ais exch def
 
% Validate the AI structure
ais length 1 ne {
8741,8 → 10142,6
/bwipp.gs1northamericancouponBadAIStructure (A GS1 North American Coupon should consist of a single AI (8110)) //raiseerror exec
} if
 
dontlint not { ais vals //gs1lint exec pop } if
 
% Parse out the Company Prefix and Offer Code
/val vals 0 get def
/vli val 0 get 48 sub def
8804,10 → 10203,10
% --EXAM: 117480
% --EXOP: showborder
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp pharmacode 0.0 2021092800 54994 54752
%%BeginData: 93 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp pharmacode 0.0 2022072900 55161 54804
%%BeginData: 94 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
begin
8818,6 → 10217,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/height 8 2.835 mul 72 div def
/nwidth 0.5 2.835 mul def
8909,10 → 10309,10
% --EXAM: 117480
% --EXOP: includetext showborder
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp pharmacode2 0.0 2021092800 55825 55610
%%BeginData: 98 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp pharmacode2 0.0 2022072900 55992 55790
%%BeginData: 99 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
begin
8923,6 → 10323,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable text
/height 4 def % Height of short bars in millimetres
9014,15 → 10415,17
% --END ENCODER pharmacode2--
 
% --BEGIN ENCODER code2of5--
% --REQUIRES preamble raiseerror renlinear--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear--
% --DESC: Code 25
% --EXAM: 01234567
% --EXOP: includetext includecheck includecheckintext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp code2of5 0.0 2021092800 63389 62953
%%BeginData: 153 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp code2of5 0.0 2022072900 73027 69031
%%BeginData: 165 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
begin
9033,6 → 10436,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includecheck false def
/validatecheck false def
9060,6 → 10464,8
/textyoffset textyoffset cvr def
/height height cvr def
 
/code2of5 //loadctx exec
 
% Validate input
barcode {
dup 48 lt exch 57 gt or {
9084,6 → 10490,7
} if
 
% Create an array containing the character mappings
{
/versions <<
/industrial
[ (1111313111) (3111111131) (1131111131) (3131111111)
9108,6 → 10515,8
(133111) (111331) (311311) (131311) (1111) (311)
]
>> def
} ctxdef
 
versions version known not {
/bwipp.code2of5badVersion (Unrecognised Code 25 version) //raiseerror exec
} if
9120,7 → 10529,9
/es encs 11 get length def
 
% Create a string of the available characters
{
/barchars (0123456789) def
} ctxdef
 
/sbs barlen includecheck {1 add} if cs mul ss add es add string def
/txt barlen includecheck {1 add} if array def
9166,6 → 10577,8
 
dontdraw not //renlinear if
 
//unloadctx exec
 
end
 
}
9179,15 → 10592,15
% --END ENCODER code2of5--
 
% --BEGIN ENCODER industrial2of5--
% --REQUIRES preamble raiseerror renlinear code2of5--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear code2of5--
% --DESC: Industrial 2 of 5
% --EXAM: 01234567
% --EXOP: includetext includecheck includecheckintext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp industrial2of5 0.0 2021092800 51614 51610
%%BeginData: 57 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp industrial2of5 0.0 2022072900 57292 60792
%%BeginData: 58 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /code2of5 dup /uk.co.terryburton.bwipp findresource put
9199,6 → 10612,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable text
/textfont /Courier def
9248,15 → 10662,15
% --END ENCODER industrial2of5--
 
% --BEGIN ENCODER iata2of5--
% --REQUIRES preamble raiseerror renlinear code2of5--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear code2of5--
% --DESC: IATA 2 of 5
% --EXAM: 01234567
% --EXOP: includetext includecheck includecheckintext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp iata2of5 0.0 2021092800 51712 51586
%%BeginData: 57 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp iata2of5 0.0 2022072900 57262 60768
%%BeginData: 58 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /code2of5 dup /uk.co.terryburton.bwipp findresource put
9268,6 → 10682,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable text
/textfont /Courier def
9317,15 → 10732,15
% --END ENCODER iata2of5--
 
% --BEGIN ENCODER matrix2of5--
% --REQUIRES preamble raiseerror renlinear code2of5--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear code2of5--
% --DESC: Matrix 2 of 5
% --EXAM: 01234567
% --EXOP: includetext includecheck includecheckintext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp matrix2of5 0.0 2021092800 51594 51594
%%BeginData: 57 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp matrix2of5 0.0 2022072900 57272 60776
%%BeginData: 58 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /code2of5 dup /uk.co.terryburton.bwipp findresource put
9337,6 → 10752,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable text
/textfont /Courier def
9386,15 → 10802,15
% --END ENCODER matrix2of5--
 
% --BEGIN ENCODER coop2of5--
% --REQUIRES preamble raiseerror renlinear code2of5--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear code2of5--
% --DESC: COOP 2 of 5
% --EXAM: 01234567
% --EXOP: includetext includecheck includecheckintext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp coop2of5 0.0 2021092800 51584 51586
%%BeginData: 57 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp coop2of5 0.0 2022072900 57262 60768
%%BeginData: 58 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /code2of5 dup /uk.co.terryburton.bwipp findresource put
9406,6 → 10822,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable text
/textfont /Courier def
9455,15 → 10872,15
% --END ENCODER coop2of5--
 
% --BEGIN ENCODER datalogic2of5--
% --REQUIRES preamble raiseerror renlinear code2of5--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear code2of5--
% --DESC: Datalogic 2 of 5
% --EXAM: 01234567
% --EXOP: includetext includecheck includecheckintext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp datalogic2of5 0.0 2021092800 51609 51606
%%BeginData: 57 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp datalogic2of5 0.0 2022072900 57287 60788
%%BeginData: 58 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /code2of5 dup /uk.co.terryburton.bwipp findresource put
9475,6 → 10892,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable text
/textfont /Courier def
9524,15 → 10942,17
% --END ENCODER datalogic2of5--
 
% --BEGIN ENCODER code11--
% --REQUIRES preamble raiseerror renlinear--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear--
% --DESC: Code 11
% --EXAM: 0123456789
% --EXOP: includetext includecheck includecheckintext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp code11 0.0 2021092800 64947 64514
%%BeginData: 160 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp code11 0.0 2022072900 74353 70384
%%BeginData: 169 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
begin
9543,6 → 10963,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includecheck false def
/validatecheck false def
9569,7 → 10990,10
/textyoffset textyoffset cvr def
/height height cvr def
 
/code11 //loadctx exec
 
% Create an array containing the character mappings
{
/encs
[ (111131) (311131) (131131) (331111) (113131)
(313111) (133111) (111331) (311311) (311111)
9580,6 → 11004,7
/barchars (0123456789-) def
/charvals 11 dict def
0 1 10 {charvals exch dup barchars exch 1 getinterval exch put} for
} ctxdef
 
% Validate the input
0 1 barcode length 1 sub {
9683,6 → 11108,8
 
dontdraw not //renlinear if
 
//unloadctx exec
 
end
 
}
9696,15 → 11123,17
% --END ENCODER code11--
 
% --BEGIN ENCODER bc412--
% --REQUIRES preamble raiseerror renlinear--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear--
% --DESC: BC412
% --EXAM: BC412
% --EXOP: semi includetext includecheckintext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp bc412 0.0 2021092800 60520 60057
%%BeginData: 150 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp bc412 0.0 2022072900 75285 71341
%%BeginData: 203 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
begin
9715,6 → 11144,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includecheck false def
/validatecheck false def
9744,14 → 11174,18
/height height cvr def
 
semi {
/includecheck true def
% Implies includecheck and includecheckintext also
/includestartstop true def
} if
 
/bc412 //loadctx exec
 
% Create a string of the available characters
{
/barchars (0R9GLVHA8EZ4NTS1J2Q6C7DYKBUIX3FWP5M) def
/charvals 35 dict def
0 1 34 {charvals exch dup barchars exch 1 getinterval exch put} for
} ctxdef
 
% Validate the input
0 1 barcode length 1 sub {
9760,33 → 11194,77
} if
} for
 
/barlen barcode length validatecheck {1 sub} if def
semi {
% Validate length
validatecheck {
barcode length 8 lt barcode length 19 gt or {
/bwipp.bc412semivalidateBadLength (BC412 semi with check digit must be 8 to 19 characters long) //raiseerror exec
} if
} {
barcode length 7 lt barcode length 18 gt or {
/bwipp.bc412semiBadLength (BC412 semi must be 7 to 18 characters long) //raiseerror exec
} if
} ifelse
 
/checksum 0 def
0 1 barlen 1 sub {
barcode exch 1 getinterval charvals exch get
checksum add /checksum exch def
} for
/checksum checksum 35 mod def
validatecheck {
barcode barlen get barchars checksum get ne {
/bwipp.bc412badCheckDigit (Incorrect BC412 check digit provided) //raiseerror exec
/barlen barcode length def
validatecheck not { % Place dummy (0) in checksum position (1-based 2nd)
/barlen barlen 1 add def
/sbarcode barlen string def
sbarcode 0 barcode 0 get put
sbarcode 1 48 put % (0)
sbarcode 2 barcode 1 barlen 2 sub getinterval putinterval
/barcode sbarcode def
} if
/barcode barcode 0 barlen getinterval def
/includecheck true def
} if
/sumodd 0 def /sumeven 0 def
0 1 barlen 1 sub {
/i exch def
barcode i 1 getinterval charvals exch get
i 2 mod 0 eq { % 1-based odd
sumodd add /sumodd exch def
} {
sumeven add /sumeven exch def
} ifelse
} for
/checksum sumodd 35 mod sumeven 35 mod 2 mul add 35 mod def % F = Mod35( Mod35( Fodd ) + 2 * Mod35( Feven ) )
validatecheck {
checksum 0 ne {
/bwipp.bc412semiBadCheckDigit (Incorrect BC412 semi check digit provided) //raiseerror exec
} if
} {
/checksum checksum 17 mul 35 mod def % CD = Mod35( 17 * F )
barcode 1 barchars checksum get put
} ifelse
} {
/barlen barcode length validatecheck {1 sub} if def
 
/checksum 0 def
0 1 barlen 1 sub {
barcode exch 1 getinterval charvals exch get
checksum add /checksum exch def
} for
/checksum checksum 35 mod def
validatecheck {
barcode barlen get barchars checksum get ne {
/bwipp.bc412badCheckDigit (Incorrect BC412 check digit provided) //raiseerror exec
} if
/barcode barcode 0 barlen getinterval def
/includecheck true def
} if
} ifelse
 
% Create an array containing the character mappings
{
/encs
[ (11111115) (13111212) (11131113) (12111213) (12121311)
(13131111) (12111312) (11131212) (11121411) (11151111)
(15111111) (11111511) (12131211) (13121112) (13111212)
(11111214) (12121113) (11111313) (13111113) (11121213)
(11141112) (11121312) (11141211) (14121111) (12121212)
(11131311) (13121211) (12111411) (14111211) (11111412)
(12111114) (14111112) (12141111) (11121114) (12131112)
(12) (111)
[ (11111115) (13111212) (11131113) (12111213) (12121311) % 0R9GL
(13131111) (12111312) (11131212) (11121411) (11151111) % VHA8E
(15111111) (11111511) (12131211) (13121112) (13111311) % Z4NTS
(11111214) (12121113) (11111313) (13111113) (11121213) % 1J2Q6
(11141112) (11121312) (11141211) (14121111) (12121212) % C7DYK
(11131311) (13121211) (12111411) (14111211) (11111412) % BUIX3
(12111114) (14111112) (12141111) (11121114) (12131112) % FWP5M
(12) (111) % Start Stop
] def
} ctxdef
 
/sbs barlen 1 add 8 mul 5 add string def
includecheck {
9827,7 → 11305,7
% Put the stop character
includestartstop {
sbs pos encs 36 get putinterval
/pos pos 2 add def
/pos pos 3 add def
} if
 
% Return the arguments
9845,6 → 11323,8
 
dontdraw not //renlinear if
 
//unloadctx exec
 
end
 
}
9858,15 → 11338,17
% --END ENCODER bc412--
 
% --BEGIN ENCODER rationalizedCodabar--
% --REQUIRES preamble raiseerror renlinear--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear--
% --DESC: Codabar
% --EXAM: A0123456789B
% --EXOP: includetext includecheck includecheckintext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp rationalizedCodabar 0.0 2021092800 65315 64822
%%BeginData: 158 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp rationalizedCodabar 0.0 2022072900 75138 71172
%%BeginData: 167 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
begin
9877,6 → 11359,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/altstartstop false def
/includecheck false def % Enable/disable checkdigit
9904,6 → 11387,9
/textyoffset textyoffset cvr def
/height height cvr def
 
/rationalizedCodabar //loadctx exec
 
{
% Create an array containing the character mappings
/encs
[ (11111331) (11113311) (11131131) (33111111) (11311311)
9913,11 → 11399,12
] def
 
% Create a string of the available characters
altstartstop {
/barchars (0123456789-$:/.+TN*E) def
} {
/barchars (0123456789-$:/.+ABCD) def
} ifelse
/barcharsnormal (0123456789-$:/.+ABCD) def
/barcharsalt (0123456789-$:/.+TN*E) def
} ctxdef
 
/barchars altstartstop {barcharsalt} {barcharsnormal} ifelse def
 
/charvals 20 dict def
0 1 19 {charvals exch dup barchars exch 1 getinterval exch put} for
/bodyvals 16 dict def
10015,6 → 11502,8
 
dontdraw not //renlinear if
 
//unloadctx exec
 
end
 
}
10028,15 → 11517,17
% --END ENCODER rationalizedCodabar--
 
% --BEGIN ENCODER onecode--
% --REQUIRES preamble raiseerror renlinear--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear--
% --DESC: USPS Intelligent Mail
% --EXAM: 0123456709498765432101234567891
% --EXOP: barcolor=FF0000
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp onecode 0.0 2021092800 99045 98718
%%BeginData: 337 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp onecode 0.0 2022072900 108963 104948
%%BeginData: 348 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
begin
10047,6 → 11538,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/height 0.15 def
 
10063,6 → 11555,8
 
/height height cvr def
 
/onecode //loadctx exec
 
/barlen barcode length def
 
% Create the human readable text
10191,6 → 11685,7
} if
 
% Conversion from codewords to characters
{
/tab513 [
31 7936 47 7808 55 7552 59 7040 61 6016 62 3968 79 7744 87
7488 91 6976 93 5952 94 3904 103 7360 107 6848 109 5824 110 3776
10288,6 → 11783,7
513 4104 514 2056 516 1032 1025 4100 1026 2052 2049 4098 4097 2050 1028
520 272 160
] def
} ctxdef
 
/chars 10 array def
0 1 9 {
10308,6 → 11804,7
} for
 
% Conversion from characters to the OneCode encoding
{
/barmap [
7 2 4 3 1 10 0 0 9 12 2 8 5 5 6 11 8 9 3 1
0 1 5 12 2 5 1 8 4 4 9 11 6 3 8 10 3 9 7 6
10323,6 → 11820,7
5 4 0 11 1 5 2 2 9 1 4 12 8 3 6 6 7 0 3 7
4 7 7 5 0 12 1 11 2 9 9 0 6 8 5 3 3 10 8 2
] def
} ctxdef
 
/bbs 65 array def
/bhs 65 array def
10364,6 → 11862,8
 
dontdraw not //renlinear if
 
//unloadctx exec
 
end
 
}
10377,15 → 11877,17
% --END ENCODER onecode--
 
% --BEGIN ENCODER postnet--
% --REQUIRES preamble raiseerror renlinear--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear--
% --DESC: USPS POSTNET
% --EXAM: 01234
% --EXOP: includetext includecheckintext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp postnet 0.0 2021092800 61190 60891
%%BeginData: 142 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp postnet 0.0 2022072900 70748 66913
%%BeginData: 151 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
begin
10396,6 → 11898,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable text
/validatecheck false def
10421,6 → 11924,8
/textyoffset textyoffset cvr def
/height height cvr def
 
/postnet //loadctx exec
 
/barlen barcode length validatecheck {1 sub} if def
 
% Validate the input
10433,9 → 11938,18
} if
} forall
 
{
% Create a string of the available characters
/barchars (0123456789) def
 
% Create an array containing the character mappings
/encs
[ (55222) (22255) (22525) (22552) (25225)
(25252) (25522) (52225) (52252) (52522)
(5) (5)
] def
} ctxdef
 
/checksum 0 def
0 1 barlen 1 sub {
/i exch def
10449,13 → 11963,6
/barcode barcode 0 barlen getinterval def
} if
 
% Create an array containing the character mappings
/encs
[ (55222) (22255) (22525) (22552) (25225)
(25252) (25522) (52225) (52252) (52522)
(5) (5)
] def
 
/bhs barlen 5 mul 7 add array def
/txt barlen 1 add array def
 
10518,6 → 12025,8
 
dontdraw not //renlinear if
 
//unloadctx exec
 
end
 
}
10531,15 → 12040,17
% --END ENCODER postnet--
 
% --BEGIN ENCODER planet--
% --REQUIRES preamble raiseerror renlinear--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear--
% --DESC: USPS PLANET
% --EXAM: 01234567890
% --EXOP: includetext includecheckintext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp planet 0.0 2021092800 61050 60755
%%BeginData: 143 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp planet 0.0 2022072900 70608 66777
%%BeginData: 152 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
begin
10550,6 → 12061,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable text
/validatecheck false def
10575,6 → 12087,8
/textyoffset textyoffset cvr def
/height height cvr def
 
/planet //loadctx exec
 
/barlen barcode length validatecheck {1 sub} if def
 
% Validate the input
10587,9 → 12101,18
} if
} forall
 
{
% Create a string of the available characters
/barchars (0123456789) def
 
% Create an array containing the character mappings
/encs
[ (22555) (55522) (55252) (55225) (52552)
(52525) (52255) (25552) (25525) (25255)
(5) (5)
] def
} ctxdef
 
% Calculate the checksum
/checksum 0 def
0 1 barlen 1 sub {
10604,13 → 12127,6
/barcode barcode 0 barlen getinterval def
} if
 
% Create an array containing the character mappings
/encs
[ (22555) (55522) (55252) (55225) (52552)
(52525) (52255) (25552) (25525) (25255)
(5) (5)
] def
 
/bhs barlen 5 mul 7 add array def
/txt barlen 1 add array def
 
10673,6 → 12189,8
 
dontdraw not //renlinear if
 
//unloadctx exec
 
end
 
}
10686,15 → 12204,17
% --END ENCODER planet--
 
% --BEGIN ENCODER royalmail--
% --REQUIRES preamble raiseerror renlinear--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear--
% --DESC: Royal Mail 4 State Customer Code
% --EXAM: LE28HS9Z
% --EXOP: includetext barcolor=FF0000
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp royalmail 0.0 2021092800 61861 61521
%%BeginData: 147 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp royalmail 0.0 2022072900 71499 67703
%%BeginData: 156 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
begin
10705,6 → 12225,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable text
/validatecheck false def
10730,11 → 12251,26
/textyoffset textyoffset cvr def
/height height cvr def
 
/royalmail //loadctx exec
 
{
% Create a string of the available characters
/barchars (ZUVWXY501234B6789AHCDEFGNIJKLMTOPQRS) def
/charvals 36 dict def
0 1 35 {charvals exch dup barchars exch 1 getinterval exch put} for
 
% Create an array containing the character mappings
/encs
[ (3300) (2211) (2301) (2310) (3201) (3210)
(1122) (0033) (0123) (0132) (1023) (1032)
(1302) (0213) (0303) (0312) (1203) (1212)
(1320) (0231) (0321) (0330) (1221) (1230)
(3102) (2013) (2103) (2112) (3003) (3012)
(3120) (2031) (2121) (2130) (3021) (3030)
(2) (3)
] def
} ctxdef
 
% Validate the input
0 1 barcode length 1 sub {
barcode exch 1 getinterval charvals exch known not {
10760,17 → 12296,6
/barcode barcode 0 barlen getinterval def
} if
 
% Create an array containing the character mappings
/encs
[ (3300) (2211) (2301) (2310) (3201) (3210)
(1122) (0033) (0123) (0132) (1023) (1032)
(1302) (0213) (0303) (0312) (1203) (1212)
(1320) (0231) (0321) (0330) (1221) (1230)
(3102) (2013) (2103) (2112) (3003) (3012)
(3120) (2031) (2121) (2130) (3021) (3030)
(2) (3)
] def
 
/encstr barlen 4 mul 6 add string def
/txt barlen 1 add array def
 
10832,6 → 12357,8
 
dontdraw not //renlinear if
 
//unloadctx exec
 
end
 
}
10845,15 → 12372,17
% --END ENCODER royalmail--
 
% --BEGIN ENCODER auspost--
% --REQUIRES preamble raiseerror renlinear--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear--
% --DESC: AusPost 4 State Customer Code
% --EXAM: 5956439111ABA 9
% --EXOP: includetext custinfoenc=character
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp auspost 0.0 2021092800 72673 72415
%%BeginData: 204 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp auspost 0.0 2022072900 82286 78581
%%BeginData: 213 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
begin
10864,6 → 12393,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable text
/textfont /Courier def
10888,7 → 12418,10
/textyoffset textyoffset cvr def
/height height cvr def
 
/ausport //loadctx exec
 
% Create an array containing the character mappings
{
/encs
[ (000) (001) (002) (010) (011) (012) (020) (021)
(022) (100) (101) (102) (110) (111) (112) (120)
10904,6 → 12437,7
 
% Create a string of the available characters
/barchars (ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz #) def
} ctxdef
 
/barlen barcode length def
barcode 0 2 getinterval (11) eq {37} if
11048,6 → 12582,8
 
dontdraw not //renlinear if
 
//unloadctx exec
 
end
 
}
11061,15 → 12597,17
% --END ENCODER auspost--
 
% --BEGIN ENCODER kix--
% --REQUIRES preamble raiseerror renlinear--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear--
% --DESC: Royal Dutch TPG Post KIX
% --EXAM: 1231FZ13XHS
% --EXOP: includetext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp kix 0.0 2021092800 57107 57044
%%BeginData: 113 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp kix 0.0 2022072900 66625 62978
%%BeginData: 122 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
begin
11080,6 → 12618,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable text
/textfont /Courier def
11103,6 → 12642,9
/textyoffset textyoffset cvr def
/height height cvr def
 
/kix //loadctx exec
 
{
% Create an array containing the character mappings
/encs
[ (0033) (0123) (0132) (1023) (1032) (1122)
11117,6 → 12659,7
/barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ) def
/charvals 36 dict def
0 1 35 {charvals exch dup barchars exch 1 getinterval exch put} for
} ctxdef
 
% Validate the input
0 1 barcode length 1 sub {
11173,6 → 12716,8
 
dontdraw not //renlinear if
 
//unloadctx exec
 
end
 
}
11186,15 → 12731,17
% --END ENCODER kix--
 
% --BEGIN ENCODER japanpost--
% --REQUIRES preamble raiseerror renlinear--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear--
% --DESC: Japan Post 4 State Customer Code
% --EXAM: 6540123789-A-K-Z
% --EXOP: includetext includecheckintext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp japanpost 0.0 2021092800 62022 61757
%%BeginData: 164 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp japanpost 0.0 2022072900 71644 67819
%%BeginData: 174 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
begin
11205,6 → 12752,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable text
/includecheckintext false def
11229,6 → 12777,11
/textyoffset textyoffset cvr def
/height height cvr def
 
/barlen barcode length def
 
/japanpost //loadctx exec
 
{
% Create an array containing the character mappings
% 0123456789- C1C2C3C4C5C6C7C8 ST EN
/encs
11239,7 → 12792,7
 
% Create a string of the available characters
/barchars (0123456789-ABCDEFGHIJKLMNOPQRSTUVWXYZ) def
/barlen barcode length def
} ctxdef
 
/encstr 20 1 add 3 mul 4 add string def
/digits 20 array def
11349,6 → 12902,8
 
dontdraw not //renlinear if
 
//unloadctx exec
 
end
 
}
11362,15 → 12917,17
% --END ENCODER japanpost--
 
% --BEGIN ENCODER msi--
% --REQUIRES preamble raiseerror renlinear--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear--
% --DESC: MSI Modified Plessey
% --EXAM: 0123456789
% --EXOP: includetext includecheck includecheckintext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp msi 0.0 2021092800 67297 66798
%%BeginData: 141 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp msi 0.0 2022072900 76359 72660
%%BeginData: 150 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
begin
11381,6 → 12938,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includecheck false def % Enable/disable checkdigit
/includetext false def % Enable/disable text
11408,6 → 12966,9
/textyoffset textyoffset cvr def
/height height cvr def
 
/msi //loadctx exec
 
{
% Create an array containing the character mappings
/encs
[ (12121212) (12121221) (12122112) (12122121) (12211212)
11417,6 → 12978,7
 
% Create a string of the available characters
/barchars (0123456789) def
} ctxdef
 
/barlen barcode length def % Length of the code
/txtlen barlen def
11428,7 → 12990,7
0 0 code {48 sub add exch} forall exch pop add
10 mod 10 exch sub 10 mod
code length 1 add string dup 0 code putinterval dup code length 4 -1 roll 48 add put
} bind def
} def
 
/mod11 {
/code exch def
11440,7 → 13002,7
} {
code length 1 add string dup 0 code putinterval dup code length 4 -1 roll 48 add put
} ifelse
} bind def
} def
 
/ncrmod11 {
/code exch def
11452,7 → 13014,7
} {
code length 1 add string dup 0 code putinterval dup code length 4 -1 roll 48 add put
} ifelse
} bind def
} def
 
% Calculate checksum
includecheck {
11502,6 → 13064,8
 
dontdraw not //renlinear if
 
//unloadctx exec
 
end
 
}
11515,15 → 13079,17
% --END ENCODER msi--
 
% --BEGIN ENCODER plessey--
% --REQUIRES preamble raiseerror renlinear--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear--
% --DESC: Plessey UK
% --EXAM: 01234ABCD
% --EXOP: includetext includecheckintext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp plessey 0.0 2021092800 63687 63197
%%BeginData: 148 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp plessey 0.0 2022072900 73093 69275
%%BeginData: 157 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
begin
11534,6 → 13100,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable text
/validatecheck false def
11560,11 → 13127,24
/textyoffset textyoffset cvr def
/height height cvr def
 
/plessey //loadctx exec
 
% Create a string of the available characters
{
/barchars (0123456789ABCDEF) def
/charvals 16 dict def
0 1 15 {charvals exch dup barchars exch 1 getinterval exch put} for
 
% Create an array containing the character mappings
/encs
[ (14141414) (32141414) (14321414) (32321414)
(14143214) (32143214) (14323214) (32323214)
(14141432) (32141432) (14321432) (32321432)
(14143232) (32143232) (14323232) (32323232)
(32321432) (541412323) (323)
] def
} ctxdef
 
% Validate the input
0 1 barcode length 1 sub {
barcode exch 1 getinterval charvals exch known not {
11612,15 → 13192,6
/barcode barcode 0 barlen getinterval def
} if
 
% Create an array containing the character mappings
/encs
[ (14141414) (32141414) (14321414) (32321414)
(14143214) (32143214) (14323214) (32323214)
(14141432) (32141432) (14321432) (32321432)
(14143232) (32143232) (14323232) (32323232)
(32321432) (541412323) (323)
] def
 
/sbs barlen 8 mul unidirectional {27} {33} ifelse add string def
/txt barlen 2 add array def
 
11662,6 → 13233,8
 
dontdraw not //renlinear if
 
//unloadctx exec
 
end
 
}
11675,15 → 13248,17
% --END ENCODER plessey--
 
% --BEGIN ENCODER telepen--
% --REQUIRES preamble raiseerror parseinput renlinear--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renlinear--
% --DESC: Telepen
% --EXAM: ABCDEF
% --EXOP: includetext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp telepen 0.0 2021092800 65612 65365
%%BeginData: 165 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp telepen 0.0 2022072900 71738 74891
%%BeginData: 174 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
11695,6 → 13270,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/numeric false def
/dontdraw false def
/includetext false def % Enable/disable text
11720,6 → 13296,8
/textyoffset textyoffset cvr def
/height height cvr def
 
/telepen //loadctx exec
 
% Parse ordinals of the form ^NNN to ASCII
/fncvals <<
/parse parse
11731,6 → 13309,7
options (parse) undef
 
% Create an array containing the character mappings
{
/encs
[ (31313131) (1131313111) (33313111) (1111313131)
(3111313111) (11333131) (13133131) (111111313111)
11765,6 → 13344,7
(3113111113) (11311111111111) (331111111111) (111113111113)
(31111111111111) (111311111113) (131111111113) (1111111111111111)
] def
} ctxdef
 
/barlen barcode length def % Length of the code
/sbs barlen 16 mul 48 add string def
11839,6 → 13419,8
 
dontdraw not //renlinear if
 
//unloadctx exec
 
end
 
}
11852,15 → 13434,15
% --END ENCODER telepen--
 
% --BEGIN ENCODER telepennumeric--
% --REQUIRES preamble raiseerror parseinput renlinear telepen--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renlinear telepen--
% --DESC: Telepen Numeric
% --EXAM: 01234567
% --EXOP: includetext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp telepennumeric 0.0 2021092800 54465 57771
%%BeginData: 57 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp telepennumeric 0.0 2022072900 63543 63521
%%BeginData: 58 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /telepen dup /uk.co.terryburton.bwipp findresource put
11872,6 → 13454,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable text
/textfont /Courier def
11897,7 → 13480,7
/textyoffset textyoffset cvr def
/height height cvr def
 
% Get the result of encoding with code2of5 with version=industrial
% Get the result of encoding with telepen with numeric=true
options (dontdraw) true put
options (numeric) true put
 
11921,15 → 13504,17
% --END ENCODER telepennumeric--
 
% --BEGIN ENCODER posicode--
% --REQUIRES preamble raiseerror parseinput renlinear--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renlinear--
% --DESC: PosiCode
% --EXAM: ABC123
% --EXOP: version=b inkspread=-0.5 parsefnc includetext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp posicode 0.0 2021092800 107308 106674
%%BeginData: 390 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp posicode 0.0 2022072900 113401 116320
%%BeginData: 399 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
11941,6 → 13526,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable text
/textfont /Courier def
11975,6 → 13561,9
/checkoffset checkoffset cvi def
/height height cvr def
 
/posicode //loadctx exec
 
{
% Special function characters
/la0 -1 def /la1 -2 def /la2 -3 def
/sf0 -4 def /sf1 -5 def /sf2 -6 def
11981,9 → 13570,7
/fn1 -7 def /fn2 -8 def /fn3 -9 def /fn4 -10 def
 
% Character maps for each state
<<
/normal
[
/charmapsnormal [
% 0 1 2 0 1 2 0 1 2
[ (0) (^) (') ] [ (1) (;) 27 ] [ (2) (<) 28 ] % 0-2
[ (3) (=) 29 ] [ (4) (>) 30 ] [ (5) (?) 31 ] % 3-5
12001,9 → 13588,8
[ ($) ({) (*) ] [ (/) (|) (,) ] [ (+) (}) (:) ] % 39-41
[ (%) (~) fn1 ] [ la1 la0 fn2 ] [ sf1 sf0 fn3 ] % 42-44
[ sf2 sf2 fn4 ] % 45
]
/limited
[
] def
/chapmapslimited [
[ (0) -98 -98 ] [ (1) -98 -98 ] [ (2) -98 -98 ] % 0-2
[ (3) -98 -98 ] [ (4) -98 -98 ] [ (5) -98 -98 ] % 3-5
[ (6) -98 -98 ] [ (7) -98 -98 ] [ (8) -98 -98 ] % 6-8
12017,11 → 13603,11
[ (U) -98 -98 ] [ (V) -98 -98 ] [ (W) -98 -98 ] % 30-32
[ (X) -98 -98 ] [ (Y) -98 -98 ] [ (Z) -98 -98 ] % 33-35
[ (-) -98 -98 ] [ (.) -98 -98 ] % 36-37
]
>>
version (a) eq version (b) eq or {/normal} {/limited} ifelse get
/charmaps exch def
] def
} ctxdef
 
/charmaps version (a) eq version (b) eq or {charmapsnormal} {chapmapslimited} ifelse def
 
% Invert charmaps to give character to value maps for each state
/charvals [
charmaps length dict charmaps length dict charmaps length dict
12171,7 → 13757,8
} if % auto encoding
 
% Create an array containing the character mappings
<< % ";"=11, "<"=12
{
/encmaps << % ";"=11, "<"=12
/a
[ (141112) (131212) (121312) (111412) (131113)
(121213) (111313) (121114) (111214) (111115)
12216,9 → 13803,11
(131415) (121515) (141216) (131316) (121416)
(131217) (121317) (121218) (141212) (1)
]
>>
version get /encs exch def
>> def
} ctxdef
encmaps version get /encs exch def
 
{
/c2w [
[ 495 330 210 126 70 35 15 5 ]
[ 165 120 84 56 35 20 10 4 ]
12226,6 → 13815,7
[ 9 8 7 6 5 4 3 2 ]
[ 1 1 1 1 1 1 1 1 ]
] def
} ctxdef
/v 0 def
cws {
/cw exch def
12310,6 → 13900,8
 
dontdraw not //renlinear if
 
//unloadctx exec
 
end
 
}
12323,15 → 13915,17
% --END ENCODER posicode--
 
% --BEGIN ENCODER codablockf--
% --REQUIRES preamble raiseerror parseinput renmatrix--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix--
% --DESC: Codablock F
% --EXAM: CODABLOCK F 34567890123456789010040digit
% --EXOP: columns=8
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp codablockf 0.0 2021092800 128719 128096
%%BeginData: 488 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp codablockf 0.0 2022072900 134317 137326
%%BeginData: 499 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
12343,6 → 13937,7
/options exch def
/barcode exch def
 
/ctx null def
/dontdraw false def
/rows -1 def
/columns 8 def
12370,6 → 13965,8
/c columns 4 ge columns 62 le and {columns} {8} ifelse def
/rows rows 2 ge rows 44 le and {rows} {-1} ifelse def
 
/codablockf //loadctx exec
 
% Convert input into bytes accounting for FNC characters
/swa -1 def /swb -2 def /swc -3 def /sft -4 def
/fn1 -5 def /fn2 -6 def /fn3 -7 def /fn4 -8 def
12397,6 → 13994,7
/msglen msg length def
 
% Character maps for each state
{
/charmaps [
% A B C A B C A B C
[ 32 32 (00) ] [ (!) (!) (01) ] [ (") (") (02) ] % 0-2
12450,6 → 14048,7
/seta charvals 0 get def
/setb charvals 1 get def
/setc charvals 2 get def
} ctxdef
 
% Determine digit runlength and characters from given position
/numsscr {
12467,17 → 14066,17
/p p 1 add def
} loop
n s
} bind def
} def
 
% Encoding for each alphabet
/enca {
seta exch get cws exch j exch put
/j j 1 add def
} bind def
} def
/encb {
setb exch get cws exch j exch put
/j j 1 add def
} bind def
} def
/encc {
dup type /arraytype ne {
setc exch get
12486,11 → 14085,11
} ifelse
cws exch j exch put
/j j 1 add def
} bind def
} def
 
% Character exclusively in either alphabet A or B
/anotb {dup seta exch known exch setb exch known not and} bind def
/bnota {dup setb exch known exch seta exch known not and} bind def
/anotb {dup seta exch known exch setb exch known not and} def
/bnota {dup setb exch known exch seta exch known not and} def
 
% Pre-compute relative position of next anotb and next bnota characters
/nextanotb [ msg length {0} repeat 9999 ] def
12510,8 → 14109,8
} for
 
% Does a-only come before b-only after given position and vice versa
/abeforeb {dup nextanotb exch get exch nextbnota exch get lt} bind def
/bbeforea {dup nextbnota exch get exch nextanotb exch get lt} bind def
/abeforeb {dup nextanotb exch get exch nextbnota exch get lt} def
/bbeforea {dup nextbnota exch get exch nextanotb exch get lt} def
 
% Add padding to row
/padrow {
12522,7 → 14121,7
cset (setc) eq {swb encc /cset (setb) def exit} if
} loop
} repeat
} bind def
} def
 
% Convert message to codewords
/cws c 5 add 44 mul array def
12747,6 → 14346,7
} for
 
% Create an array containing the character mappings
{
/encs
[ (212222) (222122) (222221) (121223) (121322) (131222) (122213)
(122312) (132212) (221213) (221312) (231212) (112232) (122132)
12764,6 → 14364,7
(412121) (111143) (111341) (131141) (114113) (114311) (411113)
(411311) (113141) (114131) (311141) (411131) (211412) (2331112)
] def
} ctxdef
 
% Derive the bits for each row
/rowbits r array def
12810,6 → 14411,8
 
dontdraw not //renmatrix if
 
//unloadctx exec
 
end
 
}
12823,15 → 14426,17
% --END ENCODER codablockf--
 
% --BEGIN ENCODER code16k--
% --REQUIRES preamble raiseerror parseinput renmatrix--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix--
% --DESC: Code 16K
% --EXAM: Abcd-1234567890-wxyZ
% --EXOP:
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp code16k 0.0 2021092800 153345 152816
%%BeginData: 711 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp code16k 0.0 2022072900 158879 165054
%%BeginData: 725 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
12843,6 → 14448,7
/options exch def
/barcode exch def
 
/ctx null def
/dontdraw false def
/mode -1 def
/pos -1 def
12871,9 → 14477,12
/rowheight rowheight cvi def
/sepheight sepheight cvi def
 
/code16k //loadctx exec
 
pos -1 ne {/rows 16 def} if
 
% Convert input into bytes accounting for FNC characters
{
/swa -1 def /swb -2 def /swc -3 def
/sa1 -4 def /sb1 -5 def /sc1 -6 def
/sa2 -7 def /sb2 -8 def /sc2 -9 def
12935,6 → 14544,7
/seta charvals 0 get def
/setb charvals 1 get def
/setc charvals 2 get def
} ctxdef
 
raw {/encoding (raw) def} if
 
13016,17 → 14626,17
/p p 1 add def
} loop
n s
} bind def
} def
 
% Encoding for each alphabet
/enca {
seta exch get cws exch j exch put
/j j 1 add def
} bind def
} def
/encb {
setb exch get cws exch j exch put
/j j 1 add def
} bind def
} def
/encc {
dup type /arraytype ne {
setc exch get
13035,11 → 14645,11
} ifelse
cws exch j exch put
/j j 1 add def
} bind def
} def
 
% Character exclusively in either alphabet A or B
/anotb {dup seta exch known exch setb exch known not and} bind def
/bnota {dup setb exch known exch seta exch known not and} bind def
/anotb {dup seta exch known exch setb exch known not and} def
/bnota {dup setb exch known exch seta exch known not and} def
 
% Pre-compute relative position of next anotb and next bnota characters
/nextanotb [ msg length {0} repeat 9999 ] def
13059,8 → 14669,8
} for
 
% Does a-only come before b-only after given position and vice versa
/abeforeb {dup nextanotb exch get exch nextbnota exch get lt} bind def
/bbeforea {dup nextbnota exch get exch nextanotb exch get lt} bind def
/abeforeb {dup nextanotb exch get exch nextbnota exch get lt} def
/bbeforea {dup nextbnota exch get exch nextanotb exch get lt} def
 
/cws barcode length 2 mul 3 add array def
 
13404,6 → 15014,7
 
% Basic metrics for the each symbol
% r dcws
{
/metrics [
[ 2 7 ]
[ 3 12 ]
13421,6 → 15032,7
[ 15 72 ]
[ 16 77 ]
] def
} ctxdef
 
% Select metrics of an appropriate symbol
/urows rows def
13450,6 → 15062,7
/cws [ cws aload pop c1 c2 ] def
 
% Create an array containing the character mappings
{
/encs
[ (212222) (222122) (222221) (121223) (121322) (131222) (122213)
(122312) (132212) (221213) (221312) (231212) (112232) (122132)
13482,6 → 15095,8
(2122) (1411) (1132) (1231) (1114) (3112) (1132) (1231)
(1114) (3112) (3211) (2221) (2122) (1411) (3211) (2221)
] def
} ctxdef
 
pos -1 eq pos 10 idiv 2 mod 1 eq or {
/stopencs stopencsodd def
} {
13533,6 → 15148,8
 
dontdraw not //renmatrix if
 
//unloadctx exec
 
end
 
}
13546,15 → 15163,17
% --END ENCODER code16k--
 
% --BEGIN ENCODER code49--
% --REQUIRES preamble raiseerror parseinput renmatrix--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix--
% --DESC: Code 49
% --EXAM: MULTIPLE ROWS IN CODE 49
% --EXOP:
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp code49 0.0 2021092800 255438 268416
%%BeginData: 1042 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp code49 0.0 2022072900 261572 278054
%%BeginData: 1063 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
13566,6 → 15185,7
/options exch def
/barcode exch def
 
/ctx null def
/dontdraw false def
/mode -1 def
/pos -1 def
13592,8 → 15212,13
/rowheight rowheight cvi def
/sepheight sepheight cvi def
 
% Parse the input
/code49 //loadctx exec
 
{
/s1 -1 def /s2 -2 def /fn1 -3 def /fn2 -4 def /fn3 -5 def /ns -6 def
} ctxdef
 
% Parse the input
/fncvals <<
/parse parse
/parsefnc parsefnc
13604,6 → 15229,7
/msg barcode fncvals //parseinput exec def
/msglen msg length def
 
{
% Character encodings
/charmap [
(0) (1) (2) (3) (4) (5) (6) (7) (8) (9)
13643,6 → 15269,7
charvals i [ charvals s2 get charvals c2 get ] put
} if
} for
} ctxdef
 
/encodealpha {
charvals exch get
13649,7 → 15276,7
dup type /arraytype ne {1 array astore} if
dup cws exch j exch putinterval
length j add /j exch def
} bind def
} def
 
/base48 {
0 exch {48 sub exch 10 mul add} forall
13657,7 → 15284,7
[ exch dup length 1 sub -1 0 {1 index exch get exch} for pop ]
dup cws exch j exch putinterval
length j add /j exch def
} bind def
} def
 
/encodenumeric {
/nums exch def
13672,7 → 15299,7
3 [49 48 nums 0 4 getinterval aload pop] base48
2 nums 4 3 getinterval base48
} if
} bind def
} def
 
% Pre-compute alphanumeric and numeric runlengths
/numericruns [ msglen {0} repeat 0 ] def
13701,20 → 15328,23
/cws msglen 2 mul 1 add array def
/method (alpha) def /i -1 def /j -1 def
 
{
/posval [
12 22
13 23 33
14 24 34 44
15 25 35 45 55
16 26 36 46 56 66
17 27 37 47 57 67 77
18 28 38 48 58 68 78 88
19 29 39 49 59 69 79 89 99
] def
} ctxdef
 
% Handle start for each mode
mode 0 eq mode 1 eq or {/method (alpha) def /i 0 def /j 0 def} if
mode 2 eq {/method (numeric) def /i 0 def /j 0 def} if
mode 3 eq {
/posval [
12 22
13 23 33
14 24 34 44
15 25 35 45 55
16 26 36 46 56 66
17 27 37 47 57 67 77
18 28 38 48 58 68 78 88
19 29 39 49 59 69 79 89 99
] def
cws 0 0 1 43 {dup posval exch get pos ne {pop} if} for 1 add put
/method (alpha) def /i 0 def /j 1 def
} if
13753,6 → 15383,7
 
% Basic metrics for the each symbol
% r dcws
{
/metrics [
[ 2 9 ]
[ 3 16 ]
13762,6 → 15393,7
[ 7 42 ]
[ 8 49 ]
] def
} ctxdef
 
% Select metrics of an appropriate symbol
/urows rows def
13799,11 → 15431,13
ccs ccs length 2 sub cr7 put
 
% Calculate the symbol check characters
{
[ 1 9 31 26 2 12 17 23 37 18 22 6 27 44 15 43 39
11 13 5 41 33 36 8 4 32 3 19 40 25 29 10 24 30 ]
dup [ exch 20 exch 0 32 getinterval aload pop ] /weightx exch def
dup [ exch 16 exch 1 32 getinterval aload pop ] /weighty exch def
[ exch 38 exch 2 32 getinterval aload pop ] /weightz exch def
} ctxdef
/calccheck {
/weights exch def
/score 0 def
13813,7 → 15447,7
weights i 1 add get mul /score exch score add def
} for
score
} bind def
} def
/lastrow ccs ccs length 8 sub 8 getinterval def
 
% wr1 check character
13843,6 → 15477,7
ccs ccs length 8 sub 7 getinterval 0 exch {add} forall 49 mod
ccs ccs length 1 sub 3 -1 roll put
 
{
/patterns [
[ % Even parity
(11521132) (25112131) (14212132) (25121221) (14221222) (12412132) (23321221)
14538,6 → 16173,7
/parity [
(1001) (0101) (1100) (0011) (1010) (0110) (1111) (0000)
] def
} ctxdef
 
% Derive the bits for each row
/rowbits r array def
14587,6 → 16223,8
 
dontdraw not //renmatrix if
 
//unloadctx exec
 
end
 
}
14600,15 → 16238,17
% --END ENCODER code49--
 
% --BEGIN ENCODER channelcode--
% --REQUIRES preamble raiseerror renlinear--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear--
% --DESC: Channel Code
% --EXAM: 3493
% --EXOP: height=0.5 includetext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp channelcode 0.0 2021092800 125552 124333
%%BeginData: 250 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp channelcode 0.0 2022072900 133046 128171
%%BeginData: 262 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
begin
14619,6 → 16259,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/shortfinder false def
/includetext false def
14638,6 → 16279,8
 
/height height cvr def
 
/channelcode //loadctx exec
 
% Validate the input
barcode length 2 lt barcode length 7 gt or {
/bwipp.channelcodeBadLength (Channel Code must be 2 to 7 digits) //raiseerror exec
14653,27 → 16296,27
 
% Tail-call optimisation FTW!
/loops1 { /s2max s1max 1 add s1 sub def /b1 1 def
s1 1 eq {nextb1} {loopb1} ifelse } bind def
/loopb1 { /b2max b1max 1 add b1 sub def /s2 1 def loops2 } bind def
s1 1 eq {nextb1} {loopb1} ifelse } def
/loopb1 { /b2max b1max 1 add b1 sub def /s2 1 def loops2 } def
/loops2 { /s3max s2max 1 add s2 sub def /b2 1 def
s1 b1 add s2 add 3 eq {nextb2} {loopb2} ifelse } bind def
/loopb2 { /b3max b2max 1 add b2 sub def /s3 1 def loops3 } bind def
s1 b1 add s2 add 3 eq {nextb2} {loopb2} ifelse } def
/loopb2 { /b3max b2max 1 add b2 sub def /s3 1 def loops3 } def
/loops3 { /s4max s3max 1 add s3 sub def /b3 1 def
b1 s2 add b2 add s3 add 4 eq {nextb3} {loopb3} ifelse } bind def
/loopb3 { /b4max b3max 1 add b3 sub def /s4 1 def loops4 } bind def
b1 s2 add b2 add s3 add 4 eq {nextb3} {loopb3} ifelse } def
/loopb3 { /b4max b3max 1 add b3 sub def /s4 1 def loops4 } def
/loops4 { /s5max s4max 1 add s4 sub def /b4 1 def
b2 s3 add b3 add s4 add 4 eq {nextb4} {loopb4} ifelse } bind def
/loopb4 { /b5max b4max 1 add b4 sub def /s5 1 def loops5 } bind def
b2 s3 add b3 add s4 add 4 eq {nextb4} {loopb4} ifelse } def
/loopb4 { /b5max b4max 1 add b4 sub def /s5 1 def loops5 } def
/loops5 { /s6max s5max 1 add s5 sub def /b5 1 def
b3 s4 add b4 add s5 add 4 eq {nextb5} {loopb5} ifelse } bind def
/loopb5 { /b6max b5max 1 add b5 sub def /s6 1 def loops6 } bind def
b3 s4 add b4 add s5 add 4 eq {nextb5} {loopb5} ifelse } def
/loopb5 { /b6max b5max 1 add b5 sub def /s6 1 def loops6 } def
/loops6 { /s7max s6max 1 add s6 sub def /b6 1 def
b4 s5 add b5 add s6 add 4 eq {nextb6} {loopb6} ifelse } bind def
/loopb6 { /b7max b6max 1 add b6 sub def /s7 1 def loops7 } bind def
b4 s5 add b5 add s6 add 4 eq {nextb6} {loopb6} ifelse } def
/loopb6 { /b7max b6max 1 add b6 sub def /s7 1 def loops7 } def
/loops7 { /s8 s7max 1 add s7 sub def /b7 1 def
b5 s6 add b6 add s7 add 4 eq {nextb7} {loopb7} ifelse } bind def
b5 s6 add b6 add s7 add 4 eq {nextb7} {loopb7} ifelse } def
/loopb7 { /b8 b7max 1 add b7 sub def
b6 s7 add b7 add s8 add b8 add 5 eq {nextb7} {chkchr} ifelse } bind def
b6 s7 add b7 add s8 add b8 add 5 eq {nextb7} {chkchr} ifelse } def
/chkchr {
value target eq {
[s1 b1 s2 b2 s3 b3 s4 b4 s5 b5 s6 b6 s7 b7 s8 b8] exit
14680,22 → 16323,23
} if
/value value 1 add def
nextb7
} bind def
/nextb7 { /b7 b7 1 add def b7 b7max le {loopb7} {nexts7} ifelse } bind def
/nexts7 { /s7 s7 1 add def s7 s7max le {loops7} {nextb6} ifelse } bind def
/nextb6 { /b6 b6 1 add def b6 b6max le {loopb6} {nexts6} ifelse } bind def
/nexts6 { /s6 s6 1 add def s6 s6max le {loops6} {nextb5} ifelse } bind def
/nextb5 { /b5 b5 1 add def b5 b5max le {loopb5} {nexts5} ifelse } bind def
/nexts5 { /s5 s5 1 add def s5 s5max le {loops5} {nextb4} ifelse } bind def
/nextb4 { /b4 b4 1 add def b4 b4max le {loopb4} {nexts4} ifelse } bind def
/nexts4 { /s4 s4 1 add def s4 s4max le {loops4} {nextb3} ifelse } bind def
/nextb3 { /b3 b3 1 add def b3 b3max le {loopb3} {nexts3} ifelse } bind def
/nexts3 { /s3 s3 1 add def s3 s3max le {loops3} {nextb2} ifelse } bind def
/nextb2 { /b2 b2 1 add def b2 b2max le {loopb2} {nexts2} ifelse } bind def
/nexts2 { /s2 s2 1 add def s2 s2max le {loops2} {nextb1} ifelse } bind def
/nextb1 { /b1 b1 1 add def b1 b1max le {loopb1} {nexts1} ifelse } bind def
/nexts1 { /s1 s1 1 add def s1 s1max le {loops1} if } bind def
} def
/nextb7 { /b7 b7 1 add def b7 b7max le {loopb7} {nexts7} ifelse } def
/nexts7 { /s7 s7 1 add def s7 s7max le {loops7} {nextb6} ifelse } def
/nextb6 { /b6 b6 1 add def b6 b6max le {loopb6} {nexts6} ifelse } def
/nexts6 { /s6 s6 1 add def s6 s6max le {loops6} {nextb5} ifelse } def
/nextb5 { /b5 b5 1 add def b5 b5max le {loopb5} {nexts5} ifelse } def
/nexts5 { /s5 s5 1 add def s5 s5max le {loops5} {nextb4} ifelse } def
/nextb4 { /b4 b4 1 add def b4 b4max le {loopb4} {nexts4} ifelse } def
/nexts4 { /s4 s4 1 add def s4 s4max le {loops4} {nextb3} ifelse } def
/nextb3 { /b3 b3 1 add def b3 b3max le {loopb3} {nexts3} ifelse } def
/nexts3 { /s3 s3 1 add def s3 s3max le {loops3} {nextb2} ifelse } def
/nextb2 { /b2 b2 1 add def b2 b2max le {loopb2} {nexts2} ifelse } def
/nexts2 { /s2 s2 1 add def s2 s2max le {loops2} {nextb1} ifelse } def
/nextb1 { /b1 b1 1 add def b1 b1max le {loopb1} {nexts1} ifelse } def
/nexts1 { /s1 s1 1 add def s1 s1max le {loops1} if } def
 
{
/memo [ % Accelerate generation of bar patterns
[ % CH3
[ 0 [1 1 1 1 1 2 1 2] [1 1 1 1 1 1 1 3] [1 1 1 1 1 3 2] [1 1 1 1 1 3 3] ]
14770,6 → 16414,7
[ 7650000 [5 2 1 2 1 2 1 1] [5 2 2 1 1 2 1 1] [8 4 3 3 2 2 1] [8 4 3 2 2 2 1] ]
]
] def
} ctxdef
 
/encode {
/chan exch def
14793,7 → 16438,7
 
1 {chkchr} repeat 8 chan sub 2 mul dup 16 exch sub getinterval
 
} bind def
} def
 
/barlen barcode length def
 
14804,9 → 16449,8
/data barcode cvi barlen 1 add encode def
 
% Determine check data
/check [] def
includecheck {
/mod23 [
{
/mod23map [
[] []
[ 13 12 4 9 3 1 ]
[ 8 2 12 3 18 16 4 1 ]
14814,7 → 16458,11
[ 1 4 16 18 3 12 2 8 9 13 6 1 ]
[ 20 16 22 13 15 12 5 4 17 9 21 3 7 1 ]
[ 2 6 18 8 1 3 9 4 12 13 16 2 6 18 8 1 ]
] barlen get def
] def
} ctxdef
/check [] def
includecheck {
/mod23 mod23map barlen get def
0
0 1 data length 1 sub {
dup data exch get 1 sub exch mod23 exch get mul add
14849,6 → 16497,8
 
dontdraw not //renlinear if
 
//unloadctx exec
 
end
 
}
14862,15 → 16512,17
% --END ENCODER channelcode--
 
% --BEGIN ENCODER flattermarken--
% --REQUIRES preamble raiseerror renlinear--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear--
% --DESC: Flattermarken
% --EXAM: 11099
% --EXOP: inkspread=-0.25 showborder borderleft=0 borderright=0
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp flattermarken 0.0 2021092800 53805 53752
%%BeginData: 95 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp flattermarken 0.0 2022072900 63323 59686
%%BeginData: 104 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
begin
14881,6 → 16533,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/includetext false def % Enable/disable text
/textfont /Courier def
14911,6 → 16564,8
/textyoffset textyoffset cvr def
/height height cvr def
 
/flattermarken //loadctx exec
 
% Validate the input
barcode {
dup 48 lt exch 57 gt or {
14918,6 → 16573,7
} if
} forall
 
{
% Create an array containing the character mappings
/encs
[ (0018) (0117) (0216) (0315) (0414) (0513) (0612) (0711) (0810)
14926,6 → 16582,7
 
% Create a string of the available characters
/barchars (1234567890) def
} ctxdef
 
/barlen barcode length def % Length of the code
 
14956,6 → 16613,8
 
dontdraw not //renlinear if
 
//unloadctx exec
 
end
 
}
14974,10 → 16633,10
% --EXAM: 331132131313411122131311333213114131131221323
% --EXOP: height=0.5
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp raw 0.0 2021092800 49511 49415
%%BeginData: 54 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp raw 0.0 2022072900 49590 49507
%%BeginData: 55 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
begin
14988,6 → 16647,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/height 1 def
 
15040,10 → 16700,10
% --EXAM: FATDAFTDAD
% --EXOP:
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp daft 0.0 2021092800 52789 52642
%%BeginData: 78 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp daft 0.0 2022072900 52828 52694
%%BeginData: 79 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
begin
15054,6 → 16714,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/height 0.175 def
 
15130,10 → 16791,10
% --EXAM: fima
% --EXOP: backgroundcolor=DD000011
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp symbol 0.0 2021092800 53469 53305
%%BeginData: 79 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp symbol 0.0 2022072900 53524 53245
%%BeginData: 80 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
begin
15144,6 → 16805,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
 
% Parse the input options
15216,15 → 16878,17
% --END ENCODER symbol--
 
% --BEGIN ENCODER pdf417--
% --REQUIRES preamble raiseerror parseinput renmatrix--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix--
% --DESC: PDF417
% --EXAM: This is PDF417
% --EXOP: columns=2
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp pdf417 0.0 2021092800 196554 198626
%%BeginData: 900 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp pdf417 0.0 2022072900 201920 207600
%%BeginData: 911 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
15236,6 → 16900,7
/options exch def
/barcode exch def
 
/ctx null def
/dontdraw false def
/compact false def
/eclevel -1 def
15264,6 → 16929,99
/rows rows cvi def
/rowmult rowmult cvr def
 
/pdf417 //loadctx exec
 
{
% Modes and text submodes
/T 0 def /N 1 def /B 2 def
/A 0 def /L 1 def /M 2 def /P 3 def
 
% Special function characters for mode switching
/tl -1 def /nl -2 def /bl -3 def /bl6 -4 def /bs -5 def
 
% Special function characters for text mode
/al -6 def /ll -7 def /ml -8 def /pl -9 def /as -10 def /ps -11 def
 
% Character maps for each state
/charmaps [
% A L M P
[ (A) (a) (0) (;) ] % 0
[ (B) (b) (1) (<) ] % 1
[ (C) (c) (2) (>) ] % 2
[ (D) (d) (3) (@) ] % 3
[ (E) (e) (4) ([) ] % 4
[ (F) (f) (5) 92 ] % 5
[ (G) (g) (6) (]) ] % 6
[ (H) (h) (7) (_) ] % 7
[ (I) (i) (8) (`) ] % 8
[ (J) (j) (9) (~) ] % 9
[ (K) (k) (&) (!) ] % 10
[ (L) (l) 13 13 ] % 11
[ (M) (m) 9 9 ] % 12
[ (N) (n) (,) (,) ] % 13
[ (O) (o) (:) (:) ] % 14
[ (P) (p) (#) 10 ] % 15
[ (Q) (q) (-) (-) ] % 16
[ (R) (r) (.) (.) ] % 17
[ (S) (s) ($) ($) ] % 18
[ (T) (t) (/) (/) ] % 19
[ (U) (u) (+) (") ] % 20
[ (V) (v) (%) (|) ] % 21
[ (W) (w) (*) (*) ] % 22
[ (X) (x) (=) 40 ] % 23
[ (Y) (y) (^) 41 ] % 24
[ (Z) (z) pl (?) ] % 25
[ ( ) ( ) ( ) ({) ] % 26
[ ll as ll (}) ] % 27
[ ml ml al (') ] % 28
[ ps ps ps al ] % 29
] def
 
% Invert charmaps to give character to value maps for each state
/charvals [ 30 dict 30 dict 30 dict 30 dict ] def
/alltext 104 dict def
0 1 charmaps length 1 sub {
/i exch def
/encs charmaps i get def
0 1 3 {
/j exch def
encs j get dup type /stringtype eq {0 get} if % convert string to ASCII if required
dup charvals j get exch i put
alltext exch -1 put
} for
} for
 
/e 10000 def % "Empty"
 
/latlen [ % Bit length of latch between submodes
% To: A L M P From
[ 0 1 1 2 ] % A
[ 2 0 1 2 ] % L
[ 1 1 0 1 ] % M
[ 1 2 2 0 ] % P
] def
 
/latseq [ % Latch sequences between submodes
% To: A L M P From
[ [] [ll] [ml] [ml pl] ] % A
[ [ml al] [] [ml] [ml pl] ] % L
[ [al] [ll] [] [pl] ] % M
[ [al] [al ll] [al ml] [] ] % P
] def
 
/shftlen [ % Bit length of shift to submode
% To: A L M P From
[ e e e 1 ] % A
[ 1 e e 1 ] % L
[ e e e 1 ] % M
[ e e e e ] % P
] def
 
/latchcws <<
tl 900 bl 901 bl6 924 nl 902 bs 913
>> def
} ctxdef
 
raw {/encoding (raw) def} if
 
% Convert input into array of codewords
15316,7 → 17074,7
putinterval
} if
out
} bind def
} def
 
encoding (byte) eq encoding (ccc) eq or {
/barlen barcode length def
15338,91 → 17096,6
/msg barcode fncvals //parseinput exec def
/msglen msg length def
 
% Modes and text submodes
/T 0 def /N 1 def /B 2 def
/A 0 def /L 1 def /M 2 def /P 3 def
 
% Special function characters for mode switching
/tl -1 def /nl -2 def /bl -3 def /bl6 -4 def /bs -5 def
 
% Special function characters for text mode
/al -6 def /ll -7 def /ml -8 def /pl -9 def /as -10 def /ps -11 def
 
% Character maps for each state
/charmaps [
% A L M P
[ (A) (a) (0) (;) ] % 0
[ (B) (b) (1) (<) ] % 1
[ (C) (c) (2) (>) ] % 2
[ (D) (d) (3) (@) ] % 3
[ (E) (e) (4) ([) ] % 4
[ (F) (f) (5) 92 ] % 5
[ (G) (g) (6) (]) ] % 6
[ (H) (h) (7) (_) ] % 7
[ (I) (i) (8) (`) ] % 8
[ (J) (j) (9) (~) ] % 9
[ (K) (k) (&) (!) ] % 10
[ (L) (l) 13 13 ] % 11
[ (M) (m) 9 9 ] % 12
[ (N) (n) (,) (,) ] % 13
[ (O) (o) (:) (:) ] % 14
[ (P) (p) (#) 10 ] % 15
[ (Q) (q) (-) (-) ] % 16
[ (R) (r) (.) (.) ] % 17
[ (S) (s) ($) ($) ] % 18
[ (T) (t) (/) (/) ] % 19
[ (U) (u) (+) (") ] % 20
[ (V) (v) (%) (|) ] % 21
[ (W) (w) (*) (*) ] % 22
[ (X) (x) (=) 40 ] % 23
[ (Y) (y) (^) 41 ] % 24
[ (Z) (z) pl (?) ] % 25
[ ( ) ( ) ( ) ({) ] % 26
[ ll as ll (}) ] % 27
[ ml ml al (') ] % 28
[ ps ps ps al ] % 29
] def
 
% Invert charmaps to give character to value maps for each state
/charvals [ 30 dict 30 dict 30 dict 30 dict ] def
/alltext 104 dict def
0 1 charmaps length 1 sub {
/i exch def
/encs charmaps i get def
0 1 3 {
/j exch def
encs j get dup type /stringtype eq {0 get} if % convert string to ASCII if required
dup charvals j get exch i put
alltext exch -1 put
} for
} for
 
/e 10000 def % "Empty"
 
/latlen [ % Bit length of latch between submodes
% To: A L M P From
[ 0 1 1 2 ] % A
[ 2 0 1 2 ] % L
[ 1 1 0 1 ] % M
[ 1 2 2 0 ] % P
] def
 
/latseq [ % Latch sequences between submodes
% To: A L M P From
[ [] [ll] [ml] [ml pl] ] % A
[ [ml al] [] [ml] [ml pl] ] % L
[ [al] [ll] [] [pl] ] % M
[ [al] [al ll] [al ml] [] ] % P
] def
 
/shftlen [ % Bit length of shift to submode
% To: A L M P From
[ e e e 1 ] % A
[ 1 e e 1 ] % L
[ e e e 1 ] % M
[ e e e e ] % P
] def
 
% Determine runlengths of digits
/numdigits [ msglen {0} repeat 0 ] def
/numtext [ msglen {0} repeat 0 ] def
15501,21 → 17174,17
} ifelse } ifelse } ifelse } ifelse
} loop
 
/latchcws <<
tl 900 bl 901 bl6 924 nl 902 bs 913
>> def
 
% Submode encoding functions
/enca {charvals A get exch get} bind def
/encl {charvals L get exch get} bind def
/encm {charvals M get exch get} bind def
/encp {charvals P get exch get} bind def
/enca {charvals A get exch get} def
/encl {charvals L get exch get} def
/encm {charvals M get exch get} def
/encp {charvals P get exch get} def
/textencfuncs [ /enca /encl /encm /encp ] def
 
/addtotext {
text exch l exch put
/l l 1 add def
} bind def
} def
 
/enct {
/in exch def
15646,7 → 17315,7
 
out
 
} bind def
} def
 
/encn {
/in exch def
15680,7 → 17349,7
/out [ out aload pop cwn aload pop ] def
} for
out
} bind def
} def
 
/ence {
0 get neg 1000000 sub
15693,7 → 17362,7
} {
/bwipp.pdf417badECI (PDF417 supports ECIs 000000 to 811799) //raiseerror exec
} ifelse } ifelse } ifelse
} bind def
} def
 
/encfuncs [ /enct /encn /encb ] def
 
15700,7 → 17369,7
/addtocws {
dup datcws j 3 -1 roll putinterval
length j add /j exch def
} bind def
} def
 
% Encode the sequence
/state T def /submode A def
15784,7 → 17453,7
} {
pop pop 0
} ifelse
} bind def
} def
 
% Generate the coefficients
/coeffs [ 1 k {0} repeat ] def
15816,6 → 17485,7
options /debugcws known { /bwipp.debugcws cws //raiseerror exec } if
 
% Base 10 encoding of the bar space successions for the codewords in each cluster
{
/clusters [
[
120256 125680 128380 120032 125560 128318 108736 119920 108640 86080 108592 86048
16056,6 → 17726,7
67476 69556 67474 69554 116714
]
] def
} ctxdef
 
% Return the 17 bits for a codeword in a given cluster
/cwtobits {
16062,7 → 17733,7
clusters exch get exch get /v exch def
[ 17 {0} repeat v 2 17 string cvrs {48 sub} forall ]
dup length 17 sub 17 getinterval
} bind def
} def
 
% Populate bitmap for the image
compact {
16115,6 → 17786,8
 
dontdraw not //renmatrix if
 
//unloadctx exec
 
end
 
}
16128,15 → 17801,15
% --END ENCODER pdf417--
 
% --BEGIN ENCODER pdf417compact--
% --REQUIRES preamble raiseerror parseinput renmatrix pdf417--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix pdf417--
% --DESC: Compact PDF417
% --EXAM: This is compact PDF417
% --EXOP: columns=2
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp pdf417compact 0.0 2021092800 53355 56790
%%BeginData: 45 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp pdf417compact 0.0 2022072900 62537 62412
%%BeginData: 46 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
dup /pdf417 dup /uk.co.terryburton.bwipp findresource put
16148,6 → 17821,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
 
% Parse the input options
16185,15 → 17859,17
% --END ENCODER pdf417compact--
 
% --BEGIN ENCODER micropdf417--
% --REQUIRES preamble raiseerror parseinput renmatrix--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix--
% --DESC: MicroPDF417
% --EXAM: MicroPDF417
% --EXOP:
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp micropdf417 0.0 2021092800 207257 212591
%%BeginData: 982 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp micropdf417 0.0 2022072900 212812 225269
%%BeginData: 998 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
16205,6 → 17881,7
/options exch def
/barcode exch def
 
/ctx null def
/dontdraw false def
/version (unset) def
/columns 0 def
16238,6 → 17915,95
/rows rows cvi def
/rowmult rowmult cvr def
 
/micropdf417 //loadctx exec
 
{
% Modes and text submodes
/T 0 def /N 1 def /B 2 def
/A 0 def /L 1 def /M 2 def /P 3 def
 
% Special function characters for mode switching
/tl -1 def /nl -2 def /bl -3 def /bl6 -4 def /bs -5 def
 
% Special function characters for text mode
/al -6 def /ll -7 def /ml -8 def /pl -9 def /as -10 def /ps -11 def
 
% Character maps for each state
/charmaps [
% A L M P
[ (A) (a) (0) (;) ] % 0
[ (B) (b) (1) (<) ] % 1
[ (C) (c) (2) (>) ] % 2
[ (D) (d) (3) (@) ] % 3
[ (E) (e) (4) ([) ] % 4
[ (F) (f) (5) 92 ] % 5
[ (G) (g) (6) (]) ] % 6
[ (H) (h) (7) (_) ] % 7
[ (I) (i) (8) (`) ] % 8
[ (J) (j) (9) (~) ] % 9
[ (K) (k) (&) (!) ] % 10
[ (L) (l) 13 13 ] % 11
[ (M) (m) 9 9 ] % 12
[ (N) (n) (,) (,) ] % 13
[ (O) (o) (:) (:) ] % 14
[ (P) (p) (#) 10 ] % 15
[ (Q) (q) (-) (-) ] % 16
[ (R) (r) (.) (.) ] % 17
[ (S) (s) ($) ($) ] % 18
[ (T) (t) (/) (/) ] % 19
[ (U) (u) (+) (") ] % 20
[ (V) (v) (%) (|) ] % 21
[ (W) (w) (*) (*) ] % 22
[ (X) (x) (=) 40 ] % 23
[ (Y) (y) (^) 41 ] % 24
[ (Z) (z) pl (?) ] % 25
[ ( ) ( ) ( ) ({) ] % 26
[ ll as ll (}) ] % 27
[ ml ml al (') ] % 28
[ ps ps ps al ] % 29
] def
 
% Invert charmaps to give character to value maps for each state
/charvals [ 30 dict 30 dict 30 dict 30 dict ] def
/alltext 104 dict def
0 1 charmaps length 1 sub {
/i exch def
/encs charmaps i get def
0 1 3 {
/j exch def
encs j get dup type /stringtype eq {0 get} if % convert string to ASCII if required
dup charvals j get exch i put
alltext exch -1 put
} for
} for
 
/e 10000 def % "Empty"
 
/latlen [ % Bit length of latch between submodes
% To: A L M P From
[ 0 1 1 2 ] % A
[ 2 0 1 2 ] % L
[ 1 1 0 1 ] % M
[ 1 2 2 0 ] % P
] def
 
/latseq [ % Latch sequences between submodes
% To: A L M P From
[ [] [ll] [ml] [ml pl] ] % A
[ [ml al] [] [ml] [ml pl] ] % L
[ [al] [ll] [] [pl] ] % M
[ [al] [al ll] [al ml] [] ] % P
] def
 
/shftlen [ % Bit length of shift to submode
% To: A L M P From
[ e e e 1 ] % A
[ 1 e e 1 ] % L
[ e e e 1 ] % M
[ e e e e ] % P
] def
} ctxdef
 
raw {/encoding (raw) def} if
cca {/encoding (cca) def} if
 
16291,7 → 18057,7
putinterval
} if
out
} bind def
} def
 
encoding (byte) eq encoding (ccb) eq or {
/barlen barcode length def
16313,91 → 18079,6
/msg barcode fncvals //parseinput exec def
/msglen msg length def
 
% Modes and text submodes
/T 0 def /N 1 def /B 2 def
/A 0 def /L 1 def /M 2 def /P 3 def
 
% Special function characters for mode switching
/tl -1 def /nl -2 def /bl -3 def /bl6 -4 def /bs -5 def
 
% Special function characters for text mode
/al -6 def /ll -7 def /ml -8 def /pl -9 def /as -10 def /ps -11 def
 
% Character maps for each state
/charmaps [
% A L M P
[ (A) (a) (0) (;) ] % 0
[ (B) (b) (1) (<) ] % 1
[ (C) (c) (2) (>) ] % 2
[ (D) (d) (3) (@) ] % 3
[ (E) (e) (4) ([) ] % 4
[ (F) (f) (5) 92 ] % 5
[ (G) (g) (6) (]) ] % 6
[ (H) (h) (7) (_) ] % 7
[ (I) (i) (8) (`) ] % 8
[ (J) (j) (9) (~) ] % 9
[ (K) (k) (&) (!) ] % 10
[ (L) (l) 13 13 ] % 11
[ (M) (m) 9 9 ] % 12
[ (N) (n) (,) (,) ] % 13
[ (O) (o) (:) (:) ] % 14
[ (P) (p) (#) 10 ] % 15
[ (Q) (q) (-) (-) ] % 16
[ (R) (r) (.) (.) ] % 17
[ (S) (s) ($) ($) ] % 18
[ (T) (t) (/) (/) ] % 19
[ (U) (u) (+) (") ] % 20
[ (V) (v) (%) (|) ] % 21
[ (W) (w) (*) (*) ] % 22
[ (X) (x) (=) 40 ] % 23
[ (Y) (y) (^) 41 ] % 24
[ (Z) (z) pl (?) ] % 25
[ ( ) ( ) ( ) ({) ] % 26
[ ll as ll (}) ] % 27
[ ml ml al (') ] % 28
[ ps ps ps al ] % 29
] def
 
% Invert charmaps to give character to value maps for each state
/charvals [ 30 dict 30 dict 30 dict 30 dict ] def
/alltext 104 dict def
0 1 charmaps length 1 sub {
/i exch def
/encs charmaps i get def
0 1 3 {
/j exch def
encs j get dup type /stringtype eq {0 get} if % convert string to ASCII if required
dup charvals j get exch i put
alltext exch -1 put
} for
} for
 
/e 10000 def % "Empty"
 
/latlen [ % Bit length of latch between submodes
% To: A L M P From
[ 0 1 1 2 ] % A
[ 2 0 1 2 ] % L
[ 1 1 0 1 ] % M
[ 1 2 2 0 ] % P
] def
 
/latseq [ % Latch sequences between submodes
% To: A L M P From
[ [] [ll] [ml] [ml pl] ] % A
[ [ml al] [] [ml] [ml pl] ] % L
[ [al] [ll] [] [pl] ] % M
[ [al] [al ll] [al ml] [] ] % P
] def
 
/shftlen [ % Bit length of shift to submode
% To: A L M P From
[ e e e 1 ] % A
[ 1 e e 1 ] % L
[ e e e 1 ] % M
[ e e e e ] % P
] def
 
% Determine runlengths of digits
/numdigits [ msglen {0} repeat 0 ] def
/numtext [ msglen {0} repeat 0 ] def
16481,16 → 18162,16
>> def
 
% Submode encoding functions
/enca {charvals A get exch get} bind def
/encl {charvals L get exch get} bind def
/encm {charvals M get exch get} bind def
/encp {charvals P get exch get} bind def
/enca {charvals A get exch get} def
/encl {charvals L get exch get} def
/encm {charvals M get exch get} def
/encp {charvals P get exch get} def
/textencfuncs [ /enca /encl /encm /encp ] def
 
/addtotext {
text exch l exch put
/l l 1 add def
} bind def
} def
 
/enct {
 
16622,7 → 18303,7
 
out
 
} bind def
} def
 
/encn {
/in exch def
16656,7 → 18337,7
/out [ out aload pop cwn aload pop ] def
} for
out
} bind def
} def
 
/ence {
0 get neg 1000000 sub
16669,7 → 18350,7
} {
/bwipp.pdf417badECI (PDF417 supports ECIs 000000 to 811799) //raiseerror exec
} ifelse } ifelse } ifelse
} bind def
} def
 
/encfuncs [ /enct /encn /encb ] def
 
16676,7 → 18357,7
/addtocws {
dup datcws j 3 -1 roll putinterval
length j add /j exch def
} bind def
} def
 
% Encode the sequence
% No need to set state as seq will always begin with a latch, unlike for pdf417
16705,9 → 18386,32
/datcws datcws 0 j getinterval def
} if
 
{
% Basic metrics for the each symbol
% c r ecw rl rc rr
/metrics [
/ccametrics [
[ 2 5 4 39 0 19 ]
[ 2 6 4 1 0 33 ]
[ 2 7 5 32 0 12 ]
[ 2 8 5 8 0 40 ]
[ 2 9 6 14 0 46 ]
[ 2 10 6 43 0 23 ]
[ 2 12 7 20 0 52 ]
[ 3 4 4 11 43 23 ]
[ 3 5 5 1 33 13 ]
[ 3 6 6 5 37 17 ]
[ 3 7 7 15 47 27 ]
[ 3 8 7 21 1 33 ]
[ 4 3 4 40 20 52 ]
[ 4 4 5 43 23 3 ]
[ 4 5 6 46 26 6 ]
[ 4 6 7 34 14 46 ]
[ 4 7 8 29 9 41 ]
] def
 
% Basic metrics for the each symbol
% c r ecw rl rc rr
/nonccametrics [
[ 1 11 7 1 0 9 ]
[ 1 14 7 8 0 8 ]
[ 1 17 7 36 0 36 ]
16743,29 → 18447,9
[ 4 38 44 15 31 47 ]
[ 4 44 50 1 25 49 ]
] def
} ctxdef
 
% Basic metrics for the each symbol
% c r ecw rl rc rr
/ccametrics [
[ 2 5 4 39 0 19 ]
[ 2 6 4 1 0 33 ]
[ 2 7 5 32 0 12 ]
[ 2 8 5 8 0 40 ]
[ 2 9 6 14 0 46 ]
[ 2 10 6 43 0 23 ]
[ 2 12 7 20 0 52 ]
[ 3 4 4 11 43 23 ]
[ 3 5 5 1 33 13 ]
[ 3 6 6 5 37 17 ]
[ 3 7 7 15 47 27 ]
[ 3 8 7 21 1 33 ]
[ 4 3 4 40 20 52 ]
[ 4 4 5 43 23 3 ]
[ 4 5 6 46 26 6 ]
[ 4 6 7 34 14 46 ]
[ 4 7 8 29 9 41 ]
] def
cca {/metrics ccametrics def} if
/metrics cca {ccametrics} {nonccametrics} ifelse def
 
% Select metrics of an appropriate symbol
/urows rows def
16797,9 → 18481,11
cws n [ k {0} repeat 0 ] putinterval
 
% Calculate the log and anti-log tables
{
/rsalog [ 1 928 {dup 3 mul 929 mod} repeat ] def
/rslog 929 array def
1 1 928 {dup rsalog exch get exch rslog 3 1 roll put} for
} ctxdef
 
% Function to calculate the product in the field
/rsprod {
16808,7 → 18494,7
} {
pop pop 0
} ifelse
} bind def
} def
 
% Generate the coefficients
/coeffs [ 1 k {0} repeat ] def
16839,6 → 18525,7
 
options /debugcws known { /bwipp.debugcws cws //raiseerror exec } if
 
{
% Base 10 encoding of the bar space successions for the codewords in each cluster
/clusters [
[
17095,6 → 18782,7
654 652 668 664 696 688 656 720 592 600 604 732 734
]
] def
} ctxdef
 
% Return the 17 bits for a codeword in a given cluster
/cwtobits {
17101,7 → 18789,7
clusters exch get exch get /v exch def
[ 17 {0} repeat v 2 17 string cvrs {48 sub} forall ]
dup length 17 sub 17 getinterval
} bind def
} def
 
% Return the 10 bits for a row address pattern
/raptobits {
17108,7 → 18796,7
raps exch get exch get /v exch def
[ 10 {0} repeat v 2 10 string cvrs {48 sub} forall ]
dup length 10 sub 10 getinterval
} bind def
} def
 
% Populate bitmap for the image
/rwid [38 55 82 99] c 1 sub get def
17166,6 → 18854,8
 
dontdraw not //renmatrix if
 
//unloadctx exec
 
end
 
}
17179,15 → 18869,17
% --END ENCODER micropdf417--
 
% --BEGIN ENCODER datamatrix--
% --REQUIRES preamble raiseerror parseinput renmatrix--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix--
% --DESC: Data Matrix
% --EXAM: This is Data Matrix!
% --EXOP:
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp datamatrix 0.0 2021092800 208367 234349
%%BeginData: 920 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp datamatrix 0.0 2022072900 213397 242547
%%BeginData: 934 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
17199,6 → 18891,7
/options exch def
/barcode exch def
 
/ctx null def
/dontdraw false def
/columns 0 def
/rows 0 def
17235,6 → 18928,9
 
/isodmre dmre def
 
/datamatrix //loadctx exec
 
% TODO make this "static"
% Basic metrics for the each symbol
% rows cols regh regv rscw rsbl
/metrics [
17324,6 → 19020,119
} if
} for
 
{
% Special characters
/fnc1 -1 def /prog -2 def /m05 -3 def /m06 -4 def
/lC -5 def /lB -6 def /lX -7 def /lT -8 def /lE -9 def /unl -10 def
/sapp -11 def /usft -12 def /sft1 -13 def /sft2 -14 def /sft3 -15 def /eci -16 def /pad -17 def
/unlcw 254 def
 
/Avals <<
0 1 128 {dup 1 add} for
pad 129
0 1 99 { % Double digits
dup 10 2 string cvrs (00) 2 string copy dup 2 3 index length sub 4 -1 roll putinterval
exch 130 add
} for
229 [ lC lB fnc1 sapp prog usft m05 m06 lX lT lE eci ] {exch 1 add dup} forall pop
>> def
/Avals <<
Avals {[exch]} forall
>> def
 
/CNvals <<
sft1 0
sft2 1
sft3 2
32 3
48 1 57 {dup 44 sub} for % 0-9
65 1 90 {dup 51 sub} for % A-Z
>> def
/C1vals << 0 1 31 {dup} for >> def
/C2vals <<
33 1 47 {dup 33 sub} for
58 1 64 {dup 43 sub} for
91 1 95 {dup 69 sub} for
fnc1 27
usft 30
>> def
/C3vals << 96 1 127 {dup 96 sub} for >> def
/Cvals <<
CNvals {[exch]} forall
C1vals {[exch CNvals sft1 get exch]} forall
C2vals {[exch CNvals sft2 get exch]} forall
C3vals {[exch CNvals sft3 get exch]} forall
>> def
 
/TNvals <<
sft1 0
sft2 1
sft3 2
32 3
48 1 57 {dup 44 sub} for % 0-9
97 1 122 {dup 83 sub} for % a-z
>> def
/T1vals << 0 1 31 {dup} for >> def
/T2vals <<
33 1 47 {dup 33 sub} for
58 1 64 {dup 43 sub} for
91 1 95 {dup 69 sub} for
fnc1 27
usft 30
>> def
/T3vals <<
96 0
65 1 90 {dup 64 sub} for
123 1 127 {dup 96 sub} for
>> def
/Tvals <<
TNvals {[exch]} forall
T1vals {[exch TNvals sft1 get exch]} forall
T2vals {[exch TNvals sft2 get exch]} forall
T3vals {[exch TNvals sft3 get exch]} forall
>> def
 
% Extended ASCII mappings
128 1 255 {
/i exch def
Avals i [ Avals usft get aload pop Avals i 128 sub get aload pop ] put
Cvals i [ Cvals usft get aload pop Cvals i 128 sub get aload pop ] put
Tvals i [ Tvals usft get aload pop Tvals i 128 sub get aload pop ] put
} for
 
/Xvals <<
13 0
42 1
62 2
32 3
48 1 57 {dup 44 sub} for
65 1 90 {dup 51 sub} for
>> def
/Xvals <<
Xvals {[exch]} forall
>> def
 
/Evals <<
64 1 94 {dup 64 sub} for
unl 31
32 1 63 {dup} for
>> def
/Evals <<
Evals {[exch]} forall
>> def
 
/Bvals <<
0 1 255 {dup} for
>> def
/Bvals <<
Bvals {[exch]} forall
>> def
 
/encvals [ Avals Cvals Tvals Xvals Evals Bvals ] def
 
/A 0 def /C 1 def /T 2 def /X 3 def /E 4 def /B 5 def
} ctxdef
 
raw {/encoding (raw) def} if
 
encoding (raw) eq {
17341,12 → 19150,6
 
encoding (auto) eq {
 
% Special characters
/fnc1 -1 def /prog -2 def /m05 -3 def /m06 -4 def
/lC -5 def /lB -6 def /lX -7 def /lT -8 def /lE -9 def /unl -10 def
/sapp -11 def /usft -12 def /sft1 -13 def /sft2 -14 def /sft3 -15 def /eci -16 def /pad -17 def
/unlcw 254 def
 
% Parse the input
/fncvals <<
/parse parse
17379,109 → 19182,6
} if
/msglen msg length def
 
/Avals <<
0 1 128 {dup 1 add} for
pad 129
0 1 99 { % Double digits
dup 10 2 string cvrs (00) 2 string copy dup 2 3 index length sub 4 -1 roll putinterval
exch 130 add
} for
229 [ lC lB fnc1 sapp prog usft m05 m06 lX lT lE eci ] {exch 1 add dup} forall pop
>> def
/Avals <<
Avals {[exch]} forall
>> def
 
/CNvals <<
sft1 0
sft2 1
sft3 2
32 3
48 1 57 {dup 44 sub} for % 0-9
65 1 90 {dup 51 sub} for % A-Z
>> def
/C1vals << 0 1 31 {dup} for >> def
/C2vals <<
33 1 47 {dup 33 sub} for
58 1 64 {dup 43 sub} for
91 1 95 {dup 69 sub} for
fnc1 27
usft 30
>> def
/C3vals << 96 1 127 {dup 96 sub} for >> def
/Cvals <<
CNvals {[exch]} forall
C1vals {[exch CNvals sft1 get exch]} forall
C2vals {[exch CNvals sft2 get exch]} forall
C3vals {[exch CNvals sft3 get exch]} forall
>> def
 
/TNvals <<
sft1 0
sft2 1
sft3 2
32 3
48 1 57 {dup 44 sub} for % 0-9
97 1 122 {dup 83 sub} for % a-z
>> def
/T1vals << 0 1 31 {dup} for >> def
/T2vals <<
33 1 47 {dup 33 sub} for
58 1 64 {dup 43 sub} for
91 1 95 {dup 69 sub} for
fnc1 27
usft 30
>> def
/T3vals <<
96 0
65 1 90 {dup 64 sub} for
123 1 127 {dup 96 sub} for
>> def
/Tvals <<
TNvals {[exch]} forall
T1vals {[exch TNvals sft1 get exch]} forall
T2vals {[exch TNvals sft2 get exch]} forall
T3vals {[exch TNvals sft3 get exch]} forall
>> def
 
% Extended ASCII mappings
128 1 255 {
/i exch def
Avals i [ Avals usft get aload pop Avals i 128 sub get aload pop ] put
Cvals i [ Cvals usft get aload pop Cvals i 128 sub get aload pop ] put
Tvals i [ Tvals usft get aload pop Tvals i 128 sub get aload pop ] put
} for
 
/Xvals <<
13 0
42 1
62 2
32 3
48 1 57 {dup 44 sub} for
65 1 90 {dup 51 sub} for
>> def
/Xvals <<
Xvals {[exch]} forall
>> def
 
/Evals <<
64 1 94 {dup 64 sub} for
unl 31
32 1 63 {dup} for
>> def
/Evals <<
Evals {[exch]} forall
>> def
 
/Bvals <<
0 1 255 {dup} for
>> def
/Bvals <<
Bvals {[exch]} forall
>> def
 
/encvals [ Avals Cvals Tvals Xvals Evals Bvals ] def
 
/numD [ msglen {0} repeat 0 ] def
/nextXterm [ msglen {0} repeat 9999 ] def
/nextNonX [ msglen {0} repeat 9999 ] def
17507,17 → 19207,15
/nextXterm [nextXterm {dup 10000 gt {pop 10000} if} forall] def
/nextNonX [nextNonX {dup 10000 gt {pop 10000} if} forall] def
 
/isD {char 48 ge char 57 le and} bind def
/isC {CNvals char known} bind def
/isT {TNvals char known} bind def
/isX {Xvals char known} bind def
/isE {Evals char known} bind def
/isEA {char 127 gt} bind def
/isFN {char 0 lt} bind def
/XtermFirst {dup nextXterm exch get exch nextNonX exch get lt} bind def
/isD {char 48 ge char 57 le and} def
/isC {CNvals char known} def
/isT {TNvals char known} def
/isX {Xvals char known} def
/isE {Evals char known} def
/isEA {char 127 gt} def
/isFN {char 0 lt} def
/XtermFirst {dup nextXterm exch get exch nextNonX exch get lt} def
 
/A 0 def /C 1 def /T 2 def /X 3 def /E 4 def /B 5 def
 
/lookup {
/ac 1 def /cc 2 def /tc 2 def /xc 2 def /ec 2 def /bc 2.25 def
mode A eq {/ac 0 def /cc 1 def /tc 1 def /xc 1 def /ec 1 def /bc 1.25 def} if
17561,12 → 19259,12
/k k 1 add def
} loop
} repeat
} bind def
} def
 
/addtocws {
dup cws exch j exch putinterval
/j exch length j add def
} bind def
} def
 
/ECItocws {
neg 1000000 sub
17585,7 → 19283,7
254 mod 1 add
3 array astore
} ifelse } ifelse
} bind def
} def
 
/encA {
1 { % Common exit
17610,7 → 19308,7
/i i 1 add def
exit
} repeat
} bind def
} def
 
/CTXvalstocws {
/in exch def
17620,7 → 19318,7
dup 256 idiv exch 256 mod
} for
counttomark array astore exch pop
} bind def
} def
 
/encCTX {
/p 0 def
17632,16 → 19330,18
i msglen eq {exit} if
encvals mode get msg i get known not {exit} if
p 3 mod 0 eq {
/newmode lookup def
newmode mode ne {
ctxvals 0 p getinterval CTXvalstocws addtocws
[unlcw] addtocws
newmode A ne {
Avals [-1 lC lT lX lE lB] newmode get get addtocws
p 0 gt {
/newmode lookup def
newmode mode ne {
ctxvals 0 p getinterval CTXvalstocws addtocws
[unlcw] addtocws
newmode A ne {
Avals [-1 lC lT lX lE lB] newmode get get addtocws
} if
/mode newmode def
/done true def
exit
} if
/mode newmode def
/done true def
exit
} if
msglen i sub 3 le { % Check end of data conditions
/remcws numremcws j p 3 idiv 2 mul add get def
17728,7 → 19428,7
} if
} if
 
} bind def
} def
 
/Evalstocws {
/in exch def
17744,7 → 19444,7
} for
counttomark array astore exch pop
0 outlen getinterval
} bind def
} def
 
/encE {
/p 0 def
17801,7 → 19501,7
} if
} if
 
} bind def
} def
 
/encB {
/p 0 def /bvals 1558 array def {
17828,7 → 19528,7
} for
bvals addtocws
/mode A def
} bind def
} def
 
% Derive the codewords
/cws 1558 array def
17899,9 → 19599,11
} for
 
% Calculate the log and anti-log tables
{
/rsalog [ 1 255 { dup 2 mul dup 256 ge {301 xor} if } repeat ] def
/rslog 256 array def
1 1 255 {dup rsalog exch get exch rslog 3 1 roll put} for
} ctxdef
 
% Function to calculate the product in the field
/rsprod {
17910,7 → 19612,7
} {
pop pop 0
} ifelse
} bind def
} def
 
% Generate the coefficients
/coeffs [ 1 rscw rsbl idiv {0} repeat ] def
17978,7 → 19680,7
exch mcols mul add
mmat exch 5 -1 roll put
} forall
} bind def
} def
 
% Placement patterns
/dmn [
18098,6 → 19800,8
 
dontdraw not //renmatrix if
 
//unloadctx exec
 
end
 
}
18111,15 → 19815,15
% --END ENCODER datamatrix--
 
% --BEGIN ENCODER datamatrixrectangular--
% --REQUIRES preamble raiseerror parseinput renmatrix datamatrix--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix datamatrix--
% --DESC: Data Matrix Rectangular
% --EXAM: 1234
% --EXOP:
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp datamatrixrectangular 0.0 2021092800 53411 56710
%%BeginData: 45 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp datamatrixrectangular 0.0 2022072900 62593 62460
%%BeginData: 46 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
dup /datamatrix dup /uk.co.terryburton.bwipp findresource put
18131,6 → 19835,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
 
% Parse the input options
18168,15 → 19873,15
% --END ENCODER datamatrixrectangular--
 
% --BEGIN ENCODER datamatrixrectangularextension--
% --REQUIRES preamble raiseerror parseinput renmatrix datamatrix--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix datamatrix--
% --DESC: Data Matrix Rectangular Extension
% --EXAM: 1234
% --EXOP: version=8x96
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp datamatrixrectangularextension 0.0 2021092800 54318 57584
%%BeginData: 55 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp datamatrixrectangularextension 0.0 2022072900 63780 63742
%%BeginData: 56 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
20 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
dup /datamatrix dup /uk.co.terryburton.bwipp findresource put
18188,6 → 19893,7
/options exch def
/barcode exch def
 
/ctx null def
/dontdraw false def
 
/dmre false def
18235,15 → 19941,15
% --END ENCODER datamatrixrectangularextension--
 
% --BEGIN ENCODER mailmark--
% --REQUIRES preamble raiseerror parseinput renmatrix datamatrix--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix datamatrix--
% --DESC: Royal Mail Mailmark
% --EXAM: JGB 012100123412345678AB19XY1A 0 www.xyz.com
% --EXOP: type=29
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp mailmark 0.0 2021092800 56791 60248
%%BeginData: 80 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp mailmark 0.0 2022072900 65973 66022
%%BeginData: 81 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
18256,6 → 19962,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/type (unset) def % 7, 9 or 29
/parse false def
/dontdraw false def
18327,15 → 20034,17
% --END ENCODER mailmark--
 
% --BEGIN ENCODER qrcode--
% --REQUIRES preamble raiseerror parseinput renmatrix--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix--
% --DESC: QR Code
% --EXAM: http://goo.gl/0bis
% --EXOP: eclevel=M
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp qrcode 0.0 2021092800 320203 358349
%%BeginData: 1306 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp qrcode 0.0 2022072900 327547 368583
%%BeginData: 1362 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
18347,6 → 20056,7
/options exch def
/barcode exch def
 
/ctx null def
/dontdraw false def
/format (unset) def % full or micro. rMQR symbols are specified using version
/version (unset) def % 1-40 or M1-M4 or R7x43, etc
18368,6 → 20078,8
 
/mask mask cvi def
 
/qrcode //loadctx exec
 
% If version is supplied and format is not given then set format to correspond
version (unset) ne {
format (unset) eq {
18404,6 → 20116,8
} if
} if
 
{ % context
 
% Enumerate vergrps
[
/v1to9 /v10to26 /v27to40
18436,15 → 20150,7
] {-1} forall
>> def
 
/Bexcl <<
[
16#00 1 16#1F {} for
16#21 16#22 16#23 16#26 16#27 16#28 16#29 16#2C
16#3B 1 16#40 {} for
16#5B 1 16#7F {} for
16#A0 1 16#DF {} for
] {-1} forall
>> def
% Binary exclusives calculated from "not others"
 
/Kexcl <<
[
18463,7 → 20169,7
[ (00) (01) (10) (11) -1 ] % vM3
[ (000) (001) (010) (011) -1 ] % vM4
32 {
[ (001) (010) (011) (100) -1 ] % rMQR
[ (001) (010) (011) (100) (111) ] % rMQR
} repeat
] def
 
18494,7 → 20200,7
[ 5 5 4 3 ] % vR13x27
[ 6 6 5 5 ] % vR13x43
[ 7 6 6 5 ] % vR13x59
[ 8 7 6 6 ] % vR13x77
[ 7 7 6 6 ] % vR13x77
[ 8 7 7 6 ] % vR13x99
[ 8 8 7 7 ] % vR13x139
[ 7 6 6 5 ] % vR15x43
18522,11 → 20228,7
} repeat
] def
 
% Encoding functions
/tobin {
string dup length 1 sub 0 exch 1 exch {1 index exch 48 put} for
dup 3 -1 roll 2 2 index length string cvrs dup length 2 index length exch sub exch putinterval
} bind def
/padstrs [ (11101100) (00010001) ] def
 
% Alphanumeric character to value map
/charmap (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:) def
18533,6 → 20235,14
/charvals 44 dict def
0 1 44 {dup charmap exch get exch charvals 3 1 roll put} for
 
} ctxdef
 
% Encoding functions
/tobin {
string dup length 1 sub 0 exch 1 exch {1 index exch 48 put} for
dup 3 -1 roll 2 2 index length string cvrs dup length 2 index length exch sub exch putinterval
} def
 
/encA {
/in exch def
fnc1first { % FNC1 as %
18552,7 → 20262,7
length m add /m exch def
} loop
out 0 m getinterval
} bind def
} def
 
/encN {
/in exch def
18575,7 → 20285,7
length m add /m exch def
} loop
out 0 m getinterval
} bind def
} def
 
/encB {
/in exch def
18589,7 → 20299,7
out k 8 mul 3 -1 roll putinterval
} for
out
} bind def
} def
 
/encK {
/in exch def
18604,7 → 20314,7
/k k 2 add def
} loop
out
} bind def
} def
 
/encE {
0 get neg 1000000 sub
18615,7 → 20325,7
} { % ECI 016384 - 999999
2#110000000000000000000000 add 24 tobin
} ifelse } ifelse
} bind def
} def
 
/encfuncs [ /encN /encA /encB /encK /encE ] def
 
18622,7 → 20332,7
/addtobits {
dup bits j 3 -1 roll putinterval
length j add /j exch def
} bind def
} def
 
/numNs [ msglen {0} repeat 0 ] def
/numAs [ msglen {0} repeat 0 ] def
18632,7 → 20342,6
/nextBs [ msglen {0} repeat 9999 ] def
/nextAs [ msglen {0} repeat 9999 ] def
/nextKs [ msglen {0} repeat 9999 ] def
/numAN 0 def % Inclusive alphanumeric count (for rMQR only)
/isECI msglen array def
msglen 1 sub -1 0 {
/i exch def
18651,20 → 20360,12
Nexcl barchar known {
nextNs i 0 put
numNs i numNs i 1 add get 1 add put
/numAN numAN 1 add def
} {
nextNs i nextNs i 1 add get 1 add put
} ifelse
Bexcl barchar known {
nextBs i 0 put
numBs i numBs i 1 add get 1 add put
} {
nextBs i nextBs i 1 add get 1 add put
} ifelse
Aexcl barchar known {
nextAs i 0 put
numAs i numAs i 1 add get 1 add put
/numAN numAN 1 add def
} {
nextAs i nextAs i 1 add get 1 add put
} ifelse
18677,19 → 20378,28
nextKs i 1 add nextKs i 1 add get 1 add put
} if
} for
msglen 1 sub -1 0 { % Finally scan backwards again to set numBs/nextBs from "not others"
/i exch def
numNs i get numAs i get numKs i get add add 0 eq isECI i get not and {
nextBs i 0 put
numBs i numBs i 1 add get 1 add put
} {
nextBs i nextBs i 1 add get 1 add put
} ifelse
} for
 
/KbeforeB {numK exch ver get ge nextBs numK 2 mul i add get 0 eq and} bind def
/KbeforeA {numK exch ver get ge nextAs numK 2 mul i add get 0 eq and} bind def
/KbeforeN {numK exch ver get ge nextNs numK 2 mul i add get 0 eq and} bind def
/KbeforeE {numK exch ver get ge numK 2 mul i add msglen eq and} bind def
/AbeforeK {numA exch ver get ge nextKs numA i add get 0 eq and} bind def
/AbeforeB {numA exch ver get ge nextBs numA i add get 0 eq and} bind def
/AbeforeN {numA exch ver get ge nextNs numA i add get 0 eq and} bind def
/AbeforeE {numA exch ver get ge numA i add msglen eq and} bind def
/NbeforeK {numN exch ver get ge nextKs numN i add get 0 eq and} bind def
/NbeforeB {numN exch ver get ge nextBs numN i add get 0 eq and} bind def
/NbeforeA {numN exch ver get ge nextAs numN i add get 0 eq and} bind def
/NbeforeE {numN exch ver get ge numN i add msglen eq and} bind def
/KbeforeB {numK exch ver get ge nextBs numK 2 mul i add get 0 eq and} def
/KbeforeA {numK exch ver get ge nextAs numK 2 mul i add get 0 eq and} def
/KbeforeN {numK exch ver get ge nextNs numK 2 mul i add get 0 eq and} def
/KbeforeE {numK exch ver get ge numK 2 mul i add msglen eq and} def
/AbeforeK {numA exch ver get ge nextKs numA i add get 0 eq and} def
/AbeforeB {numA exch ver get ge nextBs numA i add get 0 eq and} def
/AbeforeN {numA exch ver get ge nextNs numA i add get 0 eq and} def
/AbeforeE {numA exch ver get ge numA i add msglen eq and} def
/NbeforeK {numN exch ver get ge nextKs numN i add get 0 eq and} def
/NbeforeB {numN exch ver get ge nextBs numN i add get 0 eq and} def
/NbeforeA {numN exch ver get ge nextAs numN i add get 0 eq and} def
/NbeforeE {numN exch ver get ge numN i add msglen eq and} def
 
% Elements of the encoded message have differing lengths based on the
% resulting symbol size. The symbol sizes with different element lengths
18698,29 → 20408,34
% on the format of symbol.
 
% Determine which groups we need to encode
{
/versetmap <<
% Full
0 1 9 { 10 2 string cvrs v1to9 } for
10 1 26 { 10 2 string cvrs v10to26 } for
27 1 40 { 10 2 string cvrs v27to40 } for
 
% Micro
(M1) vM1 (M2) vM2 (M3) vM3 (M4) vM4
 
% rMQR
(R7x43) vR7x43 (R7x59) vR7x59 (R7x77) vR7x77 (R7x99) vR7x99 (R7x139) vR7x139
(R9x43) vR9x43 (R9x59) vR9x59 (R9x77) vR9x77 (R9x99) vR9x99 (R9x139) vR9x139
(R11x27) vR11x27 (R11x43) vR11x43 (R11x59) vR11x59 (R11x77) vR11x77 (R11x99) vR11x99 (R11x139) vR11x139
(R13x27) vR13x27 (R13x43) vR13x43 (R13x59) vR13x59 (R13x77) vR13x77 (R13x99) vR13x99 (R13x139) vR13x139
(R15x43) vR15x43 (R15x59) vR15x59 (R15x77) vR15x77 (R15x99) vR15x99 (R15x139) vR15x139
(R17x43) vR17x43 (R17x59) vR17x59 (R17x77) vR17x77 (R17x99) vR17x99 (R17x139) vR17x139
>> def
/versetfull [v1to9 v10to26 v27to40] def
/versetmicro [vM1 vM2 vM3 vM4] def
} ctxdef
version (unset) ne {
% A specific version of symbol is given so encode in just the corresponding vergrp
/verset <<
% Full
0 1 9 { 10 2 string cvrs v1to9 } for
10 1 26 { 10 2 string cvrs v10to26 } for
27 1 40 { 10 2 string cvrs v27to40 } for
 
% Micro
(M1) vM1 (M2) vM2 (M3) vM3 (M4) vM4
 
% rMQR
(R7x43) vR7x43 (R7x59) vR7x59 (R7x77) vR7x77 (R7x99) vR7x99 (R7x139) vR7x139
(R9x43) vR9x43 (R9x59) vR9x59 (R9x77) vR9x77 (R9x99) vR9x99 (R9x139) vR9x139
(R11x27) vR11x27 (R11x43) vR11x43 (R11x59) vR11x59 (R11x77) vR11x77 (R11x99) vR11x99 (R11x139) vR11x139
(R13x27) vR13x27 (R13x43) vR13x43 (R13x59) vR13x59 (R13x77) vR13x77 (R13x99) vR13x99 (R13x139) vR13x139
(R15x43) vR15x43 (R15x59) vR15x59 (R15x77) vR15x77 (R15x99) vR15x99 (R15x139) vR15x139
(R17x43) vR17x43 (R17x59) vR17x59 (R17x77) vR17x77 (R17x99) vR17x99 (R17x139) vR17x139
>> version get [ exch ] def
/verset versetmap version get [ exch ] def
} {
% Just the format is specified so encode in each vergrp for the type of symbol
format (full) eq { /verset [v1to9 v10to26 v27to40] def } if
format (micro) eq { /verset [vM1 vM2 vM3 vM4] def } if
format (full) eq { /verset versetfull def } if
format (micro) eq { /verset versetmicro def } if
% rMQR symbols are accessed with an explicit version
} ifelse
 
18727,6 → 20442,36
% Encode unterminated bitstream for each compatible vergrp separately
/msgbits [ 39 {-1} repeat ] def
/e 10000 def
 
% Number of before characters per vergrp, depending on current mode, for optimising modes
% Generated by contrib/development/build-qr-mode-optim-arrs.php
% Full Micro R7 R9 R11 R13 R15 R17
{
/mode0forceKB [ 1 1 1 e e 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1] def
/mode0forceA [ 1 1 1 e 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1] def
 
/mode0NbeforeB [ 4 4 5 e e 2 3 2 2 3 3 3 2 3 3 3 3 2 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3] def
 
/modeBKbeforeB [ 9 12 13 e e 4 6 4 5 6 6 6 5 6 6 6 7 4 6 6 6 7 7 5 6 6 7 7 7 6 6 7 7 7 6 7 7 7 8] def
/modeBKbeforeA [ 8 10 11 e e 4 5 4 5 5 6 6 5 5 6 6 6 4 5 6 6 6 6 5 6 6 6 6 7 6 6 6 6 7 6 6 6 7 7] def
/modeBKbeforeN [ 8 9 11 e e 3 5 3 4 5 5 5 4 5 5 5 6 3 5 5 5 6 6 4 5 5 6 6 6 5 5 6 6 7 5 6 6 6 7] def
/modeBKbeforeE [ 5 5 6 e e 2 3 2 3 3 3 3 3 3 3 3 4 2 3 3 3 4 4 3 3 3 4 4 4 3 3 4 4 4 3 4 4 4 4] def
 
/modeBAbeforeK [11 12 14 e e 5 7 5 6 7 8 8 6 7 8 8 8 6 7 8 8 8 8 6 8 8 8 8 9 8 8 8 8 9 8 8 8 9 9] def
/modeBAbeforeB [11 15 16 e e 6 7 6 7 7 8 8 7 7 8 8 8 6 7 8 8 8 9 7 8 8 8 9 9 8 8 9 9 9 8 8 9 9 10] def
/modeBAbeforeN [12 13 15 e e 6 8 6 7 8 8 8 7 8 8 8 9 6 8 8 8 9 9 7 8 8 9 9 10 8 9 9 9 10 8 9 9 10 10] def
/modeBAbeforeE [ 6 7 8 e e 3 4 3 4 4 4 4 4 4 4 4 5 4 4 4 4 5 5 4 4 4 5 5 5 4 5 5 5 5 4 5 5 5 5] def
 
/modeBNbeforeK [ 6 7 8 e e 3 4 3 4 4 5 5 4 4 5 5 5 3 4 5 5 5 5 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5] def
/modeBNbeforeB [ 6 8 9 e e 3 4 3 4 4 5 5 4 4 5 5 5 3 4 5 5 5 5 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 6] def
/modeBNbeforeA [ 6 7 8 e e 3 4 3 4 4 5 5 4 4 5 5 5 4 4 5 5 5 5 4 5 5 5 5 5 5 5 5 5 6 5 5 5 5 6] def
/modeBNbeforeE [ 3 4 4 e e 2 3 2 2 3 3 3 2 3 3 3 3 2 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3] def
 
/modeANbeforeA [13 15 17 e 5 7 9 7 8 9 9 9 8 9 9 9 11 7 9 9 9 11 11 8 9 9 10 11 11 9 10 11 11 11 9 11 11 11 11] def
/modeANbeforeB [13 17 18 e e 7 9 7 8 9 9 9 8 9 9 9 10 7 9 9 9 10 11 8 9 9 9 11 11 9 9 11 11 11 9 10 11 11 11] def
/modeANbeforeE [ 7 8 9 e 3 4 5 4 5 5 5 5 5 5 5 5 6 4 5 5 5 6 6 5 5 5 5 6 6 5 5 6 6 6 5 6 6 6 6] def
} ctxdef
 
verset {
/ver exch def
 
18747,54 → 20492,51
ver vM2 eq eci and {/seq -1 def exit} if
ver vM3 eq eci and {/seq -1 def exit} if
ver vM4 eq eci and {/seq -1 def exit} if
ver vR7x43 ge eci and {/seq -1 def exit} if
{ % common exit
eci {
E exit
} if
ver vR7x43 ge { % TODO rMQR is all numeric/alphanumeric/Kanji/binary only for now
numN msglen eq {N} { numAN msglen eq {A} { numK 2 mul msglen eq {K} {B} ifelse } ifelse } ifelse exit
} if
mode -1 eq { % Set initial mode (or mode after ECI)
[ 1 1 1 e e 1 1] KbeforeA {K exit} if
[ 1 1 1 e e 1 1] KbeforeN {K exit} if
[ 5 5 6 e e 2 3] KbeforeB {K exit} if
[ 1 1 1 e e 1 1] KbeforeE {K exit} if
mode0forceKB KbeforeA {K exit} if
mode0forceKB KbeforeN {K exit} if
modeBKbeforeE KbeforeB {K exit} if % Re-using modeB KbeforeE array
mode0forceKB KbeforeE {K exit} if
numK 1 ge {B exit} if
[ 6 7 8 e e 3 4] AbeforeB {A exit} if
[ 1 1 1 e 1 1 1] AbeforeN {A exit} if
[ 1 1 1 e 1 1 1] AbeforeE {A exit} if
modeBAbeforeE AbeforeK {A exit} if % Re-using modeB AbeforeE array
modeBAbeforeE AbeforeB {A exit} if % Re-using modeB AbeforeE array
mode0forceA AbeforeN {A exit} if
mode0forceA AbeforeE {A exit} if
numA 1 ge {
ver vM2 ne {B} {A} ifelse exit
} if
[ 4 4 5 e e 2 3] NbeforeB {N exit} if
[ 1 1 1 e e 1 1] NbeforeB {B exit} if
[ 7 8 9 e 3 4 5] NbeforeA {N exit} if
[ 1 1 1 e 1 1 1] NbeforeA {A exit} if
mode0NbeforeB NbeforeB {N exit} if
mode0forceKB NbeforeB {B exit} if
modeANbeforeE NbeforeA {N exit} if % Re-using modeA NbeforeE array
mode0forceA NbeforeA {A exit} if
numN 1 ge {N exit} if
B exit
} if
mode B eq {
[ 9 12 13 e e 4 5] KbeforeB {K exit} if
[ 9 10 12 e e 4 5] KbeforeA {K exit} if
[ 9 10 11 e e 5 6] KbeforeN {K exit} if
[ 4 5 6 e e 2 3] KbeforeE {K exit} if
[11 12 14 e e 5 7] AbeforeK {A exit} if
[11 15 16 e e 6 7] AbeforeB {A exit} if
[12 13 15 e e 6 8] AbeforeN {A exit} if
[ 6 7 8 e e 3 4] AbeforeE {A exit} if
[ 6 7 8 e e 3 4] NbeforeK {N exit} if
[ 6 8 9 e e 3 4] NbeforeB {N exit} if
[ 6 7 8 e e 3 4] NbeforeA {N exit} if
[ 3 4 5 e e 2 3] NbeforeE {N exit} if
modeBKbeforeB KbeforeB {K exit} if
modeBKbeforeA KbeforeA {K exit} if
modeBKbeforeN KbeforeN {K exit} if
modeBKbeforeE KbeforeE {K exit} if
modeBAbeforeK AbeforeK {A exit} if
modeBAbeforeB AbeforeB {A exit} if
modeBAbeforeN AbeforeN {A exit} if
modeBAbeforeE AbeforeE {A exit} if
modeBNbeforeK NbeforeK {N exit} if
modeBNbeforeB NbeforeB {N exit} if
modeBNbeforeA NbeforeA {N exit} if
modeBNbeforeE NbeforeE {N exit} if
B exit
} if
mode A eq {
numK 1 ge {K exit} if
numB 1 ge {B exit} if
[13 15 17 e 5 7 9] NbeforeA {N exit} if
[13 17 18 e e 7 9] NbeforeB {N exit} if
[ 7 8 9 e 3 4 5] NbeforeE {N exit} if
modeANbeforeA NbeforeA {N exit} if
modeANbeforeB NbeforeB {N exit} if
modeANbeforeE NbeforeE {N exit} if
numA 1 ge numN 1 ge or {A exit} if
B exit
} if
18866,6 → 20608,7
} forall
 
% Lookup the most appropriate symbol specification
{
/metrics [
% format vers vergrp rows cols align modules error codewords error correction blocks
% L M Q H L1 L2 M1 M2 Q1 Q2 H1 H2
18946,6 → 20689,8
[ (rmqr) (R17x99) vR17x99 17 99 24 50 1283 [ 99 60 99 104 ] [ -1 -1 2 1 -1 -1 4 0 ] ]
[ (rmqr) (R17x139) vR17x139 17 139 28 56 1860 [ 99 80 99 156 ] [ -1 -1 4 0 -1 -1 2 4 ] ]
] def
} ctxdef
 
/eclval (LMQH) eclevel search pop length exch pop exch pop def
0 1 metrics length 1 sub {
/i exch def
18988,7 → 20733,7
} for
 
okay not {
/bwipp.qrcodeNoValidSymbol (No valid symbol available) //raiseerror exec
/bwipp.qrcodeNoValidSymbol (Maximum length exceeded or invalid content) //raiseerror exec
} if
 
/format frmt def
19008,7 → 20753,6
/pad dmod string def
0 1 pad length 1 sub {pad exch 48 put} for
pad 0 msgbits putinterval
/padstrs [ (11101100) (00010001) ] def
/padnum 0 def
msgbits length 8 div ceiling 8 mul cvi 8 dmod lc4b {5} {1} ifelse sub {
pad exch padstrs padnum get putinterval
19036,9 → 20780,11
options /debugcws known { /bwipp.debugcws cws //raiseerror exec } if
 
% Calculate the log and anti-log tables
{
/rsalog [ 1 255 { dup 2 mul dup 256 ge {285 xor} if } repeat ] def
/rslog 256 array def
1 1 255 {dup rsalog exch get exch rslog 3 1 roll put} for
} ctxdef
 
% Function to calculate the product in the field
/rsprod {
19047,7 → 20793,7
} {
pop pop 0
} ifelse
} bind def
} def
 
% Generate the coefficients for the Reed-Solomon algorithm
/coeffs [ 1 ecpb {0} repeat ] def
19076,7 → 20822,7
} for
} for
rscws rsnd ecpb getinterval
} bind def
} def
 
% Divide codewords into two groups of blocks and calculate the error correction codewords
/dcwsb ecb1 ecb2 add array def
19137,7 → 20883,7
 
% Create the bitmap
/pixs [ rows cols mul {-1} repeat ] def
/qmv {cols mul add} bind def
/qmv {cols mul add} def
 
% Timing patterns
format (full) eq {
19175,6 → 20921,7
} if
 
% Finder patterns
{
/fpat [
[ 1 1 1 1 1 1 1 0 ]
[ 1 0 0 0 0 0 1 0 ]
19215,12 → 20962,14
[ 9 9 9 9 9 9 9 9 ]
[ 9 9 9 9 9 9 9 9 ]
] def
/fpats <<
/fpatmap <<
% TL TR BL BR
(full) [ fpat fpat fpat fnullpat ]
(micro) [ fpat fnullpat fnullpat fnullpat ]
(rmqr) [ fpat fcorpat fcorpat fsubpat ]
>> format get def
>> def
} ctxdef
/fpats fpatmap format get def
0 1 7 {
/y exch def
0 1 7 {
19237,6 → 20986,23
} for
 
% Alignment patterns
{
/algnpatfull [
[ 1 1 1 1 1 ]
[ 1 0 0 0 1 ]
[ 1 0 1 0 1 ]
[ 1 0 0 0 1 ]
[ 1 1 1 1 1 ]
] def
/algnpatrmqr [
[ 1 1 1 9 9 ]
[ 1 0 1 9 9 ]
[ 1 1 1 9 9 ]
[ 9 9 9 9 9 ]
[ 9 9 9 9 9 ]
] def
} ctxdef
 
/putalgnpat {
/py exch def
/px exch def
19250,15 → 21016,9
} if
} for
} for
} bind def
} def
format (full) eq {
/algnpat [
[ 1 1 1 1 1 ]
[ 1 0 0 0 1 ]
[ 1 0 1 0 1 ]
[ 1 0 0 0 1 ]
[ 1 1 1 1 1 ]
] def
/algnpat algnpatfull def
asp2 2 sub asp3 asp2 sub cols 13 sub {
/i exch def
i 4 putalgnpat
19273,13 → 21033,7
} for
} if
format (rmqr) eq {
/algnpat [
[ 1 1 1 9 9 ]
[ 1 0 1 9 9 ]
[ 1 1 1 9 9 ]
[ 9 9 9 9 9 ]
[ 9 9 9 9 9 ]
] def
/algnpat algnpatrmqr def
asp2 2 sub asp3 asp2 sub cols 13 sub {
/i exch def
i 0 putalgnpat
19288,6 → 21042,13
} if
 
% Format information modules
{
/formatmapmicro [
[ [ 1 8 ] ] [ [ 2 8 ] ] [ [ 3 8 ] ] [ [ 4 8 ] ] [ [ 5 8 ] ]
[ [ 6 8 ] ] [ [ 7 8 ] ] [ [ 8 8 ] ] [ [ 8 7 ] ] [ [ 8 6 ] ]
[ [ 8 5 ] ] [ [ 8 4 ] ] [ [ 8 3 ] ] [ [ 8 2 ] ] [ [ 8 1 ] ]
] def
} ctxdef
/formatmap <<
(full) [
[ [ 0 8 ] [ 8 cols 1 sub ] ] [ [ 1 8 ] [ 8 cols 2 sub ] ] [ [ 2 8 ] [ 8 cols 3 sub ] ]
19296,11 → 21057,7
[ [ 8 5 ] [ cols 6 sub 8 ] ] [ [ 8 4 ] [ cols 5 sub 8 ] ] [ [ 8 3 ] [ cols 4 sub 8 ] ]
[ [ 8 2 ] [ cols 3 sub 8 ] ] [ [ 8 1 ] [ cols 2 sub 8 ] ] [ [ 8 0 ] [ cols 1 sub 8 ] ]
]
(micro) [
[ [ 1 8 ] ] [ [ 2 8 ] ] [ [ 3 8 ] ] [ [ 4 8 ] ] [ [ 5 8 ] ]
[ [ 6 8 ] ] [ [ 7 8 ] ] [ [ 8 8 ] ] [ [ 8 7 ] ] [ [ 8 6 ] ]
[ [ 8 5 ] ] [ [ 8 4 ] ] [ [ 8 3 ] ] [ [ 8 2 ] ] [ [ 8 1 ] ]
]
(micro) formatmapmicro
(rmqr) [
[ [ 11 3 ] [ cols 3 sub rows 6 sub ] ] [ [ 11 2 ] [ cols 4 sub rows 6 sub ] ] [ [ 11 1 ] [ cols 5 sub rows 6 sub ] ]
[ [ 10 5 ] [ cols 6 sub rows 2 sub ] ] [ [ 10 4 ] [ cols 6 sub rows 3 sub ] ] [ [ 10 3 ] [ cols 6 sub rows 4 sub ] ]
19434,7 → 21191,7
} if
} for
scr1 scr3
} bind def
} def
 
% Evaluation algorithm for full symbols
/evalfull {
19490,7 → 21247,7
/n4 dark 100 mul cols dup mul div 50 sub abs 5 div cvi 10 mul def
 
n1 n2 add n3 add n4 add
} bind def
} def
 
% Evaluation algorithm for micro symbols
/evalmicro {
19506,7 → 21263,7
} {
dkbot 16 mul dkrhs add neg
} ifelse
} bind def
} def
 
% Evaluate the masked symbols to find the most suitable
/bestscore 999999999 def
19540,15 → 21297,43
} if
 
% Add the format information
{
/fmtvalsfull [
16#5412 16#5125 16#5e7c 16#5b4b 16#45f9 16#40ce 16#4f97 16#4aa0
16#77c4 16#72f3 16#7daa 16#789d 16#662f 16#6318 16#6c41 16#6976
16#1689 16#13be 16#1ce7 16#19d0 16#0762 16#0255 16#0d0c 16#083b
16#355f 16#3068 16#3f31 16#3a06 16#24b4 16#2183 16#2eda 16#2bed
] def
/fmtvalsmicro [
16#4445 16#4172 16#4e2b 16#4b1c 16#55ae 16#5099 16#5fc0 16#5af7
16#6793 16#62a4 16#6dfd 16#68ca 16#7678 16#734f 16#7c16 16#7921
16#06de 16#03e9 16#0cb0 16#0987 16#1735 16#1202 16#1d5b 16#186c
16#2508 16#203f 16#2f66 16#2a51 16#34e3 16#31d4 16#3e8d 16#3bba
] def
/fmtvalsrmqr1 [
16#1fab2 16#1e597 16#1dbdd 16#1c4f8 16#1b86c 16#1a749 16#19903 16#18626
16#17f0e 16#1602b 16#15e61 16#14144 16#13dd0 16#122f5 16#11cbf 16#1039a
16#0f1ca 16#0eeef 16#0d0a5 16#0cf80 16#0b314 16#0ac31 16#0927b 16#08d5e
16#07476 16#06b53 16#05519 16#04a3c 16#036a8 16#0298d 16#017c7 16#008e2
16#3f367 16#3ec42 16#3d208 16#3cd2d 16#3b1b9 16#3ae9c 16#390d6 16#38ff3
16#376db 16#369fe 16#357b4 16#34891 16#33405 16#32b20 16#3156a 16#30a4f
16#2f81f 16#2e73a 16#2d970 16#2c655 16#2bac1 16#2a5e4 16#29bae 16#2848b
16#27da3 16#26286 16#25ccc 16#243e9 16#23f7d 16#22058 16#21e12 16#20137
] def
/fmtvalsrmqr2 [
16#20a7b 16#2155e 16#22b14 16#23431 16#248a5 16#25780 16#269ca 16#276ef
16#28fc7 16#290e2 16#2aea8 16#2b18d 16#2cd19 16#2d23c 16#2ec76 16#2f353
16#30103 16#31e26 16#3206c 16#33f49 16#343dd 16#35cf8 16#362b2 16#37d97
16#384bf 16#39b9a 16#3a5d0 16#3baf5 16#3c661 16#3d944 16#3e70e 16#3f82b
16#003ae 16#01c8b 16#022c1 16#03de4 16#04170 16#05e55 16#0601f 16#07f3a
16#08612 16#09937 16#0a77d 16#0b858 16#0c4cc 16#0dbe9 16#0e5a3 16#0fa86
16#108d6 16#117f3 16#129b9 16#1369c 16#14a08 16#1552d 16#16b67 16#17442
16#18d6a 16#1924f 16#1ac05 16#1b320 16#1cfb4 16#1d091 16#1eedb 16#1f1fe
] def
} ctxdef
format (full) eq {
/fmtvals [
16#5412 16#5125 16#5e7c 16#5b4b 16#45f9 16#40ce 16#4f97 16#4aa0
16#77c4 16#72f3 16#7daa 16#789d 16#662f 16#6318 16#6c41 16#6976
16#1689 16#13be 16#1ce7 16#19d0 16#0762 16#0255 16#0d0c 16#083b
16#355f 16#3068 16#3f31 16#3a06 16#24b4 16#2183 16#2eda 16#2bed
] def
/ecid (MLHQ) eclevel search pop length exch pop exch pop def
/fmtval fmtvals ecid 3 bitshift bestmaskval add get def
/fmtval fmtvalsfull ecid 3 bitshift bestmaskval add get def
0 1 formatmap length 1 sub {
/i exch def
formatmap i get {
19557,14 → 21342,8
} for
} if
format (micro) eq {
/fmtvals [
16#4445 16#4172 16#4e2b 16#4b1c 16#55ae 16#5099 16#5fc0 16#5af7
16#6793 16#62a4 16#6dfd 16#68ca 16#7678 16#734f 16#7c16 16#7921
16#06de 16#03e9 16#0cb0 16#0987 16#1735 16#1202 16#1d5b 16#186c
16#2508 16#203f 16#2f66 16#2a51 16#34e3 16#31d4 16#3e8d 16#3bba
] def
/symid [ [0] [1 2] [3 4] [5 6 7] ] cols 11 sub 2 idiv get eclval get def
/fmtval fmtvals symid 2 bitshift bestmaskval add get def
/fmtval fmtvalsmicro symid 2 bitshift bestmaskval add get def
0 1 formatmap length 1 sub {
/i exch def
pixs formatmap i get 0 get aload pop qmv fmtval 14 i sub neg bitshift 1 and put
19571,29 → 21350,9
} for
} if
format (rmqr) eq {
/fmtvals1 [
16#1fab2 16#1e597 16#1dbdd 16#1c4f8 16#1b86c 16#1a749 16#19903 16#18626
16#17f0e 16#1602b 16#15e61 16#14144 16#13dd0 16#122f5 16#11cbf 16#1039a
16#0f1ca 16#0eeef 16#0d0a5 16#0cf80 16#0b314 16#0ac31 16#0927b 16#08d5e
16#07476 16#06b53 16#05519 16#04a3c 16#036a8 16#0298d 16#017c7 16#008e2
16#3f367 16#3ec42 16#3d208 16#3cd2d 16#3b1b9 16#3ae9c 16#390d6 16#38ff3
16#376db 16#369fe 16#357b4 16#34891 16#33405 16#32b20 16#3156a 16#30a4f
16#2f81f 16#2e73a 16#2d970 16#2c655 16#2bac1 16#2a5e4 16#29bae 16#2848b
16#27da3 16#26286 16#25ccc 16#243e9 16#23f7d 16#22058 16#21e12 16#20137
] def
/fmtvals2 [
16#20a7b 16#2155e 16#22b14 16#23431 16#248a5 16#25780 16#269ca 16#276ef
16#28fc7 16#290e2 16#2aea8 16#2b18d 16#2cd19 16#2d23c 16#2ec76 16#2f353
16#30103 16#31e26 16#3206c 16#33f49 16#343dd 16#35cf8 16#362b2 16#37d97
16#384bf 16#39b9a 16#3a5d0 16#3baf5 16#3c661 16#3d944 16#3e70e 16#3f82b
16#003ae 16#01c8b 16#022c1 16#03de4 16#04170 16#05e55 16#0601f 16#07f3a
16#08612 16#09937 16#0a77d 16#0b858 16#0c4cc 16#0dbe9 16#0e5a3 16#0fa86
16#108d6 16#117f3 16#129b9 16#1369c 16#14a08 16#1552d 16#16b67 16#17442
16#18d6a 16#1924f 16#1ac05 16#1b320 16#1cfb4 16#1d091 16#1eedb 16#1f1fe
] def
/fmtvalu (MH) eclevel search pop length exch pop exch pop 5 bitshift verind add def
/fmtval1 fmtvals1 fmtvalu get def
/fmtval2 fmtvals2 fmtvalu get def
/fmtval1 fmtvalsrmqr1 fmtvalu get def
/fmtval2 fmtvalsrmqr2 fmtvalu get def
0 1 formatmap length 1 sub {
/i exch def
pixs formatmap i get 0 get aload pop qmv fmtval1 17 i sub neg bitshift 1 and put
19602,14 → 21361,16
} if
 
% Add the version information
{
/vervals [
16#07c94 16#085bc 16#09a99 16#0a4d3 16#0bbf6 16#0c762 16#0d847
16#0e60d 16#0f928 16#10b78 16#1145d 16#12a17 16#13532 16#149a6
16#15683 16#168c9 16#177ec 16#18ec4 16#191e1 16#1afab 16#1b08e
16#1cc1a 16#1d33f 16#1ed75 16#1f250 16#209d5 16#216fd 16#228ba
16#2379f 16#24b0b 16#2542e 16#26a64 16#27541 16#28c69
] def
} ctxdef
format (full) eq cols 45 ge and {
/vervals [
16#07c94 16#085bc 16#09a99 16#0a4d3 16#0bbf6 16#0c762 16#0d847
16#0e60d 16#0f928 16#10b78 16#1145d 16#12a17 16#13532 16#149a6
16#15683 16#168c9 16#177ec 16#18ec4 16#191e1 16#1afab 16#1b08e
16#1cc1a 16#1d33f 16#1ed75 16#1f250 16#209d5 16#216fd 16#228ba
16#2379f 16#24b0b 16#2542e 16#26a64 16#27541 16#28c69
] def
/verval vervals cols 17 sub 4 idiv 7 sub get def
0 1 versionmap length 1 sub {
/i exch def
19632,6 → 21393,8
 
dontdraw not //renmatrix if
 
//unloadctx exec
 
end
 
}
19645,15 → 21408,15
% --END ENCODER qrcode--
 
% --BEGIN ENCODER swissqrcode--
% --REQUIRES preamble raiseerror parseinput renmatrix qrcode--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix qrcode--
% --DESC: Swiss QR Code
% --EXAM:
% --EXOP:
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp swissqrcode 0.0 2021092800 62083 65448
%%BeginData: 127 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp swissqrcode 0.0 2022072900 71645 71452
%%BeginData: 128 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
19666,6 → 21429,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
 
/parse false def
19784,15 → 21548,15
% --END ENCODER swissqrcode--
 
% --BEGIN ENCODER microqrcode--
% --REQUIRES preamble raiseerror parseinput renmatrix qrcode--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix qrcode--
% --DESC: Micro QR Code
% --EXAM: 1234
% --EXOP:
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp microqrcode 0.0 2021092800 56791 56668
%%BeginData: 45 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp microqrcode 0.0 2022072900 66337 62760
%%BeginData: 46 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
dup /qrcode dup /uk.co.terryburton.bwipp findresource put
19804,6 → 21568,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
 
% Parse the input options
19841,15 → 21606,15
% --END ENCODER microqrcode--
 
% --BEGIN ENCODER rectangularmicroqrcode--
% --REQUIRES preamble raiseerror parseinput renmatrix qrcode--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix qrcode--
% --DESC: Rectangular Micro QR Code
% --EXAM: 1234
% --EXOP: version=R17x139
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp rectangularmicroqrcode 0.0 2021092800 56834 56700
%%BeginData: 45 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp rectangularmicroqrcode 0.0 2022072900 66380 62792
%%BeginData: 46 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
dup /qrcode dup /uk.co.terryburton.bwipp findresource put
19861,6 → 21626,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
 
% Parse the input options
19898,15 → 21664,17
% --END ENCODER rectangularmicroqrcode--
 
% --BEGIN ENCODER maxicode--
% --REQUIRES preamble raiseerror parseinput renmaximatrix--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmaximatrix--
% --DESC: MaxiCode
% --EXAM: [)>^03001^02996152382802^029840^029001^0291Z00004951^029UPSN^02906X610^029159^0291234567^0291/1^029^029Y^029634 ALPHA DR^029PITTSBURGH^029PA^029^004
% --EXOP: mode=2 parse
% --RNDR: renmaximatrix
%%BeginResource: uk.co.terryburton.bwipp maxicode 0.0 2021092800 126843 125788
%%BeginData: 596 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp maxicode 0.0 2022072900 132953 135762
%%BeginData: 607 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /renmaximatrix dup /uk.co.terryburton.bwipp findresource put
19918,6 → 21686,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/mode -1 def
/sam -1 def
19938,6 → 21707,8
/mode mode cvi def
/sam sam cvi def
 
/maxicode //loadctx exec
 
% Parse the input
/fncvals <<
/parse parse
19987,6 → 21758,7
 
} if
 
{
% Special function characters
/eci -1 def /pad -2 def /ns -3 def
/la -4 def /lb -5 def
20080,6 → 21852,7
/setc charvals 2 get def
/setd charvals 3 get def
/sete charvals 4 get def
} ctxdef
 
% Compute numeric runlengths
/nseq [ msglen 1 add {0} repeat ] def
20425,6 → 22198,7
} for
 
% Maps modules to pixels in the grid
{
/modmap [
469 529 286 316 347 346 673 672 703 702 647 676 283 282 313 312 370 610 618 379
378 409 408 439 705 704 559 589 588 619 458 518 640 701 675 674 285 284 315 314
20471,6 → 22245,7
538 569 568 598 629 628 658 689 688 718 749 748 778 809 808 838 869 868 898 929
928 958 989 988
] def
} ctxdef
 
% Lookup pixels for enabled modules from modmap
/pixs 864 array def
20493,6 → 22268,8
 
dontdraw not //renmaximatrix if
 
//unloadctx exec
 
end
 
}
20506,15 → 22283,17
% --END ENCODER maxicode--
 
% --BEGIN ENCODER azteccode--
% --REQUIRES preamble raiseerror parseinput renmatrix--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix--
% --DESC: Aztec Code
% --EXAM: This is Aztec Code
% --EXOP: format=full
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp azteccode 0.0 2021092800 183704 199457
%%BeginData: 780 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp azteccode 0.0 2022072900 189159 208295
%%BeginData: 794 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
20526,6 → 22305,7
/options exch def
/barcode exch def
 
/ctx null def
/dontdraw false def
/format (unset) def % full, compact or rune
/readerinit false def
20551,6 → 22331,8
/eclevel eclevel cvr def
/ecaddchars ecaddchars cvi def
 
/azteccode //loadctx exec
 
format (rune) eq {
barcode length 0 eq {
/bwipp.aztecRuneNotNumeric (Aztec runes must be numeric) //raiseerror exec
20576,108 → 22358,111
/msg barcode fncvals //parseinput exec def
/msglen msg length def
 
% Convert from input into message bitstream
/msgbits () def
format (rune) ne raw and {/msgbits barcode def} if
format (rune) ne raw not and {
{
% State key: "U"pper, "L"ower, "M"ixed, "P"unctuation, "D"igit, "B"inary
/U 0 def /L 1 def /M 2 def /P 3 def /D 4 def /B 5 def
 
% State key: "U"pper, "L"ower, "M"ixed, "P"unctuation, "D"igit, "B"inary
/U 0 def /L 1 def /M 2 def /P 3 def /D 4 def /B 5 def
% Special function characters
/lu -2 def /ll -3 def /lm -4 def
/lp -5 def /ld -6 def /su -7 def
/sp -8 def /sb -9 def /fl -10 def
/p2 -11 def /p3 -12 def /p4 -13 def /p5 -14 def
 
% Special function characters
/lu -2 def /ll -3 def /lm -4 def
/lp -5 def /ld -6 def /su -7 def
/sp -8 def /sb -9 def /fl -10 def
/p2 -11 def /p3 -12 def /p4 -13 def /p5 -14 def
% Character maps for each state
/charmaps [
% U L M P D
[ sp sp sp fl sp ] % 0
[ 32 32 32 13 32 ] % 1
[ (A) (a) 1 p2 (0) ] % 2 p2 = CR LF
[ (B) (b) 2 p3 (1) ] % 3 p3 = ". "
[ (C) (c) 3 p4 (2) ] % 4 p4 = ", "
[ (D) (d) 4 p5 (3) ] % 5 p5 = ": "
[ (E) (e) 5 (!) (4) ] % 6
[ (F) (f) 6 (") (5) ] % 7
[ (G) (g) 7 (#) (6) ] % 8
[ (H) (h) 8 ($) (7) ] % 9
[ (I) (i) 9 (%) (8) ] % 10
[ (J) (j) 10 (&) (9) ] % 11
[ (K) (k) 11 (') (,) ] % 12
[ (L) (l) 12 40 (.) ] % 13
[ (M) (m) 13 41 lu ] % 14
[ (N) (n) 27 (*) su ] % 15
[ (O) (o) 28 (+) -99 ] % 16
[ (P) (p) 29 (,) -99 ] % 17
[ (Q) (q) 30 (-) -99 ] % 18
[ (R) (r) 31 (.) -99 ] % 19
[ (S) (s) (@) (/) -99 ] % 20
[ (T) (t) 92 (:) -99 ] % 21
[ (U) (u) (^) (;) -99 ] % 22
[ (V) (v) (_) (<) -99 ] % 23
[ (W) (w) (`) (=) -99 ] % 24
[ (X) (x) (|) (>) -99 ] % 25
[ (Y) (y) (~) (?) -99 ] % 26
[ (Z) (z) 127 ([) -99 ] % 27
[ ll su ll (]) -99 ] % 28
[ lm lm lu ({) -99 ] % 29
[ ld ld lp (}) -99 ] % 30
[ sb sb sb lu -99 ] % 31
] def
 
% Character maps for each state
/charmaps [
% U L M P D
[ sp sp sp fl sp ] % 0
[ 32 32 32 13 32 ] % 1
[ (A) (a) 1 p2 (0) ] % 2 p2 = CR LF
[ (B) (b) 2 p3 (1) ] % 3 p3 = ". "
[ (C) (c) 3 p4 (2) ] % 4 p4 = ", "
[ (D) (d) 4 p5 (3) ] % 5 p5 = ": "
[ (E) (e) 5 (!) (4) ] % 6
[ (F) (f) 6 (") (5) ] % 7
[ (G) (g) 7 (#) (6) ] % 8
[ (H) (h) 8 ($) (7) ] % 9
[ (I) (i) 9 (%) (8) ] % 10
[ (J) (j) 10 (&) (9) ] % 11
[ (K) (k) 11 (') (,) ] % 12
[ (L) (l) 12 40 (.) ] % 13
[ (M) (m) 13 41 lu ] % 14
[ (N) (n) 27 (*) su ] % 15
[ (O) (o) 28 (+) -99 ] % 16
[ (P) (p) 29 (,) -99 ] % 17
[ (Q) (q) 30 (-) -99 ] % 18
[ (R) (r) 31 (.) -99 ] % 19
[ (S) (s) (@) (/) -99 ] % 20
[ (T) (t) 92 (:) -99 ] % 21
[ (U) (u) (^) (;) -99 ] % 22
[ (V) (v) (_) (<) -99 ] % 23
[ (W) (w) (`) (=) -99 ] % 24
[ (X) (x) (|) (>) -99 ] % 25
[ (Y) (y) (~) (?) -99 ] % 26
[ (Z) (z) 127 ([) -99 ] % 27
[ ll su ll (]) -99 ] % 28
[ lm lm lu ({) -99 ] % 29
[ ld ld lp (}) -99 ] % 30
[ sb sb sb lu -99 ] % 31
] def
 
% Invert charmaps to give character to value maps for each state
/charvals [ 32 dict 32 dict 32 dict 32 dict 16 dict ] def
0 1 charmaps length 1 sub {
/i exch def
/encs charmaps i get def
0 1 4 {
/j exch def
encs j get dup type /stringtype eq {0 get} if % convert string to ASCII if required
charvals j get exch i put
} for
% Invert charmaps to give character to value maps for each state
/charvals [ 32 dict 32 dict 32 dict 32 dict 16 dict ] def
0 1 charmaps length 1 sub {
/i exch def
/encs charmaps i get def
0 1 4 {
/j exch def
encs j get dup type /stringtype eq {0 get} if % convert string to ASCII if required
charvals j get exch i put
} for
} for
 
% Punctuation compression
/pcomp <<
<0d0a> p2 % CR LF
(. ) p3
(, ) p4
(: ) p5
>> def
% Punctuation compression
/pcomp <<
<0d0a> p2 % CR LF
(. ) p3
(, ) p4
(: ) p5
>> def
 
/e 10000 def % "Empty"
/e 10000 def % "Empty"
 
/latlen [ % Bit length of latch between states
% To: U L M P D B From
[ 0 5 5 10 5 10 ] % U
[ 9 0 5 10 5 10 ] % L
[ 5 5 0 5 10 10 ] % M
[ 5 10 10 0 10 15 ] % P
[ 4 9 9 14 0 14 ] % D
[ 0 0 0 0 0 0 ] % B
] def
/latlen [ % Bit length of latch between states
% To: U L M P D B From
[ 0 5 5 10 5 10 ] % U
[ 9 0 5 10 5 10 ] % L
[ 5 5 0 5 10 10 ] % M
[ 5 10 10 0 10 15 ] % P
[ 4 9 9 14 0 14 ] % D
[ 0 0 0 0 0 0 ] % B
] def
 
/latseq [ % Latch sequences between states
% To: U L M P D B From
[ [] [ll] [lm] [lm lp] [ld] [sb] ] % U
[ [ld lu] [] [lm] [lm lp] [ld] [sb] ] % L
[ [lu] [ll] [] [lp] [lu ld] [sb] ] % M
[ [lu] [lu ll] [lu lm] [] [lu ld] [lu sb] ] % P
[ [lu] [lu ll] [lu lm] [lu lm lp] [] [lu sb] ] % D
[ [lu] [ll] [lm] [] [] [] ] % B
] def
/latseq [ % Latch sequences between states
% To: U L M P D B From
[ [] [ll] [lm] [lm lp] [ld] [sb] ] % U
[ [ld lu] [] [lm] [lm lp] [ld] [sb] ] % L
[ [lu] [ll] [] [lp] [lu ld] [sb] ] % M
[ [lu] [lu ll] [lu lm] [] [lu ld] [lu sb] ] % P
[ [lu] [lu ll] [lu lm] [lu lm lp] [] [lu sb] ] % D
[ [lu] [ll] [lm] [] [] [] ] % B
] def
 
/shftlen [ % Bit length of shift to state
% To: U L M P D From
[ e e e 5 e ] % U
[ 5 e e 5 e ] % L
[ e e e 5 e ] % M
[ e e e e e ] % P
[ 4 e e 4 e ] % D
] def
/shftlen [ % Bit length of shift to state
% To: U L M P D From
[ e e e 5 e ] % U
[ 5 e e 5 e ] % L
[ e e e 5 e ] % M
[ e e e e e ] % P
[ 4 e e 4 e ] % D
] def
 
} ctxdef
 
% Convert from input into message bitstream
/msgbits () def
format (rune) ne raw and {/msgbits barcode def} if
format (rune) ne raw not and {
 
/charsize {
dup 0 ge {
% U L M P D B
20691,7 → 22476,7
ln 10 ln div cvi 1 add 4 mul 8 add
} ifelse
} ifelse
} bind def
} def
 
% U L M P D B
/curlen [ 0 e e e e e ] def
20866,12 → 22651,12
/tobin {
string dup length 1 sub 0 exch 1 exch {1 index exch 48 put} for
dup 3 -1 roll 2 2 index length string cvrs dup length 2 index length exch sub exch putinterval
} bind def
} def
 
/encu {charvals U get exch get 5 tobin} bind def
/encl {charvals L get exch get 5 tobin} bind def
/encm {charvals M get exch get 5 tobin} bind def
/encd {charvals D get exch get 4 tobin} bind def
/encu {charvals U get exch get 5 tobin} def
/encl {charvals L get exch get 5 tobin} def
/encm {charvals M get exch get 5 tobin} def
/encd {charvals D get exch get 4 tobin} def
 
/encp {
dup fn1 eq { % FNC1: Flg(0)
20892,7 → 22677,7
} {
charvals P get exch get 5 tobin
} ifelse } ifelse
} bind def
} def
 
/encfuncs [ /encu /encl /encm /encp /encd ] def
 
20900,7 → 22685,7
/v exch def
msgbits j v putinterval
/j j v length add def
} bind def
} def
 
% Encode the sequence
/state U def
20969,6 → 22754,7
} if
 
% Lookup the most appropriate symbol specification
{
/metrics [
[ (rune) 0 0 0 6 ] % Special metric for rune symbols
[ (compact) 1 1 17 6 ] [ (full) 1 1 21 6 ] [ (compact) 2 0 40 6 ]
20984,6 → 22770,7
[ (full) 27 0 1224 12 ] [ (full) 28 0 1306 12 ] [ (full) 29 0 1392 12 ]
[ (full) 30 0 1480 12 ] [ (full) 31 0 1570 12 ] [ (full) 32 0 1664 12 ]
] def
} ctxdef
 
/i 0 def
{ % loop
21008,8 → 22795,8
/format frmt def
 
% Expand message bits into codewords avoiding codewords with all zeros or all ones
/allzero {dup length (000000000000) 0 3 -1 roll getinterval eq} bind def
/allones {dup length (111111111111) 0 3 -1 roll getinterval eq} bind def
/allzero {dup length (000000000000) 0 3 -1 roll getinterval eq} def
/allones {dup length (111111111111) 0 3 -1 roll getinterval eq} def
/cws ncws array def
/m 0 def /c 0 def
{
21063,7 → 22850,7
} {
pop pop 0
} ifelse
} bind def
} def
 
% Generate the coefficients
/coeffs [ 1 rsnc {0} repeat ] def
21091,7 → 22878,7
% Return all but the last codeword
rscws 0 rscws length 1 sub getinterval
 
} bind def
} def
 
% Create the codewords and bit string for the mode
format (full) eq {
21131,6 → 22918,7
} for
 
% Extend the data codewords with error correction codewords to create the bit string for the data
{
/rsparams [
[] [] [] [] [] []
[ 64 67 ] % 6-bit codewords
21141,6 → 22929,7
[]
[ 4096 4201 ] % 12-bit codewords
] def
} ctxdef
/cws cws ncws cws length sub rsparams bpcw get {} forall rscodes def
format (full) eq {
/databits layers layers mul 16 mul layers 112 mul add string def
21156,7 → 22945,7
} for
 
% Move to a point in the cartesian plane centered on the bullseye
/cmv {size mul sub mid add} bind def
/cmv {size mul sub mid add} def
 
% Move to a bit position within a layer
/lmv {
21184,7 → 22973,7
lwid 2 idiv 1 sub lbit 2 idiv lwid mod sub neg
cmv
} if
} bind def
} def
 
% Create the pixel map
% For full symbols we disregard the reference grid at this stage
21253,21 → 23042,21
] {pixs exch {} forall 3 1 roll cmv exch put} forall
 
% Mode ring
format (full) eq {
/modemap [
[-5 7] [-4 7] [-3 7] [-2 7] [-1 7] [ 1 7] [ 2 7] [ 3 7] [ 4 7] [ 5 7]
[ 7 5] [ 7 4] [ 7 3] [ 7 2] [ 7 1] [ 7 -1] [ 7 -2] [ 7 -3] [ 7 -4] [ 7 -5]
[ 5 -7] [ 4 -7] [ 3 -7] [ 2 -7] [ 1 -7] [-1 -7] [-2 -7] [-3 -7] [-4 -7] [-5 -7]
[-7 -5] [-7 -4] [-7 -3] [-7 -2] [-7 -1] [-7 1] [-7 2] [-7 3] [-7 4] [-7 5]
] def
} {
/modemap [
[-3 5] [-2 5] [-1 5] [ 0 5] [ 1 5] [ 2 5] [ 3 5]
[ 5 3] [ 5 2] [ 5 1] [ 5 0] [ 5 -1] [ 5 -2] [ 5 -3]
[ 3 -5] [ 2 -5] [ 1 -5] [ 0 -5] [-1 -5] [-2 -5] [-3 -5]
[-5 -3] [-5 -2] [-5 -1] [-5 0] [-5 1] [-5 2] [-5 3]
] def
} ifelse
{
/modemapfull [
[-5 7] [-4 7] [-3 7] [-2 7] [-1 7] [ 1 7] [ 2 7] [ 3 7] [ 4 7] [ 5 7]
[ 7 5] [ 7 4] [ 7 3] [ 7 2] [ 7 1] [ 7 -1] [ 7 -2] [ 7 -3] [ 7 -4] [ 7 -5]
[ 5 -7] [ 4 -7] [ 3 -7] [ 2 -7] [ 1 -7] [-1 -7] [-2 -7] [-3 -7] [-4 -7] [-5 -7]
[-7 -5] [-7 -4] [-7 -3] [-7 -2] [-7 -1] [-7 1] [-7 2] [-7 3] [-7 4] [-7 5]
] def
/modemapcompact [
[-3 5] [-2 5] [-1 5] [ 0 5] [ 1 5] [ 2 5] [ 3 5]
[ 5 3] [ 5 2] [ 5 1] [ 5 0] [ 5 -1] [ 5 -2] [ 5 -3]
[ 3 -5] [ 2 -5] [ 1 -5] [ 0 -5] [-1 -5] [-2 -5] [-3 -5]
[-5 -3] [-5 -2] [-5 -1] [-5 0] [-5 1] [-5 2] [-5 3]
] def
} ctxdef
/modemap format (full) eq {modemapfull} {modemapcompact} ifelse def
0 1 modemap length 1 sub {
/i exch def
pixs modemap i get {} forall cmv modebits i get 48 sub put
21285,6 → 23074,8
 
dontdraw not //renmatrix if
 
//unloadctx exec
 
end
 
}
21298,15 → 23089,15
% --END ENCODER azteccode--
 
% --BEGIN ENCODER azteccodecompact--
% --REQUIRES preamble raiseerror parseinput renmatrix azteccode--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix azteccode--
% --DESC: Compact Aztec Code
% --EXAM: 1234
% --EXOP:
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp azteccodecompact 0.0 2021092800 53387 56691
%%BeginData: 45 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp azteccodecompact 0.0 2022072900 62593 62441
%%BeginData: 46 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
dup /azteccode dup /uk.co.terryburton.bwipp findresource put
21318,6 → 23109,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
 
% Parse the input options
21355,15 → 23147,15
% --END ENCODER azteccodecompact--
 
% --BEGIN ENCODER aztecrune--
% --REQUIRES preamble raiseerror parseinput renmatrix azteccode--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix azteccode--
% --DESC: Aztec Runes
% --EXAM: 1
% --EXOP:
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp aztecrune 0.0 2021092800 53356 56667
%%BeginData: 45 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp aztecrune 0.0 2022072900 62562 62417
%%BeginData: 46 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
dup /azteccode dup /uk.co.terryburton.bwipp findresource put
21375,6 → 23167,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
 
% Parse the input options
21412,15 → 23205,17
% --END ENCODER aztecrune--
 
% --BEGIN ENCODER codeone--
% --REQUIRES preamble raiseerror parseinput renmatrix--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix--
% --DESC: Code One
% --EXAM: Code One
% --EXOP:
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp codeone 0.0 2021092800 196362 218850
%%BeginData: 883 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp codeone 0.0 2022072900 201490 227088
%%BeginData: 903 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
21432,6 → 23227,7
/options exch def
/barcode exch def
 
/ctx null def
/dontdraw false def
/version (unset) def
/parse false def
21448,29 → 23244,169
} if
options {def} forall
 
/codeone //loadctx exec
 
/stype version 0 1 getinterval (S) eq def
 
{
/stypevals [
(1)
(1010)
(1100100)
(1111101000)
(10011100010000)
(11000011010100000)
(11110100001001000000)
(100110001001011010000000)
(101111101011110000100000000)
(111011100110101100101000000000)
(1001010100000010111110010000000000)
(1011101001000011101101110100000000000)
(1110100011010100101001010001000000000000)
(10010001100001001110011100101010000000000000)
(10110101111001100010000011110100100000000000000)
(11100011010111111010100100110001101000000000000000)
(100011100001101111001001101111110000010000000000000000)
(101100011010001010111100001011101100010100000000000000000)
] def
 
% Basic metrics for the each symbol
% ver row col dcol dcws rscw rsbl ro ri rl
/stypemetrics [
[ (S-10) 8 11 10 4 4 1 99 99 99 ]
[ (S-20) 8 21 20 8 8 1 99 99 99 ]
[ (S-30) 8 31 30 12 12 1 99 99 99 ]
] def
 
% Basic metrics for the each symbol
% ver row col dcol dcws rscw rsbl ro ri rl
/nonstypemetrics [
[ (A) 16 18 16 10 10 1 4 99 6 ]
[ (B) 22 22 20 19 16 1 4 99 8 ]
[ (C) 28 32 28 44 26 1 4 22 11 ]
[ (D) 40 42 36 91 44 1 4 16 16 ]
[ (E) 52 54 48 182 70 1 4 22 22 ]
[ (F) 70 76 68 370 140 2 4 22 31 ]
[ (G) 104 98 88 732 280 4 6 21 47 ]
[ (H) 148 134 120 1480 560 8 6 20 69 ]
[ (T-16) 16 17 16 10 10 1 99 99 99 ]
[ (T-32) 16 33 32 24 16 1 99 99 99 ]
[ (T-48) 16 49 48 38 22 1 99 99 99 ]
] def
 
% Special characters
/fnc1 -1 def /fnc3 -2 def
/lC -5 def /lB -6 def /lX -7 def /lT -8 def /lD -9 def /unl -10 def
/fnc2 -11 def /fnc4 -12 def /sft1 -13 def /sft2 -14 def /sft3 -15 def /eci -16 def /pad -17 def /fnc1lD -18 def
/unlcw 255 def
 
/Avals <<
0 1 128 {dup 1 add} for
pad 129
0 1 99 { % Double digits
dup 10 2 string cvrs (00) 2 string copy dup 2 3 index length sub 4 -1 roll putinterval
exch 130 add
} for
229 [ lC lB fnc1 fnc2 fnc3 fnc4 fnc1lD ] {exch 1 add dup} forall pop
lX 238
lT 239
% 240-255 lD + 4 bits
>> def
/Avals <<
Avals {[exch]} forall
>> def
 
/CNvals <<
sft1 0
sft2 1
sft3 2
32 3
48 1 57 {dup 44 sub} for % 0-9
65 1 90 {dup 51 sub} for % A-Z
>> def
/C1vals << 0 1 31 {dup} for >> def
/C2vals <<
33 1 47 {dup 33 sub} for
58 1 64 {dup 43 sub} for
91 1 95 {dup 69 sub} for
fnc1 27
fnc2 28
fnc3 29
fnc4 30
pad 31
>> def
/C3vals << 96 1 127 {dup 96 sub} for >> def
/Cvals <<
CNvals {[exch]} forall
C1vals {[exch CNvals sft1 get exch]} forall
C2vals {[exch CNvals sft2 get exch]} forall
C3vals {[exch CNvals sft3 get exch]} forall
>> def
 
/TNvals <<
sft1 0
sft2 1
sft3 2
32 3
48 1 57 {dup 44 sub} for % 0-9
97 1 122 {dup 83 sub} for % a-z
>> def
/T1vals << 0 1 31 {dup} for >> def
/T2vals <<
33 1 47 {dup 33 sub} for
58 1 64 {dup 43 sub} for
91 1 95 {dup 69 sub} for
fnc1 27
fnc2 28
fnc3 29
fnc4 30
pad 31
>> def
/T3vals <<
96 0
65 1 90 {dup 64 sub} for
123 1 127 {dup 96 sub} for
>> def
/Tvals <<
TNvals {[exch]} forall
T1vals {[exch TNvals sft1 get exch]} forall
T2vals {[exch TNvals sft2 get exch]} forall
T3vals {[exch TNvals sft3 get exch]} forall
>> def
 
% Extended ASCII mappings
128 1 255 {
/i exch def
Avals i [ Avals fnc4 get aload pop Avals i 128 sub get aload pop ] put
Cvals i [ Cvals fnc4 get aload pop Cvals i 128 sub get aload pop ] put
Tvals i [ Tvals fnc4 get aload pop Tvals i 128 sub get aload pop ] put
} for
 
/Xvals <<
13 0
42 1
62 2
32 3
48 1 57 {dup 44 sub} for
65 1 90 {dup 51 sub} for
>> def
/Xvals <<
Xvals {[exch]} forall
>> def
 
/Bvals <<
0 1 255 {dup} for
>> def
/Bvals <<
Bvals {[exch]} forall
>> def
 
/encvals [ Avals Cvals Tvals Xvals -1 Bvals ] def
 
/A 0 def /C 1 def /T 2 def /X 3 def /D 4 def /B 5 def
} ctxdef
 
stype {
/vals [
(1)
(1010)
(1100100)
(1111101000)
(10011100010000)
(11000011010100000)
(11110100001001000000)
(100110001001011010000000)
(101111101011110000100000000)
(111011100110101100101000000000)
(1001010100000010111110010000000000)
(1011101001000011101101110100000000000)
(1110100011010100101001010001000000000000)
(10010001100001001110011100101010000000000000)
(10110101111001100010000011110100100000000000000)
(11100011010111111010100100110001101000000000000000)
(100011100001101111001001101111110000010000000000000000)
(101100011010001010111100001011101100010100000000000000000)
] def
 
/normalize {
/base exch def
21490,7 → 23426,7
/num [/i true def num {dup 0 eq i and {pop} {/i false def} ifelse} forall] def
num length 0 eq {/num [0] def} if
num
} bind def
} def
 
/bigadd {
2 copy length exch length
21501,7 → 23437,7
dup a exch offset add 2 copy get b 5 -1 roll get add put
} for
a
} bind def
} def
 
/barlen barcode length def
 
21509,7 → 23445,7
/v [ 1 ] def
0 1 barlen 1 sub {
/i exch def
[ vals i get {48 sub barcode barlen i sub 1 sub get 48 sub mul} forall ]
[ stypevals i get {48 sub barcode barlen i sub 1 sub get 48 sub mul} forall ]
v bigadd /v exch def
} for
/v v 2 normalize def
21524,18 → 23460,11
cws exch i exch put
} for
 
% Basic metrics for the each symbol
% ver row col dcol dcws rscw rsbl ro ri rl
/metrics [
[ (S-10) 8 11 10 4 4 1 99 99 99 ]
[ (S-20) 8 21 20 8 8 1 99 99 99 ]
[ (S-30) 8 31 30 12 12 1 99 99 99 ]
] def
/metrics stypemetrics def
 
} { % Standard and type-T
 
% Convert input into bytes accounting for FNC characters
/fnc1 -1 def /fnc3 -2 def
/fncvals <<
/parse parse
/parsefnc parsefnc
21546,11 → 23475,6
/msg barcode fncvals //parseinput exec def
/msglen msg length def
 
% Special characters
/lC -5 def /lB -6 def /lX -7 def /lT -8 def /lD -9 def /unl -10 def
/fnc2 -11 def /fnc4 -12 def /sft1 -13 def /sft2 -14 def /sft3 -15 def /eci -16 def /pad -17 def /fnc1lD -18 def
/unlcw 255 def
 
% Code One stores ECIs in data
/eciesc 16#5c def % We choose \ as a typical default
/numecis 0 msg { -1000000 le {1 add} if } forall def
21582,21 → 23506,7
/msglen msg length def
} if
 
% Basic metrics for the each symbol
% ver row col dcol dcws rscw rsbl ro ri rl
/metrics [
[ (A) 16 18 16 10 10 1 4 99 6 ]
[ (B) 22 22 20 19 16 1 4 99 8 ]
[ (C) 28 32 28 44 26 1 4 22 11 ]
[ (D) 40 42 36 91 44 1 4 16 16 ]
[ (E) 52 54 48 182 70 1 4 22 22 ]
[ (F) 70 76 68 370 140 2 4 22 31 ]
[ (G) 104 98 88 732 280 4 6 21 47 ]
[ (H) 148 134 120 1480 560 8 6 20 69 ]
[ (T-16) 16 17 16 10 10 1 99 99 99 ]
[ (T-32) 16 33 32 24 16 1 99 99 99 ]
[ (T-48) 16 49 48 38 22 1 99 99 99 ]
] def
/metrics nonstypemetrics def
 
% Select metrics of an appropriate symbol
/fullcws [] def
21621,109 → 23531,6
} if
} for
 
/Avals <<
0 1 128 {dup 1 add} for
pad 129
0 1 99 { % Double digits
dup 10 2 string cvrs (00) 2 string copy dup 2 3 index length sub 4 -1 roll putinterval
exch 130 add
} for
229 [ lC lB fnc1 fnc2 fnc3 fnc4 fnc1lD ] {exch 1 add dup} forall pop
lX 238
lT 239
% 240-255 lD + 4 bits
>> def
/Avals <<
Avals {[exch]} forall
>> def
 
/CNvals <<
sft1 0
sft2 1
sft3 2
32 3
48 1 57 {dup 44 sub} for % 0-9
65 1 90 {dup 51 sub} for % A-Z
>> def
/C1vals << 0 1 31 {dup} for >> def
/C2vals <<
33 1 47 {dup 33 sub} for
58 1 64 {dup 43 sub} for
91 1 95 {dup 69 sub} for
fnc1 27
fnc2 28
fnc3 29
fnc4 30
pad 31
>> def
/C3vals << 96 1 127 {dup 96 sub} for >> def
/Cvals <<
CNvals {[exch]} forall
C1vals {[exch CNvals sft1 get exch]} forall
C2vals {[exch CNvals sft2 get exch]} forall
C3vals {[exch CNvals sft3 get exch]} forall
>> def
 
/TNvals <<
sft1 0
sft2 1
sft3 2
32 3
48 1 57 {dup 44 sub} for % 0-9
97 1 122 {dup 83 sub} for % a-z
>> def
/T1vals << 0 1 31 {dup} for >> def
/T2vals <<
33 1 47 {dup 33 sub} for
58 1 64 {dup 43 sub} for
91 1 95 {dup 69 sub} for
fnc1 27
fnc2 28
fnc3 29
fnc4 30
pad 31
>> def
/T3vals <<
96 0
65 1 90 {dup 64 sub} for
123 1 127 {dup 96 sub} for
>> def
/Tvals <<
TNvals {[exch]} forall
T1vals {[exch TNvals sft1 get exch]} forall
T2vals {[exch TNvals sft2 get exch]} forall
T3vals {[exch TNvals sft3 get exch]} forall
>> def
 
% Extended ASCII mappings
128 1 255 {
/i exch def
Avals i [ Avals fnc4 get aload pop Avals i 128 sub get aload pop ] put
Cvals i [ Cvals fnc4 get aload pop Cvals i 128 sub get aload pop ] put
Tvals i [ Tvals fnc4 get aload pop Tvals i 128 sub get aload pop ] put
} for
 
/Xvals <<
13 0
42 1
62 2
32 3
48 1 57 {dup 44 sub} for
65 1 90 {dup 51 sub} for
>> def
/Xvals <<
Xvals {[exch]} forall
>> def
 
/Bvals <<
0 1 255 {dup} for
>> def
/Bvals <<
Bvals {[exch]} forall
>> def
 
/encvals [ Avals Cvals Tvals Xvals -1 Bvals ] def
 
/numD [ msglen {0} repeat 0 ] def
/nextXterm [ msglen {0} repeat 9999 ] def
/nextNonX [ msglen {0} repeat 9999 ] def
21747,16 → 23554,14
/nextXterm [nextXterm {dup 10000 gt {pop 10000} if} forall] def
/nextNonX [nextNonX {dup 10000 gt {pop 10000} if} forall] def
 
/isD {char 48 ge char 57 le and} bind def
/isC {CNvals char known} bind def
/isT {TNvals char known} bind def
/isX {Xvals char known} bind def
/isEA {char 127 gt} bind def
/isFN {char 0 lt} bind def
/XtermFirst {dup nextXterm exch get exch nextNonX exch get lt} bind def
/isD {char 48 ge char 57 le and} def
/isC {CNvals char known} def
/isT {TNvals char known} def
/isX {Xvals char known} def
/isEA {char 127 gt} def
/isFN {char 0 lt} def
/XtermFirst {dup nextXterm exch get exch nextNonX exch get lt} def
 
/A 0 def /C 1 def /T 2 def /X 3 def /D 4 def /B 5 def
 
/lookup {
/ac 1 def /cc 2 def /tc 2 def /xc 2 def /bc 3 def
mode A eq {/ac 0 def /cc 1 def /tc 1 def /xc 1 def /bc 2 def} if
21792,18 → 23597,18
/k k 1 add def
} loop
} repeat
} bind def
} def
 
/addtocws {
dup cws exch j exch putinterval
/j exch length j add def
} bind def
} def
 
/tobin {
string dup length 1 sub 0 exch 1 exch {1 index exch 48 put} for
dup 3 -1 roll 2 2 index length string cvrs dup length 2 index length exch sub exch putinterval
[ exch {48 sub} forall ]
} bind def
} def
 
/encA {
1 { % Common exit
21848,7 → 23653,7
/i i 1 add def
exit
} repeat
} bind def
} def
 
/CTXvalstocws {
/in exch def
21858,7 → 23663,7
dup 256 idiv exch 256 mod
} for
counttomark array astore exch pop
} bind def
} def
 
/encCTX {
/p 0 def
21985,7 → 23790,7
} if
} if
 
} bind def
} def
 
/encD {
 
22053,7 → 23858,7
counttomark array astore exch pop addtocws
/mode A def
 
} bind def
} def
 
/encB {
/p 0 def /bvals 1480 array def {
22075,7 → 23880,7
] def
bvals addtocws
/mode A def
} bind def
} def
 
% Derive the codewords
/cws 1480 array def
22145,7 → 23950,7
} {
pop pop 0
} ifelse
} bind def
} def
 
% Generate the coefficients for the Reed-Solomon algorithm
/coeffs [ 1 ecpb {0} repeat ] def
22209,7 → 24014,7
} for
 
% Create bitmap and add finder patterns
/mmv {cols mul add} bind def
/mmv {cols mul add} def
/pixs [ rows cols mul {-1} repeat ] def
 
% Centre pattern
22223,7 → 24028,8
{1 cols 2 sub {0} repeat 1} bind
{1 0 cols 4 sub {1} repeat 0 1} bind
] def
/cpat <<
{
/cpatmap <<
/A (121343)
/B (12134343)
/C (12121343)
22234,7 → 24040,9
/H (121212134343)
/S (56661278)
/T (5666666666127878)
>> vers 0 1 getinterval get def
>> def
} ctxdef
/cpat cpatmap vers 0 1 getinterval get def
pixs 0 rows cpat length sub 2 idiv mmv
[ cpat {artifact exch 49 sub get exec} forall ] putinterval
 
22254,7 → 24062,8
} for
 
% Black dots
<<
{
/blackdotmap <<
/A [ [12 5] ]
/B [ [16 7] ]
/C [ [26 12] ]
22269,7 → 24078,9
/T-16 [ [8 10] ]
/T-32 [ [16 10] [16 12] ]
/T-48 [ [24 10] [24 12] [24 14] ]
>> vers get {pixs exch aload pop mmv 1 put} forall
>> def
} ctxdef
blackdotmap vers get {pixs exch aload pop mmv 1 put} forall
 
% Place the modules onto a pixel map between alignment patterns
/j 0 def
22294,6 → 24105,8
 
dontdraw not //renmatrix if
 
//unloadctx exec
 
end
 
}
22307,15 → 24120,17
% --END ENCODER codeone--
 
% --BEGIN ENCODER hanxin--
% --REQUIRES preamble raiseerror parseinput renmatrix--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix--
% --DESC: Han Xin Code
% --EXAM: This is Han Xin
% --EXOP:
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp hanxin 0.0 2021092800 305838 345620
%%BeginData: 852 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp hanxin 0.0 2022072900 311365 358291
%%BeginData: 863 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
22327,6 → 24142,7
/options exch def
/barcode exch def
 
/ctx null def
/dontdraw false def
/version (unset) def % 1-84
/eclevel (unset) def % L1, L2, L3 or L4
22347,6 → 24163,8
 
/mask mask cvi def
 
/hanxin //loadctx exec
 
% Parse the input
/fncvals <<
/parse parse
22363,7 → 24181,7
string dup length 1 sub 0 exch 1 exch {1 index exch 48 put} for
dup 3 -1 roll 2 2 index length string cvrs
dup length 2 index length exch sub exch putinterval
} bind def
} def
 
% Encode the data using byte mode encoding
/bits 4 13 add msglen 8 mul add string def
22375,6 → 24193,7
} for
 
% Lookup the most appropriate symbol specification
{
/metrics [
% vers size align modules error correction blocks
[ (1) 23 -1 0 205 [ 1 21 4 ] [ 0 -1 -1 ] [ 0 -1 -1 ]
22714,6 → 24533,7
[ 2 26 26 ] [ 62 33 28 ] [ 0 -1 -1 ]
[ 79 18 28 ] [ 4 33 30 ] [ 0 -1 -1 ] ]
] def
} ctxdef
 
/eclval eclevel 1 get 49 sub def
0 1 83 {
22738,7 → 24558,7
} for
 
okay not {
/bwipp.hanxinNoValidSymbol (No valid symbol available) //raiseerror exec
/bwipp.hanxinNoValidSymbol (Maximum length exceeded or invalid content) //raiseerror exec
} if
 
/version vers def
22784,7 → 24604,7
} {
pop pop 0
} ifelse
} bind def
} def
 
% Generate the coefficients
/coeffs [ 1 rsnc {0} repeat ] def
22812,7 → 24632,7
% Return all but the last codeword
rscws 0 rscws length 1 sub getinterval
 
} bind def
} def
 
% Divide codewords into two groups of blocks and calculate the error correction codewords
/dcwsb e1nb e2nb add e3nb add array def
22863,15 → 24683,15
 
% Create the bitmap
/pixs [ size size mul {-1} repeat ] def
/qmv {size mul add} bind def
/qmv {size mul add} def
 
% Alignment patterns
alnn 0 ne {
/trmv {size mul size add 1 sub exch sub} bind def
/trmv {size mul size add 1 sub exch sub} def
/aplot {
3 1 roll 3 copy exch trmv pixs exch 3 -1 roll put
trmv pixs exch 3 -1 roll put
} bind def
} def
/i 0 def /stag 0 def {
i size ge {exit} if
0 1 size 1 sub {
22925,6 → 24745,7
} if
 
% Finder patterns
{
/fpat [
[ 1 1 1 1 1 1 1 0 ]
[ 1 0 0 0 0 0 0 0 ]
22945,6 → 24766,7
[ 1 1 1 1 1 1 1 0 ]
[ 0 0 0 0 0 0 0 0 ]
] def
} ctxdef
0 1 fpat length 1 sub {
/y exch def
0 1 fpat 0 get length 1 sub {
23064,7 → 24886,7
} if
} for
scr1 scr3
} bind def
} def
 
% Evaluation algorithm
/evalfull {
23102,7 → 24924,7
} for
 
n1 n3 add
} bind def
} def
 
% Evaluate the masked symbols to find the most suitable
/bestscore 999999999 def
23158,6 → 24980,8
 
dontdraw not //renmatrix if
 
//unloadctx exec
 
end
 
}
23171,15 → 24995,17
% --END ENCODER hanxin--
 
% --BEGIN ENCODER dotcode--
% --REQUIRES preamble raiseerror parseinput renmatrix--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix--
% --DESC: DotCode
% --EXAM: This is DotCode
% --EXOP: inkspread=0.16
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp dotcode 0.0 2021092800 231580 260718
%%BeginData: 1037 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp dotcode 0.0 2022072900 238866 274940
%%BeginData: 1067 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
23191,6 → 25017,7
/options exch def
/barcode exch def
 
/ctx null def
/dontdraw false def
/rows -1 def
/columns -1 def
23217,6 → 25044,8
/ratio ratio cvr def
/mask mask cvi def
 
/dotcode //loadctx exec
 
% Set the ratio to 3:2 if no size is specified
ratio -1 eq rows -1 eq and columns -1 eq and {
/ratio 3 2 div def
23223,6 → 25052,7
} if
 
% Convert input into bytes accounting for FNC characters
{
/laa -1 def /lab -2 def /lac -3 def /bin -4 def
/sfa -5 def /sfb -6 def /sb2 -7 def /sb3 -8 def
/sb4 -9 def /sb5 -10 def /sb6 -11 def /sfc -12 def
23232,6 → 25062,7
/fn1 -25 def /fn2 -26 def /fn3 -27 def /crl -28 def
/aim -29 def /m05 -30 def /m06 -31 def /m12 -32 def
/mac -33 def
} ctxdef
 
% Parse the input
/fncvals <<
23264,7 → 25095,8
/msglen msg length def
 
% Character maps for each state
/charmaps [
{
/charmaps [
% A B C A B C A B C
[ 32 32 (00) ] [ (!) (!) (01) ] [ (") (") (02) ] % 0-2
[ (#) (#) (03) ] [ ($) ($) (04) ] [ (%) (%) (05) ] % 3-5
23328,6 → 25160,9
102 [ sc2 sc3 sc4 sc5 sc6 sc7 tma tmb tmc tms ] {exch 1 add dup} forall pop
>> def
 
/A 0 def /B 1 def /C 2 def /BIN 3 def
} ctxdef
 
% Pre-compute properties of the input at each point
/nDigits [ msglen 1 add {0} repeat ] def
/SeventeenTen [ msglen 1 add {false} repeat ] def
23397,12 → 25232,10
} if
} for
 
/A 0 def /B 1 def /C 2 def /BIN 3 def
 
/addtocws {
dup cws exch j exch putinterval
/j exch length j add def
} bind def
} def
 
% Base 259 to one more in base 103
/base259to103 {
23433,7 → 25266,7
103 idiv mscs 2 get 15 mul add
out 0 3 -1 roll 103 mod put
out 6 inlen sub 1 sub inlen 1 add getinterval
} bind def
} def
 
/finaliseBIN {
bpos 0 ne {
23440,13 → 25273,13
bvals 0 bpos getinterval base259to103 aload pop
/bpos 0 def
} if
} bind def
} def
 
/addtobin {
bvals exch bpos exch put
/bpos bpos 1 add def
bpos 5 eq { finaliseBIN } if
} bind def
} def
 
/ECIabc { % ECI encoding for modes A, B and C
msg i 1 add 6 getinterval 0 exch {48 sub add 10 mul} forall 10 idiv
23455,7 → 25288,7
dup 12769 idiv 40 add exch 12769 mod
dup 113 idiv exch 113 mod
} if
} bind def
} def
 
/ECIbin { % ECI encoding for binary mode
[
23472,7 → 25305,7
] {
addtobin
} forall
} bind def
} def
 
/encC {
1 { % Common exit
23496,9 → 25329,16
} repeat
/inmac exch def
inmac 0 ne {
[ Cvals lab get ] addtocws
/mode B def
[ Bvals inmac get ] addtocws
/i i inmac mac ne {7} {6} ifelse add def
inmac mac eq {
[ Bvals msg segstart 4 add get get ] addtocws
[ Bvals msg segstart 5 add get get ] addtocws
/i i 6 add def
} {
/i i 7 add def
} ifelse
exit
} if
} if
23579,12 → 25419,17
} if
[ Cvals [ sfb sb2 sb3 sb4 ] n 1 sub get get ] addtocws
n {
[ Bvals msg i get get ] addtocws
/i i 1 add def
msg i get 13 eq {
[ Bvals crl get ] addtocws
/i i 2 add def
} {
[ Bvals msg i get get ] addtocws
/i i 1 add def
} ifelse
} repeat
exit
} repeat
} bind def % encC
} def % encC
 
/encB {
1 { % Common exit
23660,7 → 25505,7
/mode A def
exit
} repeat
} bind def
} def
 
/encA {
1 { % Common exit
23728,12 → 25573,17
} if
[ Avals [ sfb sb2 sb3 sb4 sb5 sb6 ] n 1 sub get get ] addtocws
n {
[ Bvals msg i get get ] addtocws
/i i 1 add def
msg i get 13 eq {
[ Bvals crl get ] addtocws
/i i 2 add def
} {
[ Bvals msg i get get ] addtocws
/i i 1 add def
} ifelse
} repeat
exit
} repeat
} bind def
} def
 
/encBIN {
1 { % Common exit
23795,7 → 25645,7
} if
exit
} repeat
} bind def
} def
 
/cws msglen 2 mul 1 add array def
/mode C def
23871,6 → 25721,7
options /debugcws known { /bwipp.debugcws cws //raiseerror exec } if
 
% Create an array containing the character mappings
{
/encs [
(101010101) (010101011) (010101101) (010110101) (011010101)
(101010110) (101011010) (101101010) (110101010) (010101110)
23896,6 → 25747,7
(100011110) (100111100) (101111000) (110001110) (110011100)
(110111000) (111000110) (111001100)
] def
} ctxdef
 
% Final six dots arranged at edges
rows 2 mod 0 eq {
23918,7 → 25770,7
] def
} ifelse
 
/dmv {columns mul add} bind def
/dmv {columns mul add} def
 
% Construct the template
/outline rows columns mul array def
23939,7 → 25791,7
x 1 and 2 rows 1 sub {
x exch dmv sym exch get 1 eq {pop false exit} if
} for
} bind def
} def
 
/clearrow {
/y exch def
23947,7 → 25799,7
y 1 and 2 columns 1 sub {
y dmv sym exch get 1 eq {pop false exit} if
} for
} bind def
} def
 
% Evaluate the symbol
/evalsymbol {
24055,12 → 25907,12
worst sum sum mul sub pen sub
} ifelse
 
} bind def
} def
 
% Reed Solomon antilog table
/rsalog [ 1 112 { dup 3 mul 113 mod } repeat ] def
/step nw 112 idiv 1 add def
/offset {step mul start add} bind def
/offset {step mul start add} def
 
% Evaluate the symbols in the following order:
% fast mode: m3 -> m3' -> m2 -> m2' -> m1 -> m1' -> m0 -> m0'
24207,6 → 26059,8
 
dontdraw not //renmatrix if
 
//unloadctx exec
 
end
 
}
24220,15 → 26074,17
% --END ENCODER dotcode--
 
% --BEGIN ENCODER ultracode--
% --REQUIRES preamble raiseerror parseinput renmatrix--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix--
% --DESC: Ultracode
% --EXAM: Awesome colours!
% --EXOP: eclevel=EC2
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp ultracode 0.0 2021092800 89868 89228
%%BeginData: 345 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp ultracode 0.0 2022072900 96331 99027
%%BeginData: 361 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
24240,6 → 26096,7
/options exch def
/barcode exch def
 
/ctx null def
/dontdraw false def
/eclevel (EC2) def % EC0-EC5
/encoding (auto) def
24269,6 → 26126,8
/bwipp.ultracodeInvalidRevision (Valid revisions are 1 and 2) //raiseerror exec
} if
 
/ultracode //loadctx exec
 
raw {/encoding (raw) def} if
 
encoding (raw) eq {
24325,6 → 26184,7
/tcc mcc qcc add def
 
% Lookup the most appropriate symbol specification
{
/metrics [
% rows minc maxc mcol
[ 2 7 37 5 ]
24332,6 → 26192,8
[ 4 85 161 22 ]
[ 5 142 282 29 ]
] def
} ctxdef
 
0 1 3 {
/i exch def
/m metrics i get def
24345,7 → 26207,7
} for
 
okay not {
/bwipp.ultracodeNoValidSymbol (No valid symbol available) //raiseerror exec
/bwipp.ultracodeNoValidSymbol (Maximum length exceeded or invalid content) //raiseerror exec
} if
 
% Determine required number of columns and pads
24415,34 → 26277,7
 
options /debugecc known { /bwipp.debugecc ecws //raiseerror exec } if
 
rev 1 eq {
/dccu [
51363 51563 51653 53153 53163 53513 53563 53613 % 0-7
53653 56153 56163 56313 56353 56363 56513 56563 % 8-15
51316 51356 51536 51616 53156 53516 53536 53616 % 16-23
53636 53656 56136 56156 56316 56356 56516 56536 % 24-31
] def
/dccl [
61351 61361 61531 61561 61631 61651 63131 63151 % 0-7
63161 63531 63561 63631 65131 65161 65351 65631 % 8-15
31351 31361 31531 31561 31631 31651 35131 35151 % 16-23
35161 35361 35631 35651 36131 36151 36351 36531 % 24-31
] def
} { % rev=2
/dccu [
15316 16316 13516 16516 13616 15616 13136 15136 % 0-7
16136 13536 16536 13636 13156 16156 15356 13656 % 8-15
15313 16313 13513 16513 13613 15613 13153 15153 % 16-23
16153 16353 13653 15653 13163 15163 15363 13563 % 24-31
] def
/dccl [
36315 36515 35615 35135 36135 31535 36535 31635 % 0-7
35635 35165 36165 31365 35365 36365 31565 36565 % 8-15
61315 65315 63515 61615 65135 61535 63535 61635 % 16-23
63635 65635 63165 65165 61365 65365 61565 63565 % 24-31
] def
} ifelse
 
{
/tiles [
13135 13136 13153 13156 13163 13165 13513 13515 13516 13531 % 0-9
13535 13536 13561 13563 13565 13613 13615 13616 13631 13635 % 10-19
24475,6 → 26310,35
65635 65651 65653 56565 51515 % 280-284
] def
 
/dccurev1 [
51363 51563 51653 53153 53163 53513 53563 53613 % 0-7
53653 56153 56163 56313 56353 56363 56513 56563 % 8-15
51316 51356 51536 51616 53156 53516 53536 53616 % 16-23
53636 53656 56136 56156 56316 56356 56516 56536 % 24-31
] def
/dcclrev1 [
61351 61361 61531 61561 61631 61651 63131 63151 % 0-7
63161 63531 63561 63631 65131 65161 65351 65631 % 8-15
31351 31361 31531 31561 31631 31651 35131 35151 % 16-23
35161 35361 35631 35651 36131 36151 36351 36531 % 24-31
] def
/dccurev2 [
15316 16316 13516 16516 13616 15616 13136 15136 % 0-7
16136 13536 16536 13636 13156 16156 15356 13656 % 8-15
15313 16313 13513 16513 13613 15613 13153 15153 % 16-23
16153 16353 13653 15653 13163 15163 15363 13563 % 24-31
] def
/dcclrev2 [
36315 36515 35615 35135 36135 31535 36535 31635 % 0-7
35635 35165 36165 31365 35365 36365 31565 36565 % 8-15
61315 65315 63515 61615 65135 61535 63535 61635 % 16-23
63635 65635 63165 65165 61365 65365 61565 63565 % 24-31
] def
} ctxdef
 
/dccu rev 1 eq {dccurev1} {dccurev2} ifelse def
/dccl rev 1 eq {dcclrev1} {dcclrev2} ifelse def
 
% Create the bitmap
/rows rows 6 mul 1 add def
/columns columns 6 add def
24543,6 → 26407,17
} ifelse
} forall
 
{
/colormap <<
0 (FFFFFF) % W
9 (000000) % K
1 (00FFFF) % C
3 (FF00FF) % M
5 (FFFF00) % Y
6 (00FF00) % G
>> def
} ctxdef
 
% Return the arguments
<<
/ren //renmatrix
24551,19 → 26426,14
/pixy rows
/height rows 72 div 2 mul
/width columns 72 div 2 mul
/colormap <<
0 (FFFFFF) % W
9 (000000) % K
1 (00FFFF) % C
3 (FF00FF) % M
5 (FFFF00) % Y
6 (00FF00) % G
>>
/colormap colormap
/opt options
>>
 
dontdraw not //renmatrix if
 
//unloadctx exec
 
end
 
}
24577,15 → 26447,15
% --END ENCODER ultracode--
 
% --BEGIN ENCODER jabcode--
% --REQUIRES preamble raiseerror parseinput renmatrix--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix--
% --DESC: JAB Code (Beta)
% --EXAM: This is JAB Code
% --EXOP: eclevel=6
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp jabcode 0.0 2021092800 240985 279579
%%BeginData: 1132 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp jabcode 0.0 2022072900 246160 288650
%%BeginData: 1133 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
24597,6 → 26467,7
/options exch def
/barcode exch def
 
/ctx null def
/dontdraw false def
/rows -1 def
/columns -1 def
24773,7 → 26644,7
 
% TODO Reject all invalid sizes
rows 145 gt cols 145 gt or {
/bwipp.jabcodeNoValidSymbol (No valid symbol available) //raiseerror exec
/bwipp.jabcodeNoValidSymbol (Maximum length exceeded or invalid content) //raiseerror exec
} if
 
% Pick ECC params to maximally fill symbol
25721,18 → 27592,19
% --END ENCODER jabcode--
 
% --BEGIN ENCODER gs1-cc--
% --REQUIRES preamble raiseerror parseinput gs1lint renmatrix micropdf417 pdf417--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renmatrix micropdf417 pdf417--
% --DESC: GS1 Composite 2D Component
% --EXAM: (01)95012345678903(3103)000123
% --EXOP: ccversion=b cccolumns=4
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp gs1-cc 0.0 2021092800 205775 208288
%%BeginData: 661 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp gs1-cc 0.0 2022072900 206333 205184
%%BeginData: 639 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /gs1lint dup /uk.co.terryburton.bwipp findresource put
dup /gs1process dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
dup /pdf417 dup /uk.co.terryburton.bwipp findresource put
dup /micropdf417 dup /uk.co.terryburton.bwipp findresource put
25744,8 → 27616,10
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/parse false def
/dontlint false def
/lintreqs false def
/dontdraw false def
/ccversion (a) def
/cccolumns -1 def
25766,6 → 27640,8
/cccolumns cccolumns cvi def
/linwidth linwidth cvi def
 
/gs1-cc //loadctx exec
 
% Select columns based on linear type
cccolumns -1 eq {
<<
25785,41 → 27661,15
>> lintype get /cccolumns exch def
} if
 
% Expand ordinals of the form ^NNN to ASCII
/expand {
/fncvals <<
/parse parse
/parseonly true
/parsefnc false
>> def
fncvals //parseinput exec
} bind def
barcode /ai //gs1process exec
/fncs exch def
/vals exch def
/ais exch def
 
% Parse out AIs
/ais [] def
/vals [] def
barcode dup length 1 sub 1 exch getinterval
{ % loop
dup () eq {exit} if
(\)) search pop
exch pop
exch (\() search {
exch pop exch 3 1 roll
} {
() 3 1 roll
} ifelse
[ ais aload pop counttomark 2 add index ] /ais exch def
[ vals aload pop counttomark 1 add index expand ] /vals exch def
pop pop
} loop
pop
 
dontlint not { ais vals //gs1lint exec pop } if
 
% Method selection
/isupper {dup 65 ge exch 90 le and} bind def % A-Z
/isnum0 {dup 48 ge exch 57 le and} bind def % 0-9
/isnum1 {dup 49 ge exch 57 le and} bind def % 1-9
/isupper {dup 65 ge exch 90 le and} def % A-Z
/isnum0 {dup 48 ge exch 57 le and} def % 0-9
/isnum1 {dup 49 ge exch 57 le and} def % 1-9
{ % common exit
 
% (10/11/17)...
25869,13 → 27719,15
/method exch def
/npre exch def
 
/fnc1 -1 def /lnumeric -2 def /lalphanumeric -3 def /liso646 -4 def
 
/tobin {
string dup length 1 sub 0 exch 1 exch {1 index exch 48 put} for
dup 3 -1 roll 2 2 index length string cvrs dup length 2 index length exch sub exch putinterval
} bind def
} def
 
{
 
/fnc1 -1 def /lnumeric -2 def /lalphanumeric -3 def /liso646 -4 def
 
/alpha <<
65 1 90 {dup 65 sub 5 tobin} for
48 1 57 {dup 4 add 6 tobin} for
25920,6 → 27772,8
lalphanumeric (00100)
>> def
 
} ctxdef
 
method (10) eq { % TODO: fixme
ais 0 get (11) eq ais 0 get (17) eq or {
vals 0 get
25934,6 → 27788,7
] /cdf exch def
/ais ais 1 ais length 1 sub getinterval def
/vals vals 1 vals length 1 sub getinterval def
/fncs fncs 1 fncs length 1 sub getinterval def
} {
/cdf [ 1 0 1 1 ] def
} ifelse
25943,6 → 27798,7
ais length 1 gt {/gpf [ gpf aload pop fnc1 ] def} if % TODO: check
/ais ais 1 ais length 1 sub getinterval def
/vals vals 1 vals length 1 sub getinterval def
/fncs fncs 1 fncs length 1 sub getinterval def
} {
/gpf [fnc1] def % TODO: check
} ifelse
26032,6 → 27888,7
} ifelse
/ais ais 1 ais length 1 sub getinterval def
/vals vals 1 vals length 1 sub getinterval def
/fncs fncs 1 fncs length 1 sub getinterval def
ais length 0 ne {
ais1 (21) eq ais1 (8004) eq or {
/gpf [
26040,6 → 27897,7
] def
/ais ais 1 ais length 1 sub getinterval def
/vals vals 1 vals length 1 sub getinterval def
/fncs fncs 1 fncs length 1 sub getinterval def
ais length 0 ne {/gpf [gpf aload pop fnc1] def} if
} if
} if
26051,24 → 27909,6
/mode (numeric) def
} if
 
% Pre-defined fixed length data field AIs
% any AI whose prefix is not included in this table must be
% terminated with "FNC1", even if it's fixed length
/aifixed 23 dict def
[
0 1 4 {} for
] {
(00) 2 string copy dup dup 1 5 -1 roll 48 add put aifixed 3 1 roll put
} forall
[
11 1 20 {} for
23
31 1 36 {} for
41
] {
10 2 string cvrs dup aifixed 3 1 roll put
} forall
 
% Append the remaining AI data
0 1 ais length 1 sub {
/i exch def
26079,7 → 27919,7
dup gpf length ai [ exch {} forall ] putinterval
dup gpf length ai length add val [ exch {} forall ] putinterval
/gpf exch def
i ais length 1 sub ne aifixed ai 0 2 getinterval known not and { % Append FNC1
i ais length 1 sub ne fncs i get and { % Append FNC1
gpf length 1 add array
dup 0 gpf putinterval
dup gpf length fnc1 put
26088,21 → 27928,25
} for
 
% Calculate the number of bits remaining to the next valid symbol size
{
/bitcapsmaps <<
/a [
[167 138 118 108 88 78 59]
[167 138 118 98 78]
[197 167 138 108 78]
]
/b [
[ 336 296 256 208 160 104 56]
[ 768 648 536 416 304 208 152 112 72 32]
[1184 1016 840 672 496 352 264 208 152 96 56]
]
>> def
} ctxdef
 
/rembits {
/used exch def
ccversion (c) ne { % cc-a or cc-b
<<
/a [
[167 138 118 108 88 78 59]
[167 138 118 98 78]
[197 167 138 108 78]
]
/b [
[ 336 296 256 208 160 104 56]
[ 768 648 536 416 304 208 152 112 72 32]
[1184 1016 840 672 496 352 264 208 152 96 56]
]
>> ccversion get cccolumns 2 sub get /bitcaps exch def
/bitcaps bitcapsmaps ccversion get cccolumns 2 sub get def
-1 bitcaps {dup used ge {exch} if pop} forall
dup -1 ne {used sub} if
} {
26139,7 → 27983,7
} ifelse
used rembits
} if
} bind def
} def
 
/encode {
dup /raw ne {exch get} {pop} ifelse
26147,7 → 27991,7
dup length exch
gpfenc exch j exch putinterval
/j exch j add def
} bind def
} def
 
% Pre-compute alphanumeric and numeric runlengths and position of next ISO646-only characters
/numericruns [ gpf length {0} repeat 0 -1 ] def
26293,21 → 28137,24
pad aload pop
] def
 
{
/pwr928 [
[ 0 0 0 0 0 0 1 ]
68 {7 array} repeat
] def
1 1 68 {
/j exch def
/v 0 def
6 -1 1 {
/i exch def
/v pwr928 j 1 sub get i get 2 mul v 928 idiv add def
pwr928 j get i v 928 mod put
} for
pwr928 j get 0 pwr928 j 1 sub get 0 get 2 mul v 928 idiv add put
} for
} ctxdef
 
ccversion (a) eq {
/pwr928 [
[ 0 0 0 0 0 0 1 ]
68 {7 array} repeat
] def
1 1 68 {
/j exch def
/v 0 def
6 -1 1 {
/i exch def
/v pwr928 j 1 sub get i get 2 mul v 928 idiv add def
pwr928 j get i v 928 mod put
} for
pwr928 j get 0 pwr928 j 1 sub get 0 get 2 mul v 928 idiv add put
} for
/cws [ 28 {0} repeat ] def
/b 0 def /c 0 def
{ % loop
26381,6 → 28228,8
args
dontdraw not //renmatrix if
 
//unloadctx exec
 
end
 
}
26394,18 → 28243,19
% --END ENCODER gs1-cc--
 
% --BEGIN ENCODER ean13composite--
% --REQUIRES preamble raiseerror parseinput gs1lint renlinear renmatrix ean5 ean2 ean13 micropdf417 pdf417 gs1-cc--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renlinear renmatrix ean5 ean2 ean13 micropdf417 pdf417 gs1-cc--
% --DESC: EAN-13 Composite
% --EXAM: 2112345678900|(99)1234-abcd
% --EXOP: includetext
% --RNDR: renlinear renmatrix
%%BeginResource: uk.co.terryburton.bwipp ean13composite 0.0 2021092800 83015 86399
%%BeginData: 74 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp ean13composite 0.0 2022072900 93981 93421
%%BeginData: 86 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /ean13 dup /uk.co.terryburton.bwipp findresource put
dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put
dup /gs1process dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
begin
26416,7 → 28266,11
/options exch def
/barcode exch def
 
/ctx null def
/dontdraw false def
/parse false def
/dontlint false def
/lintreqs true def
 
% Parse the input options
options type /stringtype eq {
26443,7 → 28297,14
options (lintype) (ean13) put
options (inkspread) (0) put
options (dontdraw) true put
options (dontlint) true put
 
% Lint with a fake AI (01)
comp length 18 add string
dup 0 ((01)00000000000000) putinterval
dup 18 comp putinterval
/ai //gs1process exec pop pop pop
 
% Plot the linear part
linear options //ean13 exec //renlinear exec
 
26480,18 → 28341,19
% --END ENCODER ean13composite--
 
% --BEGIN ENCODER ean8composite--
% --REQUIRES preamble raiseerror parseinput gs1lint renlinear renmatrix ean5 ean2 ean8 micropdf417 pdf417 gs1-cc--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renlinear renmatrix ean5 ean2 ean8 micropdf417 pdf417 gs1-cc--
% --DESC: EAN-8 Composite
% --EXAM: 02345673|(21)A12345678
% --EXOP: includetext
% --RNDR: renlinear renmatrix
%%BeginResource: uk.co.terryburton.bwipp ean8composite 0.0 2021092800 86788 86741
%%BeginData: 77 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp ean8composite 0.0 2022072900 94322 90331
%%BeginData: 89 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /ean8 dup /uk.co.terryburton.bwipp findresource put
dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put
dup /gs1process dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
begin
26502,7 → 28364,11
/options exch def
/barcode exch def
 
/ctx null def
/dontdraw false def
/parse false def
/dontlint false def
/lintreqs true def
 
% Parse the input options
options type /stringtype eq {
26530,7 → 28396,14
options (lintype) (ean8) put
options (inkspread) (0) put
options (dontdraw) true put
options (dontlint) true put
 
% Lint with a fake AI (01)
comp length 18 add string
dup 0 ((01)00000000000000) putinterval
dup 18 comp putinterval
/ai //gs1process exec pop pop pop
 
% Plot the linear part
linear options //ean8 exec //renlinear exec
 
26569,18 → 28442,19
% --END ENCODER ean8composite--
 
% --BEGIN ENCODER upcacomposite--
% --REQUIRES preamble raiseerror parseinput gs1lint renlinear renmatrix ean5 ean2 upca micropdf417 pdf417 gs1-cc--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renlinear renmatrix ean5 ean2 upca micropdf417 pdf417 gs1-cc--
% --DESC: UPC-A Composite
% --EXAM: 416000336108|(99)1234-abcd
% --EXOP: includetext
% --RNDR: renlinear renmatrix
%%BeginResource: uk.co.terryburton.bwipp upcacomposite 0.0 2021092800 86425 82946
%%BeginData: 74 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp upcacomposite 0.0 2022072900 93975 93416
%%BeginData: 86 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
2 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /upca dup /uk.co.terryburton.bwipp findresource put
dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put
dup /gs1process dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
begin
26591,7 → 28465,11
/options exch def
/barcode exch def
 
/ctx null def
/dontdraw false def
/parse false def
/dontlint false def
/lintreqs true def
 
% Parse the input options
options type /stringtype eq {
26618,7 → 28496,14
options (lintype) (ean13) put
options (inkspread) (0) put
options (dontdraw) true put
options (dontlint) true put
 
% Lint with a fake AI (01)
comp length 18 add string
dup 0 ((01)00000000000000) putinterval
dup 18 comp putinterval
/ai //gs1process exec pop pop pop
 
% Plot the linear part
linear options //upca exec //renlinear exec
 
26655,18 → 28540,19
% --END ENCODER upcacomposite--
 
% --BEGIN ENCODER upcecomposite--
% --REQUIRES preamble raiseerror parseinput gs1lint renlinear renmatrix ean5 ean2 upce micropdf417 pdf417 gs1-cc--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renlinear renmatrix ean5 ean2 upce micropdf417 pdf417 gs1-cc--
% --DESC: UPC-E Composite
% --EXAM: 00123457|(15)021231
% --EXOP: includetext
% --RNDR: renlinear renmatrix
%%BeginResource: uk.co.terryburton.bwipp upcecomposite 0.0 2021092800 87707 87649
%%BeginData: 89 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp upcecomposite 0.0 2022072900 91689 90991
%%BeginData: 101 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
2 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /upce dup /uk.co.terryburton.bwipp findresource put
dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put
dup /gs1process dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
begin
26677,7 → 28563,11
/options exch def
/barcode exch def
 
/ctx null def
/dontdraw false def
/parse false def
/dontlint false def
/lintreqs true def
 
% Parse the input options
options type /stringtype eq {
26719,7 → 28609,14
options (lintype) (upce) put
options (inkspread) (0) put
options (dontdraw) true put
options (dontlint) true put
 
% Lint with a fake AI (01)
comp length 18 add string
dup 0 ((01)00000000000000) putinterval
dup 18 comp putinterval
/ai //gs1process exec pop pop pop
 
% Plot the linear part
linear options //upce exec //renlinear exec
 
26756,18 → 28653,19
% --END ENCODER upcecomposite--
 
% --BEGIN ENCODER databaromnicomposite--
% --REQUIRES preamble raiseerror parseinput gs1lint renlinear renmatrix databaromni micropdf417 pdf417 gs1-cc--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renlinear renmatrix databaromni micropdf417 pdf417 gs1-cc--
% --DESC: GS1 DataBar Omnidirectional Composite
% --EXAM: (01)03612345678904|(11)990102
% --EXOP:
% --RNDR: renlinear renmatrix
%%BeginResource: uk.co.terryburton.bwipp databaromnicomposite 0.0 2021092800 84062 87382
%%BeginData: 102 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp databaromnicomposite 0.0 2022072900 91130 94450
%%BeginData: 114 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
2 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /databaromni dup /uk.co.terryburton.bwipp findresource put
dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put
dup /gs1process dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
begin
26778,7 → 28676,11
/options exch def
/barcode exch def
 
/ctx null def
/dontdraw false def
/parse false def
/dontlint false def
/lintreqs true def
 
% Parse the input options
options type /stringtype eq {
26806,7 → 28708,14
options (linkage) true put
options (inkspread) (0) put
options (dontdraw) true put
options (dontlint) true put
 
% Lint the combined AI element strings
linear length comp length add string
dup 0 linear putinterval
dup linear length comp putinterval
/ai //gs1process exec pop pop pop
 
% Plot the linear part
linear options //databaromni exec
dup (sbs) get /linsbs exch def
26870,18 → 28779,19
% --END ENCODER databaromnicomposite--
 
% --BEGIN ENCODER databarstackedcomposite--
% --REQUIRES preamble raiseerror parseinput gs1lint renlinear renmatrix databaromni databarstacked micropdf417 pdf417 gs1-cc--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renlinear renmatrix databaromni databarstacked micropdf417 pdf417 gs1-cc--
% --DESC: GS1 DataBar Stacked Composite
% --EXAM: (01)03412345678900|(17)010200
% --EXOP:
% --RNDR: renlinear renmatrix
%%BeginResource: uk.co.terryburton.bwipp databarstackedcomposite 0.0 2021092800 85882 85781
%%BeginData: 98 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp databarstackedcomposite 0.0 2022072900 92950 96281
%%BeginData: 110 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
2 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /databarstacked dup /uk.co.terryburton.bwipp findresource put
dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put
dup /gs1process dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
begin
/databarstackedcomposite {
26891,7 → 28801,11
/options exch def
/barcode exch def
 
/ctx null def
/dontdraw false def
/parse false def
/dontlint false def
/lintreqs true def
 
% Parse the input options
options type /stringtype eq {
26919,7 → 28833,14
options (linkage) true put
options (inkspread) (0) put
options (dontdraw) true put
options (dontlint) true put
 
% Lint the combined AI element strings
linear length comp length add string
dup 0 linear putinterval
dup linear length comp putinterval
/ai //gs1process exec pop pop pop
 
% Plot the linear part
linear options //databarstacked exec
dup (pixs) get 0 2 index (pixx) get getinterval /bot exch def
26980,18 → 28901,19
% --END ENCODER databarstackedcomposite--
 
% --BEGIN ENCODER databarstackedomnicomposite--
% --REQUIRES preamble raiseerror parseinput gs1lint renlinear renmatrix databaromni databarstackedomni micropdf417 pdf417 gs1-cc--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renlinear renmatrix databaromni databarstackedomni micropdf417 pdf417 gs1-cc--
% --DESC: GS1 DataBar Stacked Omnidirectional Composite
% --EXAM: (01)03612345678904|(11)990102
% --EXOP:
% --RNDR: renlinear renmatrix
%%BeginResource: uk.co.terryburton.bwipp databarstackedomnicomposite 0.0 2021092800 85910 85805
%%BeginData: 98 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp databarstackedomnicomposite 0.0 2022072900 92978 96305
%%BeginData: 110 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
2 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /databarstackedomni dup /uk.co.terryburton.bwipp findresource put
dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put
dup /gs1process dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
begin
/databarstackedomnicomposite {
27001,7 → 28923,11
/options exch def
/barcode exch def
 
/ctx null def
/dontdraw false def
/parse false def
/dontlint false def
/lintreqs true def
 
% Parse the input options
options type /stringtype eq {
27029,7 → 28955,14
options (linkage) true put
options (inkspread) (0) put
options (dontdraw) true put
options (dontlint) true put
 
% Lint the combined AI element strings
linear length comp length add string
dup 0 linear putinterval
dup linear length comp putinterval
/ai //gs1process exec pop pop pop
 
% Plot the linear part
linear options //databarstackedomni exec
dup (pixs) get 0 2 index (pixx) get getinterval /bot exch def
27090,18 → 29023,19
% --END ENCODER databarstackedomnicomposite--
 
% --BEGIN ENCODER databartruncatedcomposite--
% --REQUIRES preamble raiseerror parseinput gs1lint renlinear renmatrix databaromni databartruncated micropdf417 pdf417 gs1-cc--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renlinear renmatrix databaromni databartruncated micropdf417 pdf417 gs1-cc--
% --DESC: GS1 DataBar Truncated Composite
% --EXAM: (01)03612345678904|(11)990102
% --EXOP:
% --RNDR: renlinear renmatrix
%%BeginResource: uk.co.terryburton.bwipp databartruncatedcomposite 0.0 2021092800 86952 86835
%%BeginData: 102 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp databartruncatedcomposite 0.0 2022072900 94020 97335
%%BeginData: 114 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
2 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /databartruncated dup /uk.co.terryburton.bwipp findresource put
dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put
dup /gs1process dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
begin
27112,7 → 29046,11
/options exch def
/barcode exch def
 
/ctx null def
/dontdraw false def
/parse false def
/dontlint false def
/lintreqs true def
 
% Parse the input options
options type /stringtype eq {
27140,7 → 29078,14
options (linkage) true put
options (inkspread) (0) put
options (dontdraw) true put
options (dontlint) true put
 
% Lint the combined AI element strings
linear length comp length add string
dup 0 linear putinterval
dup linear length comp putinterval
/ai //gs1process exec pop pop pop
 
% Plot the linear part
linear options //databartruncated exec
dup (sbs) get /linsbs exch def
27204,18 → 29149,19
% --END ENCODER databartruncatedcomposite--
 
% --BEGIN ENCODER databarlimitedcomposite--
% --REQUIRES preamble raiseerror parseinput gs1lint renlinear renmatrix databarlimited micropdf417 pdf417 gs1-cc--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renlinear renmatrix databarlimited micropdf417 pdf417 gs1-cc--
% --DESC: GS1 DataBar Limited Composite
% --EXAM: (01)03512345678907|(21)abcdefghijklmnopqrstuv
% --EXAM: (01)03512345678907|(21)abcdefghijklmnopqrst
% --EXOP:
% --RNDR: renlinear renmatrix
%%BeginResource: uk.co.terryburton.bwipp databarlimitedcomposite 0.0 2021092800 80359 83692
%%BeginData: 81 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp databarlimitedcomposite 0.0 2022072900 87443 90880
%%BeginData: 93 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
2 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /databarlimited dup /uk.co.terryburton.bwipp findresource put
dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put
dup /gs1process dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
begin
27226,7 → 29172,11
/options exch def
/barcode exch def
 
/ctx null def
/dontdraw false def
/parse false def
/dontlint false def
/lintreqs true def
 
% Parse the input options
options type /stringtype eq {
27254,7 → 29204,14
options (linkage) true put
options (inkspread) (0) put
options (dontdraw) true put
options (dontlint) true put
 
% Lint the combined AI element strings
linear length comp length add string
dup 0 linear putinterval
dup linear length comp putinterval
/ai //gs1process exec pop pop pop
 
% Plot the linear part
linear options //databarlimited exec
dup (sbs) get /linsbs exch def
27297,18 → 29254,19
% --END ENCODER databarlimitedcomposite--
 
% --BEGIN ENCODER databarexpandedcomposite--
% --REQUIRES preamble raiseerror parseinput gs1lint renlinear renmatrix databarexpanded micropdf417 pdf417 gs1-cc--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renlinear renmatrix databarexpanded micropdf417 pdf417 gs1-cc--
% --DESC: GS1 DataBar Expanded Composite
% --EXAM: (01)93712345678904(3103)001234|(91)1A2B3C4D5E
% --EXOP:
% --RNDR: renlinear renmatrix
%%BeginResource: uk.co.terryburton.bwipp databarexpandedcomposite 0.0 2021092800 86821 83262
%%BeginData: 100 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp databarexpandedcomposite 0.0 2022072900 97433 90314
%%BeginData: 112 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
2 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /databarexpanded dup /uk.co.terryburton.bwipp findresource put
dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put
dup /gs1process dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
begin
27319,7 → 29277,11
/options exch def
/barcode exch def
 
/ctx null def
/dontdraw false def
/parse false def
/dontlint false def
/lintreqs true def
 
% Parse the input options
options type /stringtype eq {
27347,7 → 29309,14
options (linkage) true put
options (inkspread) (0) put
options (dontdraw) true put
options (dontlint) true put
 
% Lint the combined AI element strings
linear length comp length add string
dup 0 linear putinterval
dup linear length comp putinterval
/ai //gs1process exec pop pop pop
 
% Plot the linear part
linear options //databarexpanded exec
dup (sbs) get /linsbs exch def
27370,7 → 29339,7
} ifelse
sep exch i exch put
} for
} bind def
} def
mark
0 linsbs {1 index 1 eq {{0}} {{1}} ifelse repeat} forall
counttomark 1 sub array astore /bot exch def pop pop
27409,18 → 29378,19
% --END ENCODER databarexpandedcomposite--
 
% --BEGIN ENCODER databarexpandedstackedcomposite--
% --REQUIRES preamble raiseerror parseinput gs1lint renlinear renmatrix databarexpanded databarexpandedstacked micropdf417 pdf417 gs1-cc--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renlinear renmatrix databarexpanded databarexpandedstacked micropdf417 pdf417 gs1-cc--
% --DESC: GS1 DataBar Expanded Stacked Composite
% --EXAM: (01)00012345678905(10)ABCDEF|(21)12345678
% --EXOP: segments=4
% --RNDR: renmatrix renlinear
%%BeginResource: uk.co.terryburton.bwipp databarexpandedstackedcomposite 0.0 2021092800 89045 85493
%%BeginData: 97 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp databarexpandedstackedcomposite 0.0 2022072900 96049 95929
%%BeginData: 109 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
2 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /databarexpandedstacked dup /uk.co.terryburton.bwipp findresource put
dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put
dup /gs1process dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
begin
/databarexpandedstackedcomposite {
27430,7 → 29400,11
/options exch def
/barcode exch def
 
/ctx null def
/dontdraw false def
/parse false def
/dontlint false def
/lintreqs true def
 
% Parse the input options
options type /stringtype eq {
27458,7 → 29432,14
options (linkage) true put
options (inkspread) (0) put
options (dontdraw) true put
options (dontlint) true put
 
% Lint the combined AI element strings
linear length comp length add string
dup 0 linear putinterval
dup linear length comp putinterval
/ai //gs1process exec pop pop pop
 
% Plot the linear part
linear options //databarexpandedstacked exec
dup (pixs) get 0 2 index (pixx) get getinterval /bot exch def
27481,7 → 29462,7
} ifelse
sep exch i exch put
} for
} bind def
} def
/sep [ bot {1 exch sub} forall ] def
sep 0 [ 0 0 0 0 ] putinterval
sep sep length 4 sub [ 0 0 0 0 ] putinterval
27518,18 → 29499,19
% --END ENCODER databarexpandedstackedcomposite--
 
% --BEGIN ENCODER gs1-128composite--
% --REQUIRES preamble raiseerror parseinput gs1lint renlinear renmatrix code128 gs1-128 micropdf417 pdf417 gs1-cc--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renlinear renmatrix code128 gs1-128 micropdf417 pdf417 gs1-cc--
% --DESC: GS1-128 Composite
% --EXAM: (00)030123456789012340|(02)13012345678909(37)24(10)1234567ABCDEFG
% --EXOP: ccversion=c
% --RNDR: renlinear renmatrix
%%BeginResource: uk.co.terryburton.bwipp gs1-128composite 0.0 2021092800 86500 89809
%%BeginData: 102 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp gs1-128composite 0.0 2022072900 97016 96997
%%BeginData: 114 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
2 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /gs1-128 dup /uk.co.terryburton.bwipp findresource put
dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put
dup /gs1process dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
begin
27540,7 → 29522,11
/options exch def
/barcode exch def
 
/ctx null def
/dontdraw false def
/parse false def
/dontlint false def
/lintreqs true def
 
% Parse the input options
options type /stringtype eq {
27566,7 → 29552,14
 
options (inkspread) (0) put
options (dontdraw) true put
options (dontlint) true put
 
% Lint the combined AI element strings
linear length comp length add string
dup 0 linear putinterval
dup linear length comp putinterval
/ai //gs1process exec pop pop pop
 
% Dummy plot of linear part with CC-A to get width
options (linkagea) true put
linear << options {} forall >> //gs1-128 exec
27632,18 → 29625,17
% --END ENCODER gs1-128composite--
 
% --BEGIN ENCODER gs1datamatrix--
% --REQUIRES preamble raiseerror parseinput gs1lint renmatrix datamatrix--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renmatrix datamatrix--
% --DESC: GS1 Data Matrix
% --EXAM: (01)03453120000011(17)120508(10)ABCD1234(410)9501101020917
% --EXOP:
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp gs1datamatrix 0.0 2021092800 74645 81522
%%BeginData: 134 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp gs1datamatrix 0.0 2022072900 77432 73954
%%BeginData: 91 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /gs1lint dup /uk.co.terryburton.bwipp findresource put
dup /gs1process dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
dup /datamatrix dup /uk.co.terryburton.bwipp findresource put
begin
27654,9 → 29646,11
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/parse false def
/dontlint false def
/lintreqs true def
/gssep false def
 
% Parse the input options
27670,55 → 29664,11
} if
options {def} forall
 
% Expand ordinals of the form ^NNN to ASCII
/expand {
/fncvals <<
/parse parse
/parseonly true
/parsefnc false
>> def
fncvals //parseinput exec
} bind def
barcode /ai //gs1process exec
/fncs exch def
/vals exch def
/ais exch def
 
% Parse out AIs
/ais [] def
/vals [] def
barcode dup length 1 sub 1 exch getinterval
{ % loop
dup () eq {exit} if
(\)) search pop
exch pop
exch (\() search {
exch pop exch 3 1 roll
} {
() 3 1 roll
} ifelse
[ ais aload pop counttomark 2 add index ] /ais exch def
[ vals aload pop counttomark 1 add index expand ] /vals exch def
pop pop
} loop
pop
 
dontlint not { ais vals //gs1lint exec pop } if
 
% Pre-defined fixed length data field AIs
% any AI whose prefix is not included in this table must be
% terminated with "FNC1", even if it's fixed length
/aifixed 23 dict def
[
0 1 4 {} for
] {
(00) 2 string copy dup dup 1 5 -1 roll 48 add put aifixed 3 1 roll put
} forall
[
11 1 20 {} for
23
31 1 36 {} for
41
] {
10 2 string cvrs dup aifixed 3 1 roll put
} forall
 
% Create the datamatrix data
/fnc1 -1 def
/dmtx [ fnc1 ] def
27731,7 → 29681,7
dup dmtx length ai [ exch {} forall ] putinterval
dup dmtx length ai length add val [ exch {} forall ] putinterval
/dmtx exch def
i ais length 1 sub ne aifixed ai 0 2 getinterval known not and { % Append FNC1
i ais length 1 sub ne fncs i get and { % Append FNC1
dmtx length 1 add array
dup 0 dmtx putinterval
dup dmtx length gssep {29} {fnc1} ifelse put
27778,18 → 29728,17
% --END ENCODER gs1datamatrix--
 
% --BEGIN ENCODER gs1datamatrixrectangular--
% --REQUIRES preamble raiseerror parseinput gs1lint renmatrix datamatrix--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renmatrix datamatrix--
% --DESC: GS1 Data Matrix Rectangular
% --EXAM: (01)03453120000011(17)120508(10)ABCD1234(410)9501101020917
% --EXOP:
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp gs1datamatrixrectangular 0.0 2021092800 74848 81714
%%BeginData: 135 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp gs1datamatrixrectangular 0.0 2022072900 77747 74258
%%BeginData: 92 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /gs1lint dup /uk.co.terryburton.bwipp findresource put
dup /gs1process dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
dup /datamatrix dup /uk.co.terryburton.bwipp findresource put
begin
27800,8 → 29749,10
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/parse false def
/dontlint false def
/lintreqs true def
/dontdraw false def
/gssep false def
 
27816,55 → 29767,11
} if
options {def} forall
 
% Expand ordinals of the form ^NNN to ASCII
/expand {
/fncvals <<
/parse parse
/parseonly true
/parsefnc false
>> def
fncvals //parseinput exec
} bind def
barcode /ai //gs1process exec
/fncs exch def
/vals exch def
/ais exch def
 
% Parse out AIs
/ais [] def
/vals [] def
barcode dup length 1 sub 1 exch getinterval
{ % loop
dup () eq {exit} if
(\)) search pop
exch pop
exch (\() search {
exch pop exch 3 1 roll
} {
() 3 1 roll
} ifelse
[ ais aload pop counttomark 2 add index ] /ais exch def
[ vals aload pop counttomark 1 add index expand ] /vals exch def
pop pop
} loop
pop
 
dontlint not { ais vals //gs1lint exec pop } if
 
% Pre-defined fixed length data field AIs
% any AI whose prefix is not included in this table must be
% terminated with "FNC1", even if it's fixed length
/aifixed 23 dict def
[
0 1 4 {} for
] {
(00) 2 string copy dup dup 1 5 -1 roll 48 add put aifixed 3 1 roll put
} forall
[
11 1 20 {} for
23
31 1 36 {} for
41
] {
10 2 string cvrs dup aifixed 3 1 roll put
} forall
 
% Create the datamatrix data
/fnc1 -1 def
/dmtx [ fnc1 ] def
27877,7 → 29784,7
dup dmtx length ai [ exch {} forall ] putinterval
dup dmtx length ai length add val [ exch {} forall ] putinterval
/dmtx exch def
i ais length 1 sub ne aifixed ai 0 2 getinterval known not and { % Append FNC1
i ais length 1 sub ne fncs i get and { % Append FNC1
dmtx length 1 add array
dup 0 dmtx putinterval
dup dmtx length gssep {29} {fnc1} ifelse put
27924,18 → 29831,88
%%EndResource
% --END ENCODER gs1datamatrixrectangular--
 
% --BEGIN ENCODER gs1dldatamatrix--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renmatrix datamatrix--
% --DESC: GS1 Digital Link Data Matrix
% --EXAM: https://id.gs1.org/01/12312312312333/22/ABC%2d123?99=XYZ%2f987#test
% --EXOP:
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp gs1dldatamatrix 0.0 2022072900 70572 63571
%%BeginData: 59 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
10 dict
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /gs1process dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
dup /datamatrix dup /uk.co.terryburton.bwipp findresource put
begin
/gs1dldatamatrix {
 
20 dict begin % Confine variables to local scope
 
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/parse false def
/dontlint false def
/lintreqs true def
/dontdraw false def
 
% Parse the input options
options type /stringtype eq {
1 dict begin
options {
token false eq {exit} if dup length string cvs (=) search
true eq {cvlit exch pop exch def} {cvlit true def} ifelse
} loop
currentdict end /options exch def
} if
options {def} forall
 
% Parse the input
/fncvals <<
/parse parse
/parseonly true
/parsefnc false
>> def
/barcode barcode fncvals //parseinput exec def
 
barcode /dl //gs1process exec pop pop pop
 
% Get the result of encoding with datamatrix
options (parse) undef
options (dontdraw) true put
/args barcode options //datamatrix exec def
 
args (opt) options put
args
 
dontdraw not //renmatrix if
 
end
 
}
[/barcode] {null def} forall
bind def
/gs1dldatamatrix dup load /uk.co.terryburton.bwipp defineresource pop
end
/setpacking where {pop setpacking} if
%%EndData
%%EndResource
% --END ENCODER gs1dldatamatrix--
 
% --BEGIN ENCODER gs1qrcode--
% --REQUIRES preamble raiseerror parseinput gs1lint renmatrix qrcode--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renmatrix qrcode--
% --DESC: GS1 QR Code
% --EXAM: (01)03453120000011(8200)http://www.abc.net(10)ABCD1234(410)9501101020917
% --EXOP:
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp gs1qrcode 0.0 2021092800 74363 77838
%%BeginData: 132 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp gs1qrcode 0.0 2022072900 77214 73742
%%BeginData: 89 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /gs1lint dup /uk.co.terryburton.bwipp findresource put
10 dict
dup /gs1process dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
dup /qrcode dup /uk.co.terryburton.bwipp findresource put
begin
27946,8 → 29923,10
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/parse false def
/dontlint false def
/lintreqs true def
/dontdraw false def
 
% Parse the input options
27961,55 → 29940,11
} if
options {def} forall
 
% Expand ordinals of the form ^NNN to ASCII
/expand {
/fncvals <<
/parse parse
/parseonly true
/parsefnc false
>> def
fncvals //parseinput exec
} bind def
barcode /ai //gs1process exec
/fncs exch def
/vals exch def
/ais exch def
 
% Parse out AIs
/ais [] def
/vals [] def
barcode dup length 1 sub 1 exch getinterval
{ % loop
dup () eq {exit} if
(\)) search pop
exch pop
exch (\() search {
exch pop exch 3 1 roll
} {
() 3 1 roll
} ifelse
[ ais aload pop counttomark 2 add index ] /ais exch def
[ vals aload pop counttomark 1 add index expand ] /vals exch def
pop pop
} loop
pop
 
dontlint not { ais vals //gs1lint exec pop } if
 
% Pre-defined fixed length data field AIs
% any AI whose prefix is not included in this table must be
% terminated with "FNC1", even if it's fixed length
/aifixed 23 dict def
[
0 1 4 {} for
] {
(00) 2 string copy dup dup 1 5 -1 roll 48 add put aifixed 3 1 roll put
} forall
[
11 1 20 {} for
23
31 1 36 {} for
41
] {
10 2 string cvrs dup aifixed 3 1 roll put
} forall
 
% Create the qrcode data
/fnc1 -1 def
/qrc [ fnc1 ] def
28022,7 → 29957,7
dup qrc length ai [ exch {} forall ] putinterval
dup qrc length ai length add val [ exch {} forall ] putinterval
/qrc exch def
i ais length 1 sub ne aifixed ai 0 2 getinterval known not and { % Append FNC1
i ais length 1 sub ne fncs i get and { % Append FNC1
qrc length 1 add array
dup 0 qrc putinterval
dup qrc length fnc1 put
28068,19 → 30003,89
%%EndResource
% --END ENCODER gs1qrcode--
 
% --BEGIN ENCODER gs1dlqrcode--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renmatrix qrcode--
% --DESC: GS1 Digital Link QR Code
% --EXAM: https://id.gs1.org/01/12312312312333/22/ABC%2d123?99=XYZ%2f987#test
% --EXOP:
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp gs1dlqrcode 0.0 2022072900 70548 63551
%%BeginData: 59 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
10 dict
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /gs1process dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
dup /qrcode dup /uk.co.terryburton.bwipp findresource put
begin
/gs1dlqrcode {
 
20 dict begin % Confine variables to local scope
 
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/parse false def
/dontlint false def
/lintreqs true def
/dontdraw false def
 
% Parse the input options
options type /stringtype eq {
1 dict begin
options {
token false eq {exit} if dup length string cvs (=) search
true eq {cvlit exch pop exch def} {cvlit true def} ifelse
} loop
currentdict end /options exch def
} if
options {def} forall
 
% Parse the input
/fncvals <<
/parse parse
/parseonly true
/parsefnc false
>> def
/barcode barcode fncvals //parseinput exec def
 
barcode /dl //gs1process exec pop pop pop
 
% Get the result of encoding with qrcode
options (parse) undef
options (dontdraw) true put
/args barcode options //qrcode exec def
 
args (opt) options put
args
 
dontdraw not //renmatrix if
 
end
 
}
[/barcode] {null def} forall
bind def
/gs1dlqrcode dup load /uk.co.terryburton.bwipp defineresource pop
end
/setpacking where {pop setpacking} if
%%EndData
%%EndResource
% --END ENCODER gs1dlqrcode--
 
% --BEGIN ENCODER gs1dotcode--
% --REQUIRES preamble raiseerror parseinput gs1lint renmatrix dotcode--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renmatrix dotcode--
% --DESC: GS1 DotCode
% --EXAM: (235)5vBZIF%!<B;?oa%(01)01234567890128(8008)19052001
% --EXOP: rows=16
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp gs1dotcode 0.0 2021092800 74370 81275
%%BeginData: 133 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp gs1dotcode 0.0 2022072900 77157 73683
%%BeginData: 90 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /parseinput dup /uk.co.terryburton.bwipp findresource put
dup /gs1lint dup /uk.co.terryburton.bwipp findresource put
dup /gs1process dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
dup /dotcode dup /uk.co.terryburton.bwipp findresource put
begin
28091,9 → 30096,11
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/parse false def
/dontlint false def
/lintreqs true def
 
% Parse the input options
options type /stringtype eq {
28106,55 → 30113,11
} if
options {def} forall
 
% Expand ordinals of the form ^NNN to ASCII
/expand {
/fncvals <<
/parse parse
/parseonly true
/parsefnc false
>> def
fncvals //parseinput exec
} bind def
barcode /ai //gs1process exec
/fncs exch def
/vals exch def
/ais exch def
 
% Parse out AIs
/ais [] def
/vals [] def
barcode dup length 1 sub 1 exch getinterval
{ % loop
dup () eq {exit} if
(\)) search pop
exch pop
exch (\() search {
exch pop exch 3 1 roll
} {
() 3 1 roll
} ifelse
[ ais aload pop counttomark 2 add index ] /ais exch def
[ vals aload pop counttomark 1 add index expand ] /vals exch def
pop pop
} loop
pop
 
dontlint not { ais vals //gs1lint exec pop } if
 
% Pre-defined fixed length data field AIs
% any AI whose prefix is not included in this table must be
% terminated with "FNC1", even if it's fixed length
/aifixed 23 dict def
[
0 1 4 {} for
] {
(00) 2 string copy dup dup 1 5 -1 roll 48 add put aifixed 3 1 roll put
} forall
[
11 1 20 {} for
23
31 1 36 {} for
41
] {
10 2 string cvrs dup aifixed 3 1 roll put
} forall
 
% Create the dotcode data
/fnc1 -1 def
/dmtx [ fnc1 ] def
28167,7 → 30130,7
dup dmtx length ai [ exch {} forall ] putinterval
dup dmtx length ai length add val [ exch {} forall ] putinterval
/dmtx exch def
i ais length 1 sub ne aifixed ai 0 2 getinterval known not and { % Append FNC1
i ais length 1 sub ne fncs i get and { % Append FNC1
dmtx length 1 add array
dup 0 dmtx putinterval
dup dmtx length fnc1 put
28214,15 → 30177,17
% --END ENCODER gs1dotcode--
 
% --BEGIN ENCODER hibccode39--
% --REQUIRES preamble raiseerror renlinear code39--
% --REQUIRES preamble loadctx unloadctx raiseerror renlinear code39--
% --DESC: HIBC Code 39
% --EXAM: A123BJC5D6E71
% --EXOP: includetext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp hibccode39 0.0 2021092800 57669 57712
%%BeginData: 94 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp hibccode39 0.0 2022072900 63587 66902
%%BeginData: 103 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /code39 dup /uk.co.terryburton.bwipp findresource put
28234,6 → 30199,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/textfont /Courier def
/textsize 10 def
28257,10 → 30223,14
/textyoffset textyoffset cvr def
/textxoffset textxoffset cvr def
 
/hibccode39 //loadctx exec
 
% Create a string of the available characters
{
/barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def
/charvals 43 dict def
0 1 42 {charvals exch dup barchars exch 1 getinterval exch put} for
} ctxdef
 
% Validate the input
0 1 barcode length 1 sub {
28307,6 → 30277,8
 
dontdraw not //renlinear if
 
//unloadctx exec
 
end
 
}
28320,15 → 30292,17
% --END ENCODER hibccode39--
 
% --BEGIN ENCODER hibccode128--
% --REQUIRES preamble raiseerror parseinput renlinear code128--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renlinear code128--
% --DESC: HIBC Code 128
% --EXAM: A123BJC5D6E71
% --EXOP: includetext
% --RNDR: renlinear
%%BeginResource: uk.co.terryburton.bwipp hibccode128 0.0 2021092800 60457 63624
%%BeginData: 93 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp hibccode128 0.0 2022072900 69903 69718
%%BeginData: 102 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
dup /code128 dup /uk.co.terryburton.bwipp findresource put
28340,6 → 30314,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/textfont /Courier def
/textsize 10 def
28363,10 → 30338,14
/textyoffset textyoffset cvr def
/textxoffset textxoffset cvr def
 
/hibccode128 //loadctx exec
 
% Create a string of the available characters
{
/barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def
/charvals 43 dict def
0 1 42 {charvals exch dup barchars exch 1 getinterval exch put} for
} ctxdef
 
% Validate the input
0 1 barcode length 1 sub {
28412,6 → 30391,8
 
dontdraw not //renlinear if
 
//unloadctx exec
 
end
 
}
28425,15 → 30406,17
% --END ENCODER hibccode128--
 
% --BEGIN ENCODER hibcdatamatrix--
% --REQUIRES preamble raiseerror parseinput renmatrix datamatrix--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix datamatrix--
% --DESC: HIBC Data Matrix
% --EXAM: A123BJC5D6E71
% --EXOP:
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp hibcdatamatrix 0.0 2021092800 58052 64626
%%BeginData: 76 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp hibcdatamatrix 0.0 2022072900 67434 67144
%%BeginData: 85 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
dup /datamatrix dup /uk.co.terryburton.bwipp findresource put
28445,6 → 30428,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/validatecheck false def
 
28459,10 → 30443,14
} if
options {def} forall
 
/hibcdatamatrix //loadctx exec
 
% Create a string of the available characters
{
/barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def
/charvals 43 dict def
0 1 42 {charvals exch dup barchars exch 1 getinterval exch put} for
} ctxdef
 
% Validate the input
0 1 barcode length 1 sub {
28500,6 → 30488,8
 
dontdraw not //renmatrix if
 
//unloadctx exec
 
end
 
}
28513,15 → 30503,17
% --END ENCODER hibcdatamatrix--
 
% --BEGIN ENCODER hibcdatamatrixrectangular--
% --REQUIRES preamble raiseerror parseinput renmatrix datamatrix--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix datamatrix--
% --DESC: HIBC Data Matrix Rectangular
% --EXAM: A123BJC5D6E71
% --EXOP:
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp hibcdatamatrixrectangular 0.0 2021092800 58173 61386
%%BeginData: 77 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp hibcdatamatrixrectangular 0.0 2022072900 67787 67360
%%BeginData: 86 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
dup /datamatrix dup /uk.co.terryburton.bwipp findresource put
28533,6 → 30525,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/validatecheck false def
 
28547,10 → 30540,14
} if
options {def} forall
 
/hibcdatamatrixrectangular //loadctx exec
 
% Create a string of the available characters
{
/barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def
/charvals 43 dict def
0 1 42 {charvals exch dup barchars exch 1 getinterval exch put} for
} ctxdef
 
% Validate the input
0 1 barcode length 1 sub {
28589,6 → 30586,8
 
dontdraw not //renmatrix if
 
//unloadctx exec
 
end
 
}
28602,15 → 30601,17
% --END ENCODER hibcdatamatrixrectangular--
 
% --BEGIN ENCODER hibcpdf417--
% --REQUIRES preamble raiseerror parseinput renmatrix pdf417--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix pdf417--
% --DESC: HIBC PDF417
% --EXAM: A123BJC5D6E71
% --EXOP:
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp hibcpdf417 0.0 2021092800 58331 61491
%%BeginData: 80 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp hibcpdf417 0.0 2022072900 67737 67465
%%BeginData: 89 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
dup /pdf417 dup /uk.co.terryburton.bwipp findresource put
28622,6 → 30623,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/columns 2 def
/validatecheck false def
28639,10 → 30641,14
 
/columns columns cvi def
 
/hibcpdf417 //loadctx exec
 
% Create a string of the available characters
{
/barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def
/charvals 43 dict def
0 1 42 {charvals exch dup barchars exch 1 getinterval exch put} for
} ctxdef
 
% Validate the input
0 1 barcode length 1 sub {
28681,6 → 30687,8
 
dontdraw not //renmatrix if
 
//unloadctx exec
 
end
 
}
28694,15 → 30702,17
% --END ENCODER hibcpdf417--
 
% --BEGIN ENCODER hibcmicropdf417--
% --REQUIRES preamble raiseerror parseinput renmatrix micropdf417--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix micropdf417--
% --DESC: HIBC MicroPDF417
% --EXAM: A123BJC5D6E71
% --EXOP:
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp hibcmicropdf417 0.0 2021092800 58253 61526
%%BeginData: 80 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp hibcmicropdf417 0.0 2022072900 67763 67500
%%BeginData: 89 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
dup /micropdf417 dup /uk.co.terryburton.bwipp findresource put
28714,6 → 30724,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/columns 2 def
/validatecheck false def
28731,10 → 30742,14
 
/columns columns cvi def
 
/hibcmicropdf417 //loadctx exec
 
% Create a string of the available characters
{
/barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def
/charvals 43 dict def
0 1 42 {charvals exch dup barchars exch 1 getinterval exch put} for
} ctxdef
 
% Validate the input
0 1 barcode length 1 sub {
28773,6 → 30788,8
 
dontdraw not //renmatrix if
 
//unloadctx exec
 
end
 
}
28786,15 → 30803,17
% --END ENCODER hibcmicropdf417--
 
% --BEGIN ENCODER hibcqrcode--
% --REQUIRES preamble raiseerror parseinput renmatrix qrcode--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix qrcode--
% --DESC: HIBC QR Code
% --EXAM: A123BJC5D6E71
% --EXOP:
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp hibcqrcode 0.0 2021092800 61300 64470
%%BeginData: 76 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp hibcqrcode 0.0 2022072900 71782 71498
%%BeginData: 85 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
dup /qrcode dup /uk.co.terryburton.bwipp findresource put
28806,6 → 30825,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/validatecheck false def
 
28820,10 → 30840,14
} if
options {def} forall
 
/hibcqrcode //loadctx exec
 
% Create a string of the available characters
{
/barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def
/charvals 43 dict def
0 1 42 {charvals exch dup barchars exch 1 getinterval exch put} for
} ctxdef
 
% Validate the input
0 1 barcode length 1 sub {
28861,6 → 30885,8
 
dontdraw not //renmatrix if
 
//unloadctx exec
 
end
 
}
28874,15 → 30900,17
% --END ENCODER hibcqrcode--
 
% --BEGIN ENCODER hibccodablockf--
% --REQUIRES preamble raiseerror parseinput renmatrix codablockf--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix codablockf--
% --DESC: HIBC Codablock F
% --EXAM: A123BJC5D6E71
% --EXOP:
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp hibccodablockf 0.0 2021092800 57904 61298
%%BeginData: 76 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp hibccodablockf 0.0 2022072900 67542 67144
%%BeginData: 85 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
dup /codablockf dup /uk.co.terryburton.bwipp findresource put
28894,6 → 30922,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/validatecheck false def
 
28908,10 → 30937,14
} if
options {def} forall
 
/hibccodablockf //loadctx exec
 
% Create a string of the available characters
{
/barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def
/charvals 43 dict def
0 1 42 {charvals exch dup barchars exch 1 getinterval exch put} for
} ctxdef
 
% Validate the input
0 1 barcode length 1 sub {
28949,6 → 30982,8
 
dontdraw not //renmatrix if
 
//unloadctx exec
 
end
 
}
28962,15 → 30997,17
% --END ENCODER hibccodablockf--
 
% --BEGIN ENCODER hibcazteccode--
% --REQUIRES preamble raiseerror parseinput renmatrix azteccode--
% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix azteccode--
% --DESC: HIBC Aztec Code
% --EXAM: A123BJC5D6E71
% --EXOP:
% --RNDR: renmatrix
%%BeginResource: uk.co.terryburton.bwipp hibcazteccode 0.0 2021092800 58002 61059
%%BeginData: 76 ASCII Lines
%%BeginResource: uk.co.terryburton.bwipp hibcazteccode 0.0 2022072900 67432 67241
%%BeginData: 85 ASCII Lines
/setpacking where {pop currentpacking true setpacking} if
1 dict
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
dup /azteccode dup /uk.co.terryburton.bwipp findresource put
28982,6 → 31019,7
/options exch def % We are given an option string
/barcode exch def % We are given a barcode string
 
/ctx null def
/dontdraw false def
/validatecheck false def
 
2