Merge branch 'master' of git.someserver.de:k4ever
This commit is contained in:
		
						commit
						a3223e197c
					
				| 
						 | 
					@ -0,0 +1,409 @@
 | 
				
			||||||
 | 
					%!PS-Adobe-2.0 EPSF-2.0
 | 
				
			||||||
 | 
					%%Creator: Terry Burton
 | 
				
			||||||
 | 
					%%BoundingBox: 50 40 168 122
 | 
				
			||||||
 | 
					%%EndComments
 | 
				
			||||||
 | 
					%%EndProlog
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					currentglobal
 | 
				
			||||||
 | 
					true setglobal
 | 
				
			||||||
 | 
					/Generic /Category findresource
 | 
				
			||||||
 | 
					dup length 1 add dict copy
 | 
				
			||||||
 | 
					dup /InstanceType /packedarraytype put
 | 
				
			||||||
 | 
					/uk.co.terryburton.bwipp exch /Category defineresource pop
 | 
				
			||||||
 | 
					setglobal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/setpacking where {pop currentpacking true setpacking} if
 | 
				
			||||||
 | 
					1 dict
 | 
				
			||||||
 | 
					begin
 | 
				
			||||||
 | 
					/renlinear {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    20 dict begin          % Confine variables to local scope
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /args exch def   % We are given some arguments
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Default options
 | 
				
			||||||
 | 
					    /sbs [] def
 | 
				
			||||||
 | 
					    /bhs [] def
 | 
				
			||||||
 | 
					    /bbs [] def
 | 
				
			||||||
 | 
					    /txt [] def
 | 
				
			||||||
 | 
					    /barcolor (unset) def
 | 
				
			||||||
 | 
					    /includetext false def
 | 
				
			||||||
 | 
					    /textcolor (unset) def
 | 
				
			||||||
 | 
					    /textxalign (unset) def
 | 
				
			||||||
 | 
					    /textyalign (unset) def
 | 
				
			||||||
 | 
					    /textfont (Courier) def
 | 
				
			||||||
 | 
					    /textsize 10 def
 | 
				
			||||||
 | 
					    /textxoffset 0 def
 | 
				
			||||||
 | 
					    /textyoffset 0 def
 | 
				
			||||||
 | 
					    /textgaps 0 def
 | 
				
			||||||
 | 
					    /alttext () def
 | 
				
			||||||
 | 
					    /bordercolor (unset) def
 | 
				
			||||||
 | 
					    /backgroundcolor (unset) def
 | 
				
			||||||
 | 
					    /inkspread 0.15 def
 | 
				
			||||||
 | 
					    /width 0 def
 | 
				
			||||||
 | 
					    /barratio 1 def
 | 
				
			||||||
 | 
					    /spaceratio 1 def
 | 
				
			||||||
 | 
					    /showborder false def
 | 
				
			||||||
 | 
					    /borderleft 10 def
 | 
				
			||||||
 | 
					    /borderright 10 def
 | 
				
			||||||
 | 
					    /bordertop 1 def
 | 
				
			||||||
 | 
					    /borderbottom 1 def
 | 
				
			||||||
 | 
					    /borderwidth 0.5 def
 | 
				
			||||||
 | 
					    /guardwhitespace false def
 | 
				
			||||||
 | 
					    /guardleftpos 0 def
 | 
				
			||||||
 | 
					    /guardleftypos 0 def
 | 
				
			||||||
 | 
					    /guardrightpos 0 def
 | 
				
			||||||
 | 
					    /guardrightypos 0 def
 | 
				
			||||||
 | 
					    /guardwidth 6 def
 | 
				
			||||||
 | 
					    /guardheight 7 def
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    % Apply the renderer options and the user options
 | 
				
			||||||
 | 
					    args {def} forall
 | 
				
			||||||
 | 
					    opt {def} forall 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /barcolor barcolor cvlit def
 | 
				
			||||||
 | 
					    /textcolor textcolor cvlit def
 | 
				
			||||||
 | 
					    /textxalign textxalign cvlit def
 | 
				
			||||||
 | 
					    /textyalign textyalign cvlit def
 | 
				
			||||||
 | 
					    /textfont textfont cvlit def
 | 
				
			||||||
 | 
					    /textsize textsize cvr def
 | 
				
			||||||
 | 
					    /textxoffset textxoffset cvr def
 | 
				
			||||||
 | 
					    /textyoffset textyoffset cvr def
 | 
				
			||||||
 | 
					    /textgaps textgaps cvr def
 | 
				
			||||||
 | 
					    /alttext alttext cvlit def
 | 
				
			||||||
 | 
					    /bordercolor bordercolor cvlit def
 | 
				
			||||||
 | 
					    /backgroundcolor backgroundcolor cvlit def
 | 
				
			||||||
 | 
					    /inkspread inkspread cvr def
 | 
				
			||||||
 | 
					    /width width cvr def
 | 
				
			||||||
 | 
					    /barratio barratio cvr def
 | 
				
			||||||
 | 
					    /spaceratio spaceratio cvr def
 | 
				
			||||||
 | 
					    /borderleft borderleft cvr def
 | 
				
			||||||
 | 
					    /borderright borderright cvr def
 | 
				
			||||||
 | 
					    /bordertop bordertop cvr def
 | 
				
			||||||
 | 
					    /borderbottom borderbottom cvr def
 | 
				
			||||||
 | 
					    /borderwidth borderwidth cvr def
 | 
				
			||||||
 | 
					    /guardleftpos guardleftpos cvr def
 | 
				
			||||||
 | 
					    /guardleftypos guardleftypos cvr def
 | 
				
			||||||
 | 
					    /guardrightpos guardrightpos cvr def
 | 
				
			||||||
 | 
					    /guardrightypos guardrightypos cvr def
 | 
				
			||||||
 | 
					    /guardwidth guardwidth cvr def
 | 
				
			||||||
 | 
					    /guardheight guardheight cvr def
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    % 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
 | 
				
			||||||
 | 
					    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
 | 
				
			||||||
 | 
					            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
 | 
				
			||||||
 | 
					                /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
 | 
				
			||||||
 | 
					            } {
 | 
				
			||||||
 | 
					                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 
 | 
				
			||||||
 | 
					        } ifelse
 | 
				
			||||||
 | 
					        /x x d add def  % x+=d
 | 
				
			||||||
 | 
					    } for
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    gsave
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    currentpoint translate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Force symbol to given width
 | 
				
			||||||
 | 
					    width 0 ne {
 | 
				
			||||||
 | 
					        width 72 mul x div 1 scale
 | 
				
			||||||
 | 
					    } if
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Set RGB or CMYK color depending on length of given hex string
 | 
				
			||||||
 | 
					    /setanycolor {
 | 
				
			||||||
 | 
					        /anycolor exch def
 | 
				
			||||||
 | 
					        anycolor length 6 eq {
 | 
				
			||||||
 | 
					            (<      >) 8 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setrgbcolor
 | 
				
			||||||
 | 
					        } if
 | 
				
			||||||
 | 
					        anycolor length 8 eq {
 | 
				
			||||||
 | 
					            (<        >) 10 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setcmykcolor
 | 
				
			||||||
 | 
					        } if
 | 
				
			||||||
 | 
					    } bind def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % 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    
 | 
				
			||||||
 | 
					    closepath
 | 
				
			||||||
 | 
					    backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if     
 | 
				
			||||||
 | 
					    showborder {
 | 
				
			||||||
 | 
					        gsave
 | 
				
			||||||
 | 
					        bordercolor (unset) ne { bordercolor setanycolor } if
 | 
				
			||||||
 | 
					        borderwidth setlinewidth stroke
 | 
				
			||||||
 | 
					        grestore
 | 
				
			||||||
 | 
					    } if    
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					    % Display the bars for elements in the bars array
 | 
				
			||||||
 | 
					    gsave
 | 
				
			||||||
 | 
					    0 setlinecap
 | 
				
			||||||
 | 
					    barcolor (unset) ne { barcolor setanycolor } if
 | 
				
			||||||
 | 
					    bars {
 | 
				
			||||||
 | 
					        dup -1 ne {
 | 
				
			||||||
 | 
					            aload pop newpath setlinewidth moveto 0 exch rlineto stroke
 | 
				
			||||||
 | 
					        } {
 | 
				
			||||||
 | 
					            pop
 | 
				
			||||||
 | 
					        } ifelse
 | 
				
			||||||
 | 
					    } forall
 | 
				
			||||||
 | 
					    grestore
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    % Display the text for elements in the text array
 | 
				
			||||||
 | 
					    textcolor (unset) ne { textcolor setanycolor } if
 | 
				
			||||||
 | 
					    includetext {
 | 
				
			||||||
 | 
					        textxalign (unset) eq textyalign (unset) eq and alttext () eq and {
 | 
				
			||||||
 | 
					            /s 0 def /f () def
 | 
				
			||||||
 | 
					            txt {
 | 
				
			||||||
 | 
					                {} forall
 | 
				
			||||||
 | 
					                2 copy s ne exch f ne or {
 | 
				
			||||||
 | 
					                    2 copy /s exch def /f exch def            
 | 
				
			||||||
 | 
					                    exch findfont exch scalefont setfont          
 | 
				
			||||||
 | 
					                } {
 | 
				
			||||||
 | 
					                    pop pop
 | 
				
			||||||
 | 
					                } ifelse
 | 
				
			||||||
 | 
					                moveto show
 | 
				
			||||||
 | 
					            } forall
 | 
				
			||||||
 | 
					        } {
 | 
				
			||||||
 | 
					            textfont findfont textsize scalefont setfont
 | 
				
			||||||
 | 
					            alttext () eq {
 | 
				
			||||||
 | 
					                /txt [ txt { 0 get {} forall } forall ] def
 | 
				
			||||||
 | 
					                /tstr txt length string def
 | 
				
			||||||
 | 
					                0 1 txt length 1 sub { dup txt exch get tstr 3 1 roll put } for
 | 
				
			||||||
 | 
					            } {
 | 
				
			||||||
 | 
					                /tstr alttext def
 | 
				
			||||||
 | 
					            } ifelse
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            % Find true ascent of font
 | 
				
			||||||
 | 
					            tstr length 0 eq {
 | 
				
			||||||
 | 
					                0
 | 
				
			||||||
 | 
					            } {
 | 
				
			||||||
 | 
					                gsave
 | 
				
			||||||
 | 
					                newpath 0 0 moveto (0) false charpath pathbbox
 | 
				
			||||||
 | 
					                4 1 roll pop pop pop
 | 
				
			||||||
 | 
					                grestore
 | 
				
			||||||
 | 
					                currentfont /PaintType known {currentfont /PaintType get 2 eq} {false} ifelse
 | 
				
			||||||
 | 
					                currentfont /StrokeWidth known and {
 | 
				
			||||||
 | 
					                    currentfont /StrokeWidth get 2 div 0 exch
 | 
				
			||||||
 | 
					                    currentfont /FontMatrix get dtransform
 | 
				
			||||||
 | 
					                    dup mul exch dup mul add sqrt
 | 
				
			||||||
 | 
					                    add
 | 
				
			||||||
 | 
					                } if
 | 
				
			||||||
 | 
					            } ifelse
 | 
				
			||||||
 | 
					            /textascent exch def
 | 
				
			||||||
 | 
					            /textwidth tstr stringwidth pop tstr length 1 sub textgaps mul add def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            /textxpos textxoffset x 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 (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 {
 | 
				
			||||||
 | 
					                /textxpos 0 def
 | 
				
			||||||
 | 
					                /textgaps x 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
 | 
				
			||||||
 | 
					            textxpos textypos moveto textgaps 0 tstr ashow
 | 
				
			||||||
 | 
					        } ifelse
 | 
				
			||||||
 | 
					    } if    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Display the guard elements
 | 
				
			||||||
 | 
					    guardwhitespace {
 | 
				
			||||||
 | 
					        0.75 setlinewidth
 | 
				
			||||||
 | 
					        guardleftpos 0 ne {
 | 
				
			||||||
 | 
					            newpath
 | 
				
			||||||
 | 
					            guardleftpos neg guardwidth add guardleftypos guardwidth 2 div add moveto
 | 
				
			||||||
 | 
					            guardwidth neg guardheight -2 div rlineto
 | 
				
			||||||
 | 
					            guardwidth guardheight -2 div rlineto
 | 
				
			||||||
 | 
					            stroke            
 | 
				
			||||||
 | 
					        } if
 | 
				
			||||||
 | 
					        guardrightpos 0 ne {
 | 
				
			||||||
 | 
					            newpath
 | 
				
			||||||
 | 
					            guardrightpos x add guardwidth sub guardrightypos guardheight 2 div add moveto
 | 
				
			||||||
 | 
					            guardwidth guardheight -2 div rlineto
 | 
				
			||||||
 | 
					            guardwidth neg guardheight -2 div rlineto
 | 
				
			||||||
 | 
					            stroke            
 | 
				
			||||||
 | 
					        } if
 | 
				
			||||||
 | 
					    } if
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    grestore
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} bind def
 | 
				
			||||||
 | 
					/renlinear dup load /uk.co.terryburton.bwipp defineresource pop
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					/setpacking where {pop setpacking} if
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					% --DESC: Code 93
 | 
				
			||||||
 | 
					% --EXAM: THIS IS CODE 93
 | 
				
			||||||
 | 
					% --EXOP: includetext includecheck
 | 
				
			||||||
 | 
					% --RNDR: renlinear
 | 
				
			||||||
 | 
					/setpacking where {pop currentpacking true setpacking} if
 | 
				
			||||||
 | 
					1 dict
 | 
				
			||||||
 | 
					dup /renlinear dup /uk.co.terryburton.bwipp findresource put
 | 
				
			||||||
 | 
					begin
 | 
				
			||||||
 | 
					/code93 {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /dontdraw false def
 | 
				
			||||||
 | 
					    /includecheck false def  % Enable/disable checkdigit
 | 
				
			||||||
 | 
					    /includetext false def   % Enable/disable text
 | 
				
			||||||
 | 
					    /textfont /Courier def
 | 
				
			||||||
 | 
					    /textsize 10 def
 | 
				
			||||||
 | 
					    /textyoffset -7 def
 | 
				
			||||||
 | 
					    /height 1 def
 | 
				
			||||||
 | 
					    /parsefnc 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
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					    /textfont textfont cvlit def
 | 
				
			||||||
 | 
					    /textsize textsize cvr def
 | 
				
			||||||
 | 
					    /textyoffset textyoffset cvr def
 | 
				
			||||||
 | 
					    /height height cvr def
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    /encs
 | 
				
			||||||
 | 
					    [ (131112) (111213) (111312) (111411) (121113)
 | 
				
			||||||
 | 
					      (121212) (121311) (111114) (131211) (141111)
 | 
				
			||||||
 | 
					      (211113) (211212) (211311) (221112) (221211)
 | 
				
			||||||
 | 
					      (231111) (112113) (112212) (112311) (122112)
 | 
				
			||||||
 | 
					      (132111) (111123) (111222) (111321) (121122)
 | 
				
			||||||
 | 
					      (131121) (212112) (212211) (211122) (211221)
 | 
				
			||||||
 | 
					      (221121) (222111) (112122) (112221) (122121)
 | 
				
			||||||
 | 
					      (123111) (121131) (311112) (311211) (321111)
 | 
				
			||||||
 | 
					      (112131) (113121) (211131) (121221) (312111)
 | 
				
			||||||
 | 
					      (311121) (122211) (111141) (1111411)
 | 
				
			||||||
 | 
					    ] def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Create a string of the available characters
 | 
				
			||||||
 | 
					    /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /barlen barcode length def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Special function characters
 | 
				
			||||||
 | 
					    /sft1 -1 def  /sft2 -2 def  /sft3 -3 def  /sft4 -4 def
 | 
				
			||||||
 | 
					    /fncvals <<
 | 
				
			||||||
 | 
					        (SFT$) sft1
 | 
				
			||||||
 | 
					        (SFT%) sft2
 | 
				
			||||||
 | 
					        (SFT/) sft3
 | 
				
			||||||
 | 
					        (SFT+) sft4
 | 
				
			||||||
 | 
					    >> def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Convert input into bytes accounting for shift characters 
 | 
				
			||||||
 | 
					    /msg barlen array def
 | 
				
			||||||
 | 
					    /i 0 def /j 0 def {
 | 
				
			||||||
 | 
					        i barlen eq {exit} if
 | 
				
			||||||
 | 
					        /char barcode i get def
 | 
				
			||||||
 | 
					        parsefnc char 94 eq and i barlen 4 sub lt and {
 | 
				
			||||||
 | 
					            barcode i 1 add get 94 ne {
 | 
				
			||||||
 | 
					                /char fncvals barcode i 1 add 4 getinterval get def
 | 
				
			||||||
 | 
					                /i i 4 add def
 | 
				
			||||||
 | 
					            } {
 | 
				
			||||||
 | 
					                /i i 1 add def
 | 
				
			||||||
 | 
					            } ifelse
 | 
				
			||||||
 | 
					        } if
 | 
				
			||||||
 | 
					        msg j char put
 | 
				
			||||||
 | 
					        /i i 1 add def
 | 
				
			||||||
 | 
					        /j j 1 add def
 | 
				
			||||||
 | 
					    } loop
 | 
				
			||||||
 | 
					    /msg msg 0 j getinterval def
 | 
				
			||||||
 | 
					    /msglen msg length def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    includecheck {
 | 
				
			||||||
 | 
					        /sbs msglen 6 mul 25 add string def
 | 
				
			||||||
 | 
					    } {
 | 
				
			||||||
 | 
					        /sbs msglen 6 mul 13 add string def
 | 
				
			||||||
 | 
					    } ifelse
 | 
				
			||||||
 | 
					    /txt msglen array def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Put the start character
 | 
				
			||||||
 | 
					    sbs 0 encs 47 get putinterval
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    /checksum1 0 def /checksum2 0 def
 | 
				
			||||||
 | 
					    0 1 msglen 1 sub {
 | 
				
			||||||
 | 
					        /i exch def
 | 
				
			||||||
 | 
					        % Lookup the encoding for the each barcode character
 | 
				
			||||||
 | 
					        msg i get dup 0 lt { 
 | 
				
			||||||
 | 
					            42 exch sub /indx exch def
 | 
				
			||||||
 | 
					            /char ( ) def
 | 
				
			||||||
 | 
					        } {
 | 
				
			||||||
 | 
					            1 string dup 0 4 -1 roll put /char exch def
 | 
				
			||||||
 | 
					            barchars char search
 | 
				
			||||||
 | 
					            pop                                  % Discard true leaving pre
 | 
				
			||||||
 | 
					            length /indx exch def                % indx is the length of pre
 | 
				
			||||||
 | 
					            pop pop                              % Discard seek and post
 | 
				
			||||||
 | 
					        } ifelse
 | 
				
			||||||
 | 
					        /enc encs indx get def                   % Get the indxth encoding
 | 
				
			||||||
 | 
					        sbs i 6 mul 6 add enc putinterval        % Put encoded digit into sbs
 | 
				
			||||||
 | 
					        txt i [char i 9 mul 9 add textyoffset textfont textsize] put
 | 
				
			||||||
 | 
					        /checksum1 checksum1 msglen i sub 1 sub 20 mod 1 add indx mul add def
 | 
				
			||||||
 | 
					        /checksum2 checksum2 msglen i sub 15 mod 1 add indx mul add def
 | 
				
			||||||
 | 
					    } for
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    includecheck {
 | 
				
			||||||
 | 
					        % Put the first checksum character
 | 
				
			||||||
 | 
					        /checksum1 checksum1 47 mod def
 | 
				
			||||||
 | 
					        /checksum2 checksum2 checksum1 add 47 mod def
 | 
				
			||||||
 | 
					        sbs msglen 6 mul 6 add encs checksum1 get putinterval
 | 
				
			||||||
 | 
					        sbs msglen 6 mul 12 add encs checksum2 get putinterval
 | 
				
			||||||
 | 
					        % Put the end character
 | 
				
			||||||
 | 
					        sbs msglen 6 mul 18 add encs 48 get putinterval
 | 
				
			||||||
 | 
					    } {
 | 
				
			||||||
 | 
					        % Put the end character
 | 
				
			||||||
 | 
					        sbs msglen 6 mul 6 add encs 48 get putinterval      
 | 
				
			||||||
 | 
					    } ifelse
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Return the arguments
 | 
				
			||||||
 | 
					    <<
 | 
				
			||||||
 | 
					    /ren //renlinear
 | 
				
			||||||
 | 
					    /sbs [sbs {48 sub} forall]
 | 
				
			||||||
 | 
					    /bhs [sbs length 1 add 2 idiv {height} repeat]
 | 
				
			||||||
 | 
					    /bbs [sbs length 1 add 2 idiv {0} repeat]
 | 
				
			||||||
 | 
					    includetext {
 | 
				
			||||||
 | 
					        /txt txt
 | 
				
			||||||
 | 
					    } if
 | 
				
			||||||
 | 
					    /opt options
 | 
				
			||||||
 | 
					    >>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dontdraw not //renlinear if
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} bind def
 | 
				
			||||||
 | 
					/code93 dup load /uk.co.terryburton.bwipp defineresource pop
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					/setpacking where {pop setpacking} if
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					gsave
 | 
				
			||||||
 | 
					50 50 translate
 | 
				
			||||||
 | 
					0 0 moveto <544f20474f20414c4c> <696e636c7564657465787420696e636c756465636865636b> /code93 /uk.co.terryburton.bwipp findresource exec
 | 
				
			||||||
 | 
					grestore
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					showpage
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,409 @@
 | 
				
			||||||
 | 
					%!PS-Adobe-2.0 EPSF-2.0
 | 
				
			||||||
 | 
					%%Creator: Terry Burton
 | 
				
			||||||
 | 
					%%BoundingBox: 50 40 177 122
 | 
				
			||||||
 | 
					%%EndComments
 | 
				
			||||||
 | 
					%%EndProlog
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					currentglobal
 | 
				
			||||||
 | 
					true setglobal
 | 
				
			||||||
 | 
					/Generic /Category findresource
 | 
				
			||||||
 | 
					dup length 1 add dict copy
 | 
				
			||||||
 | 
					dup /InstanceType /packedarraytype put
 | 
				
			||||||
 | 
					/uk.co.terryburton.bwipp exch /Category defineresource pop
 | 
				
			||||||
 | 
					setglobal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/setpacking where {pop currentpacking true setpacking} if
 | 
				
			||||||
 | 
					1 dict
 | 
				
			||||||
 | 
					begin
 | 
				
			||||||
 | 
					/renlinear {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    20 dict begin          % Confine variables to local scope
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /args exch def   % We are given some arguments
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Default options
 | 
				
			||||||
 | 
					    /sbs [] def
 | 
				
			||||||
 | 
					    /bhs [] def
 | 
				
			||||||
 | 
					    /bbs [] def
 | 
				
			||||||
 | 
					    /txt [] def
 | 
				
			||||||
 | 
					    /barcolor (unset) def
 | 
				
			||||||
 | 
					    /includetext false def
 | 
				
			||||||
 | 
					    /textcolor (unset) def
 | 
				
			||||||
 | 
					    /textxalign (unset) def
 | 
				
			||||||
 | 
					    /textyalign (unset) def
 | 
				
			||||||
 | 
					    /textfont (Courier) def
 | 
				
			||||||
 | 
					    /textsize 10 def
 | 
				
			||||||
 | 
					    /textxoffset 0 def
 | 
				
			||||||
 | 
					    /textyoffset 0 def
 | 
				
			||||||
 | 
					    /textgaps 0 def
 | 
				
			||||||
 | 
					    /alttext () def
 | 
				
			||||||
 | 
					    /bordercolor (unset) def
 | 
				
			||||||
 | 
					    /backgroundcolor (unset) def
 | 
				
			||||||
 | 
					    /inkspread 0.15 def
 | 
				
			||||||
 | 
					    /width 0 def
 | 
				
			||||||
 | 
					    /barratio 1 def
 | 
				
			||||||
 | 
					    /spaceratio 1 def
 | 
				
			||||||
 | 
					    /showborder false def
 | 
				
			||||||
 | 
					    /borderleft 10 def
 | 
				
			||||||
 | 
					    /borderright 10 def
 | 
				
			||||||
 | 
					    /bordertop 1 def
 | 
				
			||||||
 | 
					    /borderbottom 1 def
 | 
				
			||||||
 | 
					    /borderwidth 0.5 def
 | 
				
			||||||
 | 
					    /guardwhitespace false def
 | 
				
			||||||
 | 
					    /guardleftpos 0 def
 | 
				
			||||||
 | 
					    /guardleftypos 0 def
 | 
				
			||||||
 | 
					    /guardrightpos 0 def
 | 
				
			||||||
 | 
					    /guardrightypos 0 def
 | 
				
			||||||
 | 
					    /guardwidth 6 def
 | 
				
			||||||
 | 
					    /guardheight 7 def
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    % Apply the renderer options and the user options
 | 
				
			||||||
 | 
					    args {def} forall
 | 
				
			||||||
 | 
					    opt {def} forall 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /barcolor barcolor cvlit def
 | 
				
			||||||
 | 
					    /textcolor textcolor cvlit def
 | 
				
			||||||
 | 
					    /textxalign textxalign cvlit def
 | 
				
			||||||
 | 
					    /textyalign textyalign cvlit def
 | 
				
			||||||
 | 
					    /textfont textfont cvlit def
 | 
				
			||||||
 | 
					    /textsize textsize cvr def
 | 
				
			||||||
 | 
					    /textxoffset textxoffset cvr def
 | 
				
			||||||
 | 
					    /textyoffset textyoffset cvr def
 | 
				
			||||||
 | 
					    /textgaps textgaps cvr def
 | 
				
			||||||
 | 
					    /alttext alttext cvlit def
 | 
				
			||||||
 | 
					    /bordercolor bordercolor cvlit def
 | 
				
			||||||
 | 
					    /backgroundcolor backgroundcolor cvlit def
 | 
				
			||||||
 | 
					    /inkspread inkspread cvr def
 | 
				
			||||||
 | 
					    /width width cvr def
 | 
				
			||||||
 | 
					    /barratio barratio cvr def
 | 
				
			||||||
 | 
					    /spaceratio spaceratio cvr def
 | 
				
			||||||
 | 
					    /borderleft borderleft cvr def
 | 
				
			||||||
 | 
					    /borderright borderright cvr def
 | 
				
			||||||
 | 
					    /bordertop bordertop cvr def
 | 
				
			||||||
 | 
					    /borderbottom borderbottom cvr def
 | 
				
			||||||
 | 
					    /borderwidth borderwidth cvr def
 | 
				
			||||||
 | 
					    /guardleftpos guardleftpos cvr def
 | 
				
			||||||
 | 
					    /guardleftypos guardleftypos cvr def
 | 
				
			||||||
 | 
					    /guardrightpos guardrightpos cvr def
 | 
				
			||||||
 | 
					    /guardrightypos guardrightypos cvr def
 | 
				
			||||||
 | 
					    /guardwidth guardwidth cvr def
 | 
				
			||||||
 | 
					    /guardheight guardheight cvr def
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    % 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
 | 
				
			||||||
 | 
					    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
 | 
				
			||||||
 | 
					            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
 | 
				
			||||||
 | 
					                /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
 | 
				
			||||||
 | 
					            } {
 | 
				
			||||||
 | 
					                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 
 | 
				
			||||||
 | 
					        } ifelse
 | 
				
			||||||
 | 
					        /x x d add def  % x+=d
 | 
				
			||||||
 | 
					    } for
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    gsave
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    currentpoint translate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Force symbol to given width
 | 
				
			||||||
 | 
					    width 0 ne {
 | 
				
			||||||
 | 
					        width 72 mul x div 1 scale
 | 
				
			||||||
 | 
					    } if
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Set RGB or CMYK color depending on length of given hex string
 | 
				
			||||||
 | 
					    /setanycolor {
 | 
				
			||||||
 | 
					        /anycolor exch def
 | 
				
			||||||
 | 
					        anycolor length 6 eq {
 | 
				
			||||||
 | 
					            (<      >) 8 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setrgbcolor
 | 
				
			||||||
 | 
					        } if
 | 
				
			||||||
 | 
					        anycolor length 8 eq {
 | 
				
			||||||
 | 
					            (<        >) 10 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setcmykcolor
 | 
				
			||||||
 | 
					        } if
 | 
				
			||||||
 | 
					    } bind def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % 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    
 | 
				
			||||||
 | 
					    closepath
 | 
				
			||||||
 | 
					    backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if     
 | 
				
			||||||
 | 
					    showborder {
 | 
				
			||||||
 | 
					        gsave
 | 
				
			||||||
 | 
					        bordercolor (unset) ne { bordercolor setanycolor } if
 | 
				
			||||||
 | 
					        borderwidth setlinewidth stroke
 | 
				
			||||||
 | 
					        grestore
 | 
				
			||||||
 | 
					    } if    
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					    % Display the bars for elements in the bars array
 | 
				
			||||||
 | 
					    gsave
 | 
				
			||||||
 | 
					    0 setlinecap
 | 
				
			||||||
 | 
					    barcolor (unset) ne { barcolor setanycolor } if
 | 
				
			||||||
 | 
					    bars {
 | 
				
			||||||
 | 
					        dup -1 ne {
 | 
				
			||||||
 | 
					            aload pop newpath setlinewidth moveto 0 exch rlineto stroke
 | 
				
			||||||
 | 
					        } {
 | 
				
			||||||
 | 
					            pop
 | 
				
			||||||
 | 
					        } ifelse
 | 
				
			||||||
 | 
					    } forall
 | 
				
			||||||
 | 
					    grestore
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    % Display the text for elements in the text array
 | 
				
			||||||
 | 
					    textcolor (unset) ne { textcolor setanycolor } if
 | 
				
			||||||
 | 
					    includetext {
 | 
				
			||||||
 | 
					        textxalign (unset) eq textyalign (unset) eq and alttext () eq and {
 | 
				
			||||||
 | 
					            /s 0 def /f () def
 | 
				
			||||||
 | 
					            txt {
 | 
				
			||||||
 | 
					                {} forall
 | 
				
			||||||
 | 
					                2 copy s ne exch f ne or {
 | 
				
			||||||
 | 
					                    2 copy /s exch def /f exch def            
 | 
				
			||||||
 | 
					                    exch findfont exch scalefont setfont          
 | 
				
			||||||
 | 
					                } {
 | 
				
			||||||
 | 
					                    pop pop
 | 
				
			||||||
 | 
					                } ifelse
 | 
				
			||||||
 | 
					                moveto show
 | 
				
			||||||
 | 
					            } forall
 | 
				
			||||||
 | 
					        } {
 | 
				
			||||||
 | 
					            textfont findfont textsize scalefont setfont
 | 
				
			||||||
 | 
					            alttext () eq {
 | 
				
			||||||
 | 
					                /txt [ txt { 0 get {} forall } forall ] def
 | 
				
			||||||
 | 
					                /tstr txt length string def
 | 
				
			||||||
 | 
					                0 1 txt length 1 sub { dup txt exch get tstr 3 1 roll put } for
 | 
				
			||||||
 | 
					            } {
 | 
				
			||||||
 | 
					                /tstr alttext def
 | 
				
			||||||
 | 
					            } ifelse
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            % Find true ascent of font
 | 
				
			||||||
 | 
					            tstr length 0 eq {
 | 
				
			||||||
 | 
					                0
 | 
				
			||||||
 | 
					            } {
 | 
				
			||||||
 | 
					                gsave
 | 
				
			||||||
 | 
					                newpath 0 0 moveto (0) false charpath pathbbox
 | 
				
			||||||
 | 
					                4 1 roll pop pop pop
 | 
				
			||||||
 | 
					                grestore
 | 
				
			||||||
 | 
					                currentfont /PaintType known {currentfont /PaintType get 2 eq} {false} ifelse
 | 
				
			||||||
 | 
					                currentfont /StrokeWidth known and {
 | 
				
			||||||
 | 
					                    currentfont /StrokeWidth get 2 div 0 exch
 | 
				
			||||||
 | 
					                    currentfont /FontMatrix get dtransform
 | 
				
			||||||
 | 
					                    dup mul exch dup mul add sqrt
 | 
				
			||||||
 | 
					                    add
 | 
				
			||||||
 | 
					                } if
 | 
				
			||||||
 | 
					            } ifelse
 | 
				
			||||||
 | 
					            /textascent exch def
 | 
				
			||||||
 | 
					            /textwidth tstr stringwidth pop tstr length 1 sub textgaps mul add def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            /textxpos textxoffset x 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 (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 {
 | 
				
			||||||
 | 
					                /textxpos 0 def
 | 
				
			||||||
 | 
					                /textgaps x 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
 | 
				
			||||||
 | 
					            textxpos textypos moveto textgaps 0 tstr ashow
 | 
				
			||||||
 | 
					        } ifelse
 | 
				
			||||||
 | 
					    } if    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Display the guard elements
 | 
				
			||||||
 | 
					    guardwhitespace {
 | 
				
			||||||
 | 
					        0.75 setlinewidth
 | 
				
			||||||
 | 
					        guardleftpos 0 ne {
 | 
				
			||||||
 | 
					            newpath
 | 
				
			||||||
 | 
					            guardleftpos neg guardwidth add guardleftypos guardwidth 2 div add moveto
 | 
				
			||||||
 | 
					            guardwidth neg guardheight -2 div rlineto
 | 
				
			||||||
 | 
					            guardwidth guardheight -2 div rlineto
 | 
				
			||||||
 | 
					            stroke            
 | 
				
			||||||
 | 
					        } if
 | 
				
			||||||
 | 
					        guardrightpos 0 ne {
 | 
				
			||||||
 | 
					            newpath
 | 
				
			||||||
 | 
					            guardrightpos x add guardwidth sub guardrightypos guardheight 2 div add moveto
 | 
				
			||||||
 | 
					            guardwidth guardheight -2 div rlineto
 | 
				
			||||||
 | 
					            guardwidth neg guardheight -2 div rlineto
 | 
				
			||||||
 | 
					            stroke            
 | 
				
			||||||
 | 
					        } if
 | 
				
			||||||
 | 
					    } if
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    grestore
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} bind def
 | 
				
			||||||
 | 
					/renlinear dup load /uk.co.terryburton.bwipp defineresource pop
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					/setpacking where {pop setpacking} if
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					% --DESC: Code 93
 | 
				
			||||||
 | 
					% --EXAM: THIS IS CODE 93
 | 
				
			||||||
 | 
					% --EXOP: includetext includecheck
 | 
				
			||||||
 | 
					% --RNDR: renlinear
 | 
				
			||||||
 | 
					/setpacking where {pop currentpacking true setpacking} if
 | 
				
			||||||
 | 
					1 dict
 | 
				
			||||||
 | 
					dup /renlinear dup /uk.co.terryburton.bwipp findresource put
 | 
				
			||||||
 | 
					begin
 | 
				
			||||||
 | 
					/code93 {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /dontdraw false def
 | 
				
			||||||
 | 
					    /includecheck false def  % Enable/disable checkdigit
 | 
				
			||||||
 | 
					    /includetext false def   % Enable/disable text
 | 
				
			||||||
 | 
					    /textfont /Courier def
 | 
				
			||||||
 | 
					    /textsize 10 def
 | 
				
			||||||
 | 
					    /textyoffset -7 def
 | 
				
			||||||
 | 
					    /height 1 def
 | 
				
			||||||
 | 
					    /parsefnc 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
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					    /textfont textfont cvlit def
 | 
				
			||||||
 | 
					    /textsize textsize cvr def
 | 
				
			||||||
 | 
					    /textyoffset textyoffset cvr def
 | 
				
			||||||
 | 
					    /height height cvr def
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    /encs
 | 
				
			||||||
 | 
					    [ (131112) (111213) (111312) (111411) (121113)
 | 
				
			||||||
 | 
					      (121212) (121311) (111114) (131211) (141111)
 | 
				
			||||||
 | 
					      (211113) (211212) (211311) (221112) (221211)
 | 
				
			||||||
 | 
					      (231111) (112113) (112212) (112311) (122112)
 | 
				
			||||||
 | 
					      (132111) (111123) (111222) (111321) (121122)
 | 
				
			||||||
 | 
					      (131121) (212112) (212211) (211122) (211221)
 | 
				
			||||||
 | 
					      (221121) (222111) (112122) (112221) (122121)
 | 
				
			||||||
 | 
					      (123111) (121131) (311112) (311211) (321111)
 | 
				
			||||||
 | 
					      (112131) (113121) (211131) (121221) (312111)
 | 
				
			||||||
 | 
					      (311121) (122211) (111141) (1111411)
 | 
				
			||||||
 | 
					    ] def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Create a string of the available characters
 | 
				
			||||||
 | 
					    /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /barlen barcode length def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Special function characters
 | 
				
			||||||
 | 
					    /sft1 -1 def  /sft2 -2 def  /sft3 -3 def  /sft4 -4 def
 | 
				
			||||||
 | 
					    /fncvals <<
 | 
				
			||||||
 | 
					        (SFT$) sft1
 | 
				
			||||||
 | 
					        (SFT%) sft2
 | 
				
			||||||
 | 
					        (SFT/) sft3
 | 
				
			||||||
 | 
					        (SFT+) sft4
 | 
				
			||||||
 | 
					    >> def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Convert input into bytes accounting for shift characters 
 | 
				
			||||||
 | 
					    /msg barlen array def
 | 
				
			||||||
 | 
					    /i 0 def /j 0 def {
 | 
				
			||||||
 | 
					        i barlen eq {exit} if
 | 
				
			||||||
 | 
					        /char barcode i get def
 | 
				
			||||||
 | 
					        parsefnc char 94 eq and i barlen 4 sub lt and {
 | 
				
			||||||
 | 
					            barcode i 1 add get 94 ne {
 | 
				
			||||||
 | 
					                /char fncvals barcode i 1 add 4 getinterval get def
 | 
				
			||||||
 | 
					                /i i 4 add def
 | 
				
			||||||
 | 
					            } {
 | 
				
			||||||
 | 
					                /i i 1 add def
 | 
				
			||||||
 | 
					            } ifelse
 | 
				
			||||||
 | 
					        } if
 | 
				
			||||||
 | 
					        msg j char put
 | 
				
			||||||
 | 
					        /i i 1 add def
 | 
				
			||||||
 | 
					        /j j 1 add def
 | 
				
			||||||
 | 
					    } loop
 | 
				
			||||||
 | 
					    /msg msg 0 j getinterval def
 | 
				
			||||||
 | 
					    /msglen msg length def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    includecheck {
 | 
				
			||||||
 | 
					        /sbs msglen 6 mul 25 add string def
 | 
				
			||||||
 | 
					    } {
 | 
				
			||||||
 | 
					        /sbs msglen 6 mul 13 add string def
 | 
				
			||||||
 | 
					    } ifelse
 | 
				
			||||||
 | 
					    /txt msglen array def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Put the start character
 | 
				
			||||||
 | 
					    sbs 0 encs 47 get putinterval
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    /checksum1 0 def /checksum2 0 def
 | 
				
			||||||
 | 
					    0 1 msglen 1 sub {
 | 
				
			||||||
 | 
					        /i exch def
 | 
				
			||||||
 | 
					        % Lookup the encoding for the each barcode character
 | 
				
			||||||
 | 
					        msg i get dup 0 lt { 
 | 
				
			||||||
 | 
					            42 exch sub /indx exch def
 | 
				
			||||||
 | 
					            /char ( ) def
 | 
				
			||||||
 | 
					        } {
 | 
				
			||||||
 | 
					            1 string dup 0 4 -1 roll put /char exch def
 | 
				
			||||||
 | 
					            barchars char search
 | 
				
			||||||
 | 
					            pop                                  % Discard true leaving pre
 | 
				
			||||||
 | 
					            length /indx exch def                % indx is the length of pre
 | 
				
			||||||
 | 
					            pop pop                              % Discard seek and post
 | 
				
			||||||
 | 
					        } ifelse
 | 
				
			||||||
 | 
					        /enc encs indx get def                   % Get the indxth encoding
 | 
				
			||||||
 | 
					        sbs i 6 mul 6 add enc putinterval        % Put encoded digit into sbs
 | 
				
			||||||
 | 
					        txt i [char i 9 mul 9 add textyoffset textfont textsize] put
 | 
				
			||||||
 | 
					        /checksum1 checksum1 msglen i sub 1 sub 20 mod 1 add indx mul add def
 | 
				
			||||||
 | 
					        /checksum2 checksum2 msglen i sub 15 mod 1 add indx mul add def
 | 
				
			||||||
 | 
					    } for
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    includecheck {
 | 
				
			||||||
 | 
					        % Put the first checksum character
 | 
				
			||||||
 | 
					        /checksum1 checksum1 47 mod def
 | 
				
			||||||
 | 
					        /checksum2 checksum2 checksum1 add 47 mod def
 | 
				
			||||||
 | 
					        sbs msglen 6 mul 6 add encs checksum1 get putinterval
 | 
				
			||||||
 | 
					        sbs msglen 6 mul 12 add encs checksum2 get putinterval
 | 
				
			||||||
 | 
					        % Put the end character
 | 
				
			||||||
 | 
					        sbs msglen 6 mul 18 add encs 48 get putinterval
 | 
				
			||||||
 | 
					    } {
 | 
				
			||||||
 | 
					        % Put the end character
 | 
				
			||||||
 | 
					        sbs msglen 6 mul 6 add encs 48 get putinterval      
 | 
				
			||||||
 | 
					    } ifelse
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Return the arguments
 | 
				
			||||||
 | 
					    <<
 | 
				
			||||||
 | 
					    /ren //renlinear
 | 
				
			||||||
 | 
					    /sbs [sbs {48 sub} forall]
 | 
				
			||||||
 | 
					    /bhs [sbs length 1 add 2 idiv {height} repeat]
 | 
				
			||||||
 | 
					    /bbs [sbs length 1 add 2 idiv {0} repeat]
 | 
				
			||||||
 | 
					    includetext {
 | 
				
			||||||
 | 
					        /txt txt
 | 
				
			||||||
 | 
					    } if
 | 
				
			||||||
 | 
					    /opt options
 | 
				
			||||||
 | 
					    >>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dontdraw not //renlinear if
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} bind def
 | 
				
			||||||
 | 
					/code93 dup load /uk.co.terryburton.bwipp defineresource pop
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					/setpacking where {pop setpacking} if
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					gsave
 | 
				
			||||||
 | 
					50 50 translate
 | 
				
			||||||
 | 
					0 0 moveto <544f20474f204e4f4e45> <696e636c7564657465787420696e636c756465636865636b> /code93 /uk.co.terryburton.bwipp findresource exec
 | 
				
			||||||
 | 
					grestore
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					showpage
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,409 @@
 | 
				
			||||||
 | 
					%!PS-Adobe-2.0 EPSF-2.0
 | 
				
			||||||
 | 
					%%Creator: Terry Burton
 | 
				
			||||||
 | 
					%%BoundingBox: 50 40 177 122
 | 
				
			||||||
 | 
					%%EndComments
 | 
				
			||||||
 | 
					%%EndProlog
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					currentglobal
 | 
				
			||||||
 | 
					true setglobal
 | 
				
			||||||
 | 
					/Generic /Category findresource
 | 
				
			||||||
 | 
					dup length 1 add dict copy
 | 
				
			||||||
 | 
					dup /InstanceType /packedarraytype put
 | 
				
			||||||
 | 
					/uk.co.terryburton.bwipp exch /Category defineresource pop
 | 
				
			||||||
 | 
					setglobal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/setpacking where {pop currentpacking true setpacking} if
 | 
				
			||||||
 | 
					1 dict
 | 
				
			||||||
 | 
					begin
 | 
				
			||||||
 | 
					/renlinear {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    20 dict begin          % Confine variables to local scope
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /args exch def   % We are given some arguments
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Default options
 | 
				
			||||||
 | 
					    /sbs [] def
 | 
				
			||||||
 | 
					    /bhs [] def
 | 
				
			||||||
 | 
					    /bbs [] def
 | 
				
			||||||
 | 
					    /txt [] def
 | 
				
			||||||
 | 
					    /barcolor (unset) def
 | 
				
			||||||
 | 
					    /includetext false def
 | 
				
			||||||
 | 
					    /textcolor (unset) def
 | 
				
			||||||
 | 
					    /textxalign (unset) def
 | 
				
			||||||
 | 
					    /textyalign (unset) def
 | 
				
			||||||
 | 
					    /textfont (Courier) def
 | 
				
			||||||
 | 
					    /textsize 10 def
 | 
				
			||||||
 | 
					    /textxoffset 0 def
 | 
				
			||||||
 | 
					    /textyoffset 0 def
 | 
				
			||||||
 | 
					    /textgaps 0 def
 | 
				
			||||||
 | 
					    /alttext () def
 | 
				
			||||||
 | 
					    /bordercolor (unset) def
 | 
				
			||||||
 | 
					    /backgroundcolor (unset) def
 | 
				
			||||||
 | 
					    /inkspread 0.15 def
 | 
				
			||||||
 | 
					    /width 0 def
 | 
				
			||||||
 | 
					    /barratio 1 def
 | 
				
			||||||
 | 
					    /spaceratio 1 def
 | 
				
			||||||
 | 
					    /showborder false def
 | 
				
			||||||
 | 
					    /borderleft 10 def
 | 
				
			||||||
 | 
					    /borderright 10 def
 | 
				
			||||||
 | 
					    /bordertop 1 def
 | 
				
			||||||
 | 
					    /borderbottom 1 def
 | 
				
			||||||
 | 
					    /borderwidth 0.5 def
 | 
				
			||||||
 | 
					    /guardwhitespace false def
 | 
				
			||||||
 | 
					    /guardleftpos 0 def
 | 
				
			||||||
 | 
					    /guardleftypos 0 def
 | 
				
			||||||
 | 
					    /guardrightpos 0 def
 | 
				
			||||||
 | 
					    /guardrightypos 0 def
 | 
				
			||||||
 | 
					    /guardwidth 6 def
 | 
				
			||||||
 | 
					    /guardheight 7 def
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    % Apply the renderer options and the user options
 | 
				
			||||||
 | 
					    args {def} forall
 | 
				
			||||||
 | 
					    opt {def} forall 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /barcolor barcolor cvlit def
 | 
				
			||||||
 | 
					    /textcolor textcolor cvlit def
 | 
				
			||||||
 | 
					    /textxalign textxalign cvlit def
 | 
				
			||||||
 | 
					    /textyalign textyalign cvlit def
 | 
				
			||||||
 | 
					    /textfont textfont cvlit def
 | 
				
			||||||
 | 
					    /textsize textsize cvr def
 | 
				
			||||||
 | 
					    /textxoffset textxoffset cvr def
 | 
				
			||||||
 | 
					    /textyoffset textyoffset cvr def
 | 
				
			||||||
 | 
					    /textgaps textgaps cvr def
 | 
				
			||||||
 | 
					    /alttext alttext cvlit def
 | 
				
			||||||
 | 
					    /bordercolor bordercolor cvlit def
 | 
				
			||||||
 | 
					    /backgroundcolor backgroundcolor cvlit def
 | 
				
			||||||
 | 
					    /inkspread inkspread cvr def
 | 
				
			||||||
 | 
					    /width width cvr def
 | 
				
			||||||
 | 
					    /barratio barratio cvr def
 | 
				
			||||||
 | 
					    /spaceratio spaceratio cvr def
 | 
				
			||||||
 | 
					    /borderleft borderleft cvr def
 | 
				
			||||||
 | 
					    /borderright borderright cvr def
 | 
				
			||||||
 | 
					    /bordertop bordertop cvr def
 | 
				
			||||||
 | 
					    /borderbottom borderbottom cvr def
 | 
				
			||||||
 | 
					    /borderwidth borderwidth cvr def
 | 
				
			||||||
 | 
					    /guardleftpos guardleftpos cvr def
 | 
				
			||||||
 | 
					    /guardleftypos guardleftypos cvr def
 | 
				
			||||||
 | 
					    /guardrightpos guardrightpos cvr def
 | 
				
			||||||
 | 
					    /guardrightypos guardrightypos cvr def
 | 
				
			||||||
 | 
					    /guardwidth guardwidth cvr def
 | 
				
			||||||
 | 
					    /guardheight guardheight cvr def
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    % 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
 | 
				
			||||||
 | 
					    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
 | 
				
			||||||
 | 
					            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
 | 
				
			||||||
 | 
					                /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
 | 
				
			||||||
 | 
					            } {
 | 
				
			||||||
 | 
					                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 
 | 
				
			||||||
 | 
					        } ifelse
 | 
				
			||||||
 | 
					        /x x d add def  % x+=d
 | 
				
			||||||
 | 
					    } for
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    gsave
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    currentpoint translate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Force symbol to given width
 | 
				
			||||||
 | 
					    width 0 ne {
 | 
				
			||||||
 | 
					        width 72 mul x div 1 scale
 | 
				
			||||||
 | 
					    } if
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Set RGB or CMYK color depending on length of given hex string
 | 
				
			||||||
 | 
					    /setanycolor {
 | 
				
			||||||
 | 
					        /anycolor exch def
 | 
				
			||||||
 | 
					        anycolor length 6 eq {
 | 
				
			||||||
 | 
					            (<      >) 8 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setrgbcolor
 | 
				
			||||||
 | 
					        } if
 | 
				
			||||||
 | 
					        anycolor length 8 eq {
 | 
				
			||||||
 | 
					            (<        >) 10 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setcmykcolor
 | 
				
			||||||
 | 
					        } if
 | 
				
			||||||
 | 
					    } bind def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % 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    
 | 
				
			||||||
 | 
					    closepath
 | 
				
			||||||
 | 
					    backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if     
 | 
				
			||||||
 | 
					    showborder {
 | 
				
			||||||
 | 
					        gsave
 | 
				
			||||||
 | 
					        bordercolor (unset) ne { bordercolor setanycolor } if
 | 
				
			||||||
 | 
					        borderwidth setlinewidth stroke
 | 
				
			||||||
 | 
					        grestore
 | 
				
			||||||
 | 
					    } if    
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					    % Display the bars for elements in the bars array
 | 
				
			||||||
 | 
					    gsave
 | 
				
			||||||
 | 
					    0 setlinecap
 | 
				
			||||||
 | 
					    barcolor (unset) ne { barcolor setanycolor } if
 | 
				
			||||||
 | 
					    bars {
 | 
				
			||||||
 | 
					        dup -1 ne {
 | 
				
			||||||
 | 
					            aload pop newpath setlinewidth moveto 0 exch rlineto stroke
 | 
				
			||||||
 | 
					        } {
 | 
				
			||||||
 | 
					            pop
 | 
				
			||||||
 | 
					        } ifelse
 | 
				
			||||||
 | 
					    } forall
 | 
				
			||||||
 | 
					    grestore
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    % Display the text for elements in the text array
 | 
				
			||||||
 | 
					    textcolor (unset) ne { textcolor setanycolor } if
 | 
				
			||||||
 | 
					    includetext {
 | 
				
			||||||
 | 
					        textxalign (unset) eq textyalign (unset) eq and alttext () eq and {
 | 
				
			||||||
 | 
					            /s 0 def /f () def
 | 
				
			||||||
 | 
					            txt {
 | 
				
			||||||
 | 
					                {} forall
 | 
				
			||||||
 | 
					                2 copy s ne exch f ne or {
 | 
				
			||||||
 | 
					                    2 copy /s exch def /f exch def            
 | 
				
			||||||
 | 
					                    exch findfont exch scalefont setfont          
 | 
				
			||||||
 | 
					                } {
 | 
				
			||||||
 | 
					                    pop pop
 | 
				
			||||||
 | 
					                } ifelse
 | 
				
			||||||
 | 
					                moveto show
 | 
				
			||||||
 | 
					            } forall
 | 
				
			||||||
 | 
					        } {
 | 
				
			||||||
 | 
					            textfont findfont textsize scalefont setfont
 | 
				
			||||||
 | 
					            alttext () eq {
 | 
				
			||||||
 | 
					                /txt [ txt { 0 get {} forall } forall ] def
 | 
				
			||||||
 | 
					                /tstr txt length string def
 | 
				
			||||||
 | 
					                0 1 txt length 1 sub { dup txt exch get tstr 3 1 roll put } for
 | 
				
			||||||
 | 
					            } {
 | 
				
			||||||
 | 
					                /tstr alttext def
 | 
				
			||||||
 | 
					            } ifelse
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            % Find true ascent of font
 | 
				
			||||||
 | 
					            tstr length 0 eq {
 | 
				
			||||||
 | 
					                0
 | 
				
			||||||
 | 
					            } {
 | 
				
			||||||
 | 
					                gsave
 | 
				
			||||||
 | 
					                newpath 0 0 moveto (0) false charpath pathbbox
 | 
				
			||||||
 | 
					                4 1 roll pop pop pop
 | 
				
			||||||
 | 
					                grestore
 | 
				
			||||||
 | 
					                currentfont /PaintType known {currentfont /PaintType get 2 eq} {false} ifelse
 | 
				
			||||||
 | 
					                currentfont /StrokeWidth known and {
 | 
				
			||||||
 | 
					                    currentfont /StrokeWidth get 2 div 0 exch
 | 
				
			||||||
 | 
					                    currentfont /FontMatrix get dtransform
 | 
				
			||||||
 | 
					                    dup mul exch dup mul add sqrt
 | 
				
			||||||
 | 
					                    add
 | 
				
			||||||
 | 
					                } if
 | 
				
			||||||
 | 
					            } ifelse
 | 
				
			||||||
 | 
					            /textascent exch def
 | 
				
			||||||
 | 
					            /textwidth tstr stringwidth pop tstr length 1 sub textgaps mul add def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            /textxpos textxoffset x 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 (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 {
 | 
				
			||||||
 | 
					                /textxpos 0 def
 | 
				
			||||||
 | 
					                /textgaps x 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
 | 
				
			||||||
 | 
					            textxpos textypos moveto textgaps 0 tstr ashow
 | 
				
			||||||
 | 
					        } ifelse
 | 
				
			||||||
 | 
					    } if    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Display the guard elements
 | 
				
			||||||
 | 
					    guardwhitespace {
 | 
				
			||||||
 | 
					        0.75 setlinewidth
 | 
				
			||||||
 | 
					        guardleftpos 0 ne {
 | 
				
			||||||
 | 
					            newpath
 | 
				
			||||||
 | 
					            guardleftpos neg guardwidth add guardleftypos guardwidth 2 div add moveto
 | 
				
			||||||
 | 
					            guardwidth neg guardheight -2 div rlineto
 | 
				
			||||||
 | 
					            guardwidth guardheight -2 div rlineto
 | 
				
			||||||
 | 
					            stroke            
 | 
				
			||||||
 | 
					        } if
 | 
				
			||||||
 | 
					        guardrightpos 0 ne {
 | 
				
			||||||
 | 
					            newpath
 | 
				
			||||||
 | 
					            guardrightpos x add guardwidth sub guardrightypos guardheight 2 div add moveto
 | 
				
			||||||
 | 
					            guardwidth guardheight -2 div rlineto
 | 
				
			||||||
 | 
					            guardwidth neg guardheight -2 div rlineto
 | 
				
			||||||
 | 
					            stroke            
 | 
				
			||||||
 | 
					        } if
 | 
				
			||||||
 | 
					    } if
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    grestore
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} bind def
 | 
				
			||||||
 | 
					/renlinear dup load /uk.co.terryburton.bwipp defineresource pop
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					/setpacking where {pop setpacking} if
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					% --DESC: Code 93
 | 
				
			||||||
 | 
					% --EXAM: THIS IS CODE 93
 | 
				
			||||||
 | 
					% --EXOP: includetext includecheck
 | 
				
			||||||
 | 
					% --RNDR: renlinear
 | 
				
			||||||
 | 
					/setpacking where {pop currentpacking true setpacking} if
 | 
				
			||||||
 | 
					1 dict
 | 
				
			||||||
 | 
					dup /renlinear dup /uk.co.terryburton.bwipp findresource put
 | 
				
			||||||
 | 
					begin
 | 
				
			||||||
 | 
					/code93 {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /dontdraw false def
 | 
				
			||||||
 | 
					    /includecheck false def  % Enable/disable checkdigit
 | 
				
			||||||
 | 
					    /includetext false def   % Enable/disable text
 | 
				
			||||||
 | 
					    /textfont /Courier def
 | 
				
			||||||
 | 
					    /textsize 10 def
 | 
				
			||||||
 | 
					    /textyoffset -7 def
 | 
				
			||||||
 | 
					    /height 1 def
 | 
				
			||||||
 | 
					    /parsefnc 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
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					    /textfont textfont cvlit def
 | 
				
			||||||
 | 
					    /textsize textsize cvr def
 | 
				
			||||||
 | 
					    /textyoffset textyoffset cvr def
 | 
				
			||||||
 | 
					    /height height cvr def
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    /encs
 | 
				
			||||||
 | 
					    [ (131112) (111213) (111312) (111411) (121113)
 | 
				
			||||||
 | 
					      (121212) (121311) (111114) (131211) (141111)
 | 
				
			||||||
 | 
					      (211113) (211212) (211311) (221112) (221211)
 | 
				
			||||||
 | 
					      (231111) (112113) (112212) (112311) (122112)
 | 
				
			||||||
 | 
					      (132111) (111123) (111222) (111321) (121122)
 | 
				
			||||||
 | 
					      (131121) (212112) (212211) (211122) (211221)
 | 
				
			||||||
 | 
					      (221121) (222111) (112122) (112221) (122121)
 | 
				
			||||||
 | 
					      (123111) (121131) (311112) (311211) (321111)
 | 
				
			||||||
 | 
					      (112131) (113121) (211131) (121221) (312111)
 | 
				
			||||||
 | 
					      (311121) (122211) (111141) (1111411)
 | 
				
			||||||
 | 
					    ] def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Create a string of the available characters
 | 
				
			||||||
 | 
					    /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /barlen barcode length def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Special function characters
 | 
				
			||||||
 | 
					    /sft1 -1 def  /sft2 -2 def  /sft3 -3 def  /sft4 -4 def
 | 
				
			||||||
 | 
					    /fncvals <<
 | 
				
			||||||
 | 
					        (SFT$) sft1
 | 
				
			||||||
 | 
					        (SFT%) sft2
 | 
				
			||||||
 | 
					        (SFT/) sft3
 | 
				
			||||||
 | 
					        (SFT+) sft4
 | 
				
			||||||
 | 
					    >> def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Convert input into bytes accounting for shift characters 
 | 
				
			||||||
 | 
					    /msg barlen array def
 | 
				
			||||||
 | 
					    /i 0 def /j 0 def {
 | 
				
			||||||
 | 
					        i barlen eq {exit} if
 | 
				
			||||||
 | 
					        /char barcode i get def
 | 
				
			||||||
 | 
					        parsefnc char 94 eq and i barlen 4 sub lt and {
 | 
				
			||||||
 | 
					            barcode i 1 add get 94 ne {
 | 
				
			||||||
 | 
					                /char fncvals barcode i 1 add 4 getinterval get def
 | 
				
			||||||
 | 
					                /i i 4 add def
 | 
				
			||||||
 | 
					            } {
 | 
				
			||||||
 | 
					                /i i 1 add def
 | 
				
			||||||
 | 
					            } ifelse
 | 
				
			||||||
 | 
					        } if
 | 
				
			||||||
 | 
					        msg j char put
 | 
				
			||||||
 | 
					        /i i 1 add def
 | 
				
			||||||
 | 
					        /j j 1 add def
 | 
				
			||||||
 | 
					    } loop
 | 
				
			||||||
 | 
					    /msg msg 0 j getinterval def
 | 
				
			||||||
 | 
					    /msglen msg length def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    includecheck {
 | 
				
			||||||
 | 
					        /sbs msglen 6 mul 25 add string def
 | 
				
			||||||
 | 
					    } {
 | 
				
			||||||
 | 
					        /sbs msglen 6 mul 13 add string def
 | 
				
			||||||
 | 
					    } ifelse
 | 
				
			||||||
 | 
					    /txt msglen array def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Put the start character
 | 
				
			||||||
 | 
					    sbs 0 encs 47 get putinterval
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    /checksum1 0 def /checksum2 0 def
 | 
				
			||||||
 | 
					    0 1 msglen 1 sub {
 | 
				
			||||||
 | 
					        /i exch def
 | 
				
			||||||
 | 
					        % Lookup the encoding for the each barcode character
 | 
				
			||||||
 | 
					        msg i get dup 0 lt { 
 | 
				
			||||||
 | 
					            42 exch sub /indx exch def
 | 
				
			||||||
 | 
					            /char ( ) def
 | 
				
			||||||
 | 
					        } {
 | 
				
			||||||
 | 
					            1 string dup 0 4 -1 roll put /char exch def
 | 
				
			||||||
 | 
					            barchars char search
 | 
				
			||||||
 | 
					            pop                                  % Discard true leaving pre
 | 
				
			||||||
 | 
					            length /indx exch def                % indx is the length of pre
 | 
				
			||||||
 | 
					            pop pop                              % Discard seek and post
 | 
				
			||||||
 | 
					        } ifelse
 | 
				
			||||||
 | 
					        /enc encs indx get def                   % Get the indxth encoding
 | 
				
			||||||
 | 
					        sbs i 6 mul 6 add enc putinterval        % Put encoded digit into sbs
 | 
				
			||||||
 | 
					        txt i [char i 9 mul 9 add textyoffset textfont textsize] put
 | 
				
			||||||
 | 
					        /checksum1 checksum1 msglen i sub 1 sub 20 mod 1 add indx mul add def
 | 
				
			||||||
 | 
					        /checksum2 checksum2 msglen i sub 15 mod 1 add indx mul add def
 | 
				
			||||||
 | 
					    } for
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    includecheck {
 | 
				
			||||||
 | 
					        % Put the first checksum character
 | 
				
			||||||
 | 
					        /checksum1 checksum1 47 mod def
 | 
				
			||||||
 | 
					        /checksum2 checksum2 checksum1 add 47 mod def
 | 
				
			||||||
 | 
					        sbs msglen 6 mul 6 add encs checksum1 get putinterval
 | 
				
			||||||
 | 
					        sbs msglen 6 mul 12 add encs checksum2 get putinterval
 | 
				
			||||||
 | 
					        % Put the end character
 | 
				
			||||||
 | 
					        sbs msglen 6 mul 18 add encs 48 get putinterval
 | 
				
			||||||
 | 
					    } {
 | 
				
			||||||
 | 
					        % Put the end character
 | 
				
			||||||
 | 
					        sbs msglen 6 mul 6 add encs 48 get putinterval      
 | 
				
			||||||
 | 
					    } ifelse
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Return the arguments
 | 
				
			||||||
 | 
					    <<
 | 
				
			||||||
 | 
					    /ren //renlinear
 | 
				
			||||||
 | 
					    /sbs [sbs {48 sub} forall]
 | 
				
			||||||
 | 
					    /bhs [sbs length 1 add 2 idiv {height} repeat]
 | 
				
			||||||
 | 
					    /bbs [sbs length 1 add 2 idiv {0} repeat]
 | 
				
			||||||
 | 
					    includetext {
 | 
				
			||||||
 | 
					        /txt txt
 | 
				
			||||||
 | 
					    } if
 | 
				
			||||||
 | 
					    /opt options
 | 
				
			||||||
 | 
					    >>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dontdraw not //renlinear if
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} bind def
 | 
				
			||||||
 | 
					/code93 dup load /uk.co.terryburton.bwipp defineresource pop
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					/setpacking where {pop setpacking} if
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					gsave
 | 
				
			||||||
 | 
					50 50 translate
 | 
				
			||||||
 | 
					0 0 moveto <544f20474f204f4e4c59> <696e636c7564657465787420696e636c756465636865636b> /code93 /uk.co.terryburton.bwipp findresource exec
 | 
				
			||||||
 | 
					grestore
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					showpage
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,409 @@
 | 
				
			||||||
 | 
					%!PS-Adobe-2.0 EPSF-2.0
 | 
				
			||||||
 | 
					%%Creator: Terry Burton
 | 
				
			||||||
 | 
					%%BoundingBox: 50 40 177 122
 | 
				
			||||||
 | 
					%%EndComments
 | 
				
			||||||
 | 
					%%EndProlog
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					currentglobal
 | 
				
			||||||
 | 
					true setglobal
 | 
				
			||||||
 | 
					/Generic /Category findresource
 | 
				
			||||||
 | 
					dup length 1 add dict copy
 | 
				
			||||||
 | 
					dup /InstanceType /packedarraytype put
 | 
				
			||||||
 | 
					/uk.co.terryburton.bwipp exch /Category defineresource pop
 | 
				
			||||||
 | 
					setglobal
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/setpacking where {pop currentpacking true setpacking} if
 | 
				
			||||||
 | 
					1 dict
 | 
				
			||||||
 | 
					begin
 | 
				
			||||||
 | 
					/renlinear {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    20 dict begin          % Confine variables to local scope
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /args exch def   % We are given some arguments
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Default options
 | 
				
			||||||
 | 
					    /sbs [] def
 | 
				
			||||||
 | 
					    /bhs [] def
 | 
				
			||||||
 | 
					    /bbs [] def
 | 
				
			||||||
 | 
					    /txt [] def
 | 
				
			||||||
 | 
					    /barcolor (unset) def
 | 
				
			||||||
 | 
					    /includetext false def
 | 
				
			||||||
 | 
					    /textcolor (unset) def
 | 
				
			||||||
 | 
					    /textxalign (unset) def
 | 
				
			||||||
 | 
					    /textyalign (unset) def
 | 
				
			||||||
 | 
					    /textfont (Courier) def
 | 
				
			||||||
 | 
					    /textsize 10 def
 | 
				
			||||||
 | 
					    /textxoffset 0 def
 | 
				
			||||||
 | 
					    /textyoffset 0 def
 | 
				
			||||||
 | 
					    /textgaps 0 def
 | 
				
			||||||
 | 
					    /alttext () def
 | 
				
			||||||
 | 
					    /bordercolor (unset) def
 | 
				
			||||||
 | 
					    /backgroundcolor (unset) def
 | 
				
			||||||
 | 
					    /inkspread 0.15 def
 | 
				
			||||||
 | 
					    /width 0 def
 | 
				
			||||||
 | 
					    /barratio 1 def
 | 
				
			||||||
 | 
					    /spaceratio 1 def
 | 
				
			||||||
 | 
					    /showborder false def
 | 
				
			||||||
 | 
					    /borderleft 10 def
 | 
				
			||||||
 | 
					    /borderright 10 def
 | 
				
			||||||
 | 
					    /bordertop 1 def
 | 
				
			||||||
 | 
					    /borderbottom 1 def
 | 
				
			||||||
 | 
					    /borderwidth 0.5 def
 | 
				
			||||||
 | 
					    /guardwhitespace false def
 | 
				
			||||||
 | 
					    /guardleftpos 0 def
 | 
				
			||||||
 | 
					    /guardleftypos 0 def
 | 
				
			||||||
 | 
					    /guardrightpos 0 def
 | 
				
			||||||
 | 
					    /guardrightypos 0 def
 | 
				
			||||||
 | 
					    /guardwidth 6 def
 | 
				
			||||||
 | 
					    /guardheight 7 def
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    % Apply the renderer options and the user options
 | 
				
			||||||
 | 
					    args {def} forall
 | 
				
			||||||
 | 
					    opt {def} forall 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /barcolor barcolor cvlit def
 | 
				
			||||||
 | 
					    /textcolor textcolor cvlit def
 | 
				
			||||||
 | 
					    /textxalign textxalign cvlit def
 | 
				
			||||||
 | 
					    /textyalign textyalign cvlit def
 | 
				
			||||||
 | 
					    /textfont textfont cvlit def
 | 
				
			||||||
 | 
					    /textsize textsize cvr def
 | 
				
			||||||
 | 
					    /textxoffset textxoffset cvr def
 | 
				
			||||||
 | 
					    /textyoffset textyoffset cvr def
 | 
				
			||||||
 | 
					    /textgaps textgaps cvr def
 | 
				
			||||||
 | 
					    /alttext alttext cvlit def
 | 
				
			||||||
 | 
					    /bordercolor bordercolor cvlit def
 | 
				
			||||||
 | 
					    /backgroundcolor backgroundcolor cvlit def
 | 
				
			||||||
 | 
					    /inkspread inkspread cvr def
 | 
				
			||||||
 | 
					    /width width cvr def
 | 
				
			||||||
 | 
					    /barratio barratio cvr def
 | 
				
			||||||
 | 
					    /spaceratio spaceratio cvr def
 | 
				
			||||||
 | 
					    /borderleft borderleft cvr def
 | 
				
			||||||
 | 
					    /borderright borderright cvr def
 | 
				
			||||||
 | 
					    /bordertop bordertop cvr def
 | 
				
			||||||
 | 
					    /borderbottom borderbottom cvr def
 | 
				
			||||||
 | 
					    /borderwidth borderwidth cvr def
 | 
				
			||||||
 | 
					    /guardleftpos guardleftpos cvr def
 | 
				
			||||||
 | 
					    /guardleftypos guardleftypos cvr def
 | 
				
			||||||
 | 
					    /guardrightpos guardrightpos cvr def
 | 
				
			||||||
 | 
					    /guardrightypos guardrightypos cvr def
 | 
				
			||||||
 | 
					    /guardwidth guardwidth cvr def
 | 
				
			||||||
 | 
					    /guardheight guardheight cvr def
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    % 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
 | 
				
			||||||
 | 
					    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
 | 
				
			||||||
 | 
					            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
 | 
				
			||||||
 | 
					                /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
 | 
				
			||||||
 | 
					            } {
 | 
				
			||||||
 | 
					                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 
 | 
				
			||||||
 | 
					        } ifelse
 | 
				
			||||||
 | 
					        /x x d add def  % x+=d
 | 
				
			||||||
 | 
					    } for
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    gsave
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    currentpoint translate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Force symbol to given width
 | 
				
			||||||
 | 
					    width 0 ne {
 | 
				
			||||||
 | 
					        width 72 mul x div 1 scale
 | 
				
			||||||
 | 
					    } if
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Set RGB or CMYK color depending on length of given hex string
 | 
				
			||||||
 | 
					    /setanycolor {
 | 
				
			||||||
 | 
					        /anycolor exch def
 | 
				
			||||||
 | 
					        anycolor length 6 eq {
 | 
				
			||||||
 | 
					            (<      >) 8 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setrgbcolor
 | 
				
			||||||
 | 
					        } if
 | 
				
			||||||
 | 
					        anycolor length 8 eq {
 | 
				
			||||||
 | 
					            (<        >) 10 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setcmykcolor
 | 
				
			||||||
 | 
					        } if
 | 
				
			||||||
 | 
					    } bind def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % 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    
 | 
				
			||||||
 | 
					    closepath
 | 
				
			||||||
 | 
					    backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if     
 | 
				
			||||||
 | 
					    showborder {
 | 
				
			||||||
 | 
					        gsave
 | 
				
			||||||
 | 
					        bordercolor (unset) ne { bordercolor setanycolor } if
 | 
				
			||||||
 | 
					        borderwidth setlinewidth stroke
 | 
				
			||||||
 | 
					        grestore
 | 
				
			||||||
 | 
					    } if    
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					    % Display the bars for elements in the bars array
 | 
				
			||||||
 | 
					    gsave
 | 
				
			||||||
 | 
					    0 setlinecap
 | 
				
			||||||
 | 
					    barcolor (unset) ne { barcolor setanycolor } if
 | 
				
			||||||
 | 
					    bars {
 | 
				
			||||||
 | 
					        dup -1 ne {
 | 
				
			||||||
 | 
					            aload pop newpath setlinewidth moveto 0 exch rlineto stroke
 | 
				
			||||||
 | 
					        } {
 | 
				
			||||||
 | 
					            pop
 | 
				
			||||||
 | 
					        } ifelse
 | 
				
			||||||
 | 
					    } forall
 | 
				
			||||||
 | 
					    grestore
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    % Display the text for elements in the text array
 | 
				
			||||||
 | 
					    textcolor (unset) ne { textcolor setanycolor } if
 | 
				
			||||||
 | 
					    includetext {
 | 
				
			||||||
 | 
					        textxalign (unset) eq textyalign (unset) eq and alttext () eq and {
 | 
				
			||||||
 | 
					            /s 0 def /f () def
 | 
				
			||||||
 | 
					            txt {
 | 
				
			||||||
 | 
					                {} forall
 | 
				
			||||||
 | 
					                2 copy s ne exch f ne or {
 | 
				
			||||||
 | 
					                    2 copy /s exch def /f exch def            
 | 
				
			||||||
 | 
					                    exch findfont exch scalefont setfont          
 | 
				
			||||||
 | 
					                } {
 | 
				
			||||||
 | 
					                    pop pop
 | 
				
			||||||
 | 
					                } ifelse
 | 
				
			||||||
 | 
					                moveto show
 | 
				
			||||||
 | 
					            } forall
 | 
				
			||||||
 | 
					        } {
 | 
				
			||||||
 | 
					            textfont findfont textsize scalefont setfont
 | 
				
			||||||
 | 
					            alttext () eq {
 | 
				
			||||||
 | 
					                /txt [ txt { 0 get {} forall } forall ] def
 | 
				
			||||||
 | 
					                /tstr txt length string def
 | 
				
			||||||
 | 
					                0 1 txt length 1 sub { dup txt exch get tstr 3 1 roll put } for
 | 
				
			||||||
 | 
					            } {
 | 
				
			||||||
 | 
					                /tstr alttext def
 | 
				
			||||||
 | 
					            } ifelse
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            % Find true ascent of font
 | 
				
			||||||
 | 
					            tstr length 0 eq {
 | 
				
			||||||
 | 
					                0
 | 
				
			||||||
 | 
					            } {
 | 
				
			||||||
 | 
					                gsave
 | 
				
			||||||
 | 
					                newpath 0 0 moveto (0) false charpath pathbbox
 | 
				
			||||||
 | 
					                4 1 roll pop pop pop
 | 
				
			||||||
 | 
					                grestore
 | 
				
			||||||
 | 
					                currentfont /PaintType known {currentfont /PaintType get 2 eq} {false} ifelse
 | 
				
			||||||
 | 
					                currentfont /StrokeWidth known and {
 | 
				
			||||||
 | 
					                    currentfont /StrokeWidth get 2 div 0 exch
 | 
				
			||||||
 | 
					                    currentfont /FontMatrix get dtransform
 | 
				
			||||||
 | 
					                    dup mul exch dup mul add sqrt
 | 
				
			||||||
 | 
					                    add
 | 
				
			||||||
 | 
					                } if
 | 
				
			||||||
 | 
					            } ifelse
 | 
				
			||||||
 | 
					            /textascent exch def
 | 
				
			||||||
 | 
					            /textwidth tstr stringwidth pop tstr length 1 sub textgaps mul add def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            /textxpos textxoffset x 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 (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 {
 | 
				
			||||||
 | 
					                /textxpos 0 def
 | 
				
			||||||
 | 
					                /textgaps x 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
 | 
				
			||||||
 | 
					            textxpos textypos moveto textgaps 0 tstr ashow
 | 
				
			||||||
 | 
					        } ifelse
 | 
				
			||||||
 | 
					    } if    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Display the guard elements
 | 
				
			||||||
 | 
					    guardwhitespace {
 | 
				
			||||||
 | 
					        0.75 setlinewidth
 | 
				
			||||||
 | 
					        guardleftpos 0 ne {
 | 
				
			||||||
 | 
					            newpath
 | 
				
			||||||
 | 
					            guardleftpos neg guardwidth add guardleftypos guardwidth 2 div add moveto
 | 
				
			||||||
 | 
					            guardwidth neg guardheight -2 div rlineto
 | 
				
			||||||
 | 
					            guardwidth guardheight -2 div rlineto
 | 
				
			||||||
 | 
					            stroke            
 | 
				
			||||||
 | 
					        } if
 | 
				
			||||||
 | 
					        guardrightpos 0 ne {
 | 
				
			||||||
 | 
					            newpath
 | 
				
			||||||
 | 
					            guardrightpos x add guardwidth sub guardrightypos guardheight 2 div add moveto
 | 
				
			||||||
 | 
					            guardwidth guardheight -2 div rlineto
 | 
				
			||||||
 | 
					            guardwidth neg guardheight -2 div rlineto
 | 
				
			||||||
 | 
					            stroke            
 | 
				
			||||||
 | 
					        } if
 | 
				
			||||||
 | 
					    } if
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    grestore
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} bind def
 | 
				
			||||||
 | 
					/renlinear dup load /uk.co.terryburton.bwipp defineresource pop
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					/setpacking where {pop setpacking} if
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					% --DESC: Code 93
 | 
				
			||||||
 | 
					% --EXAM: THIS IS CODE 93
 | 
				
			||||||
 | 
					% --EXOP: includetext includecheck
 | 
				
			||||||
 | 
					% --RNDR: renlinear
 | 
				
			||||||
 | 
					/setpacking where {pop currentpacking true setpacking} if
 | 
				
			||||||
 | 
					1 dict
 | 
				
			||||||
 | 
					dup /renlinear dup /uk.co.terryburton.bwipp findresource put
 | 
				
			||||||
 | 
					begin
 | 
				
			||||||
 | 
					/code93 {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /dontdraw false def
 | 
				
			||||||
 | 
					    /includecheck false def  % Enable/disable checkdigit
 | 
				
			||||||
 | 
					    /includetext false def   % Enable/disable text
 | 
				
			||||||
 | 
					    /textfont /Courier def
 | 
				
			||||||
 | 
					    /textsize 10 def
 | 
				
			||||||
 | 
					    /textyoffset -7 def
 | 
				
			||||||
 | 
					    /height 1 def
 | 
				
			||||||
 | 
					    /parsefnc 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
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					    /textfont textfont cvlit def
 | 
				
			||||||
 | 
					    /textsize textsize cvr def
 | 
				
			||||||
 | 
					    /textyoffset textyoffset cvr def
 | 
				
			||||||
 | 
					    /height height cvr def
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    /encs
 | 
				
			||||||
 | 
					    [ (131112) (111213) (111312) (111411) (121113)
 | 
				
			||||||
 | 
					      (121212) (121311) (111114) (131211) (141111)
 | 
				
			||||||
 | 
					      (211113) (211212) (211311) (221112) (221211)
 | 
				
			||||||
 | 
					      (231111) (112113) (112212) (112311) (122112)
 | 
				
			||||||
 | 
					      (132111) (111123) (111222) (111321) (121122)
 | 
				
			||||||
 | 
					      (131121) (212112) (212211) (211122) (211221)
 | 
				
			||||||
 | 
					      (221121) (222111) (112122) (112221) (122121)
 | 
				
			||||||
 | 
					      (123111) (121131) (311112) (311211) (321111)
 | 
				
			||||||
 | 
					      (112131) (113121) (211131) (121221) (312111)
 | 
				
			||||||
 | 
					      (311121) (122211) (111141) (1111411)
 | 
				
			||||||
 | 
					    ] def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Create a string of the available characters
 | 
				
			||||||
 | 
					    /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /barlen barcode length def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Special function characters
 | 
				
			||||||
 | 
					    /sft1 -1 def  /sft2 -2 def  /sft3 -3 def  /sft4 -4 def
 | 
				
			||||||
 | 
					    /fncvals <<
 | 
				
			||||||
 | 
					        (SFT$) sft1
 | 
				
			||||||
 | 
					        (SFT%) sft2
 | 
				
			||||||
 | 
					        (SFT/) sft3
 | 
				
			||||||
 | 
					        (SFT+) sft4
 | 
				
			||||||
 | 
					    >> def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Convert input into bytes accounting for shift characters 
 | 
				
			||||||
 | 
					    /msg barlen array def
 | 
				
			||||||
 | 
					    /i 0 def /j 0 def {
 | 
				
			||||||
 | 
					        i barlen eq {exit} if
 | 
				
			||||||
 | 
					        /char barcode i get def
 | 
				
			||||||
 | 
					        parsefnc char 94 eq and i barlen 4 sub lt and {
 | 
				
			||||||
 | 
					            barcode i 1 add get 94 ne {
 | 
				
			||||||
 | 
					                /char fncvals barcode i 1 add 4 getinterval get def
 | 
				
			||||||
 | 
					                /i i 4 add def
 | 
				
			||||||
 | 
					            } {
 | 
				
			||||||
 | 
					                /i i 1 add def
 | 
				
			||||||
 | 
					            } ifelse
 | 
				
			||||||
 | 
					        } if
 | 
				
			||||||
 | 
					        msg j char put
 | 
				
			||||||
 | 
					        /i i 1 add def
 | 
				
			||||||
 | 
					        /j j 1 add def
 | 
				
			||||||
 | 
					    } loop
 | 
				
			||||||
 | 
					    /msg msg 0 j getinterval def
 | 
				
			||||||
 | 
					    /msglen msg length def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    includecheck {
 | 
				
			||||||
 | 
					        /sbs msglen 6 mul 25 add string def
 | 
				
			||||||
 | 
					    } {
 | 
				
			||||||
 | 
					        /sbs msglen 6 mul 13 add string def
 | 
				
			||||||
 | 
					    } ifelse
 | 
				
			||||||
 | 
					    /txt msglen array def
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Put the start character
 | 
				
			||||||
 | 
					    sbs 0 encs 47 get putinterval
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    /checksum1 0 def /checksum2 0 def
 | 
				
			||||||
 | 
					    0 1 msglen 1 sub {
 | 
				
			||||||
 | 
					        /i exch def
 | 
				
			||||||
 | 
					        % Lookup the encoding for the each barcode character
 | 
				
			||||||
 | 
					        msg i get dup 0 lt { 
 | 
				
			||||||
 | 
					            42 exch sub /indx exch def
 | 
				
			||||||
 | 
					            /char ( ) def
 | 
				
			||||||
 | 
					        } {
 | 
				
			||||||
 | 
					            1 string dup 0 4 -1 roll put /char exch def
 | 
				
			||||||
 | 
					            barchars char search
 | 
				
			||||||
 | 
					            pop                                  % Discard true leaving pre
 | 
				
			||||||
 | 
					            length /indx exch def                % indx is the length of pre
 | 
				
			||||||
 | 
					            pop pop                              % Discard seek and post
 | 
				
			||||||
 | 
					        } ifelse
 | 
				
			||||||
 | 
					        /enc encs indx get def                   % Get the indxth encoding
 | 
				
			||||||
 | 
					        sbs i 6 mul 6 add enc putinterval        % Put encoded digit into sbs
 | 
				
			||||||
 | 
					        txt i [char i 9 mul 9 add textyoffset textfont textsize] put
 | 
				
			||||||
 | 
					        /checksum1 checksum1 msglen i sub 1 sub 20 mod 1 add indx mul add def
 | 
				
			||||||
 | 
					        /checksum2 checksum2 msglen i sub 15 mod 1 add indx mul add def
 | 
				
			||||||
 | 
					    } for
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    includecheck {
 | 
				
			||||||
 | 
					        % Put the first checksum character
 | 
				
			||||||
 | 
					        /checksum1 checksum1 47 mod def
 | 
				
			||||||
 | 
					        /checksum2 checksum2 checksum1 add 47 mod def
 | 
				
			||||||
 | 
					        sbs msglen 6 mul 6 add encs checksum1 get putinterval
 | 
				
			||||||
 | 
					        sbs msglen 6 mul 12 add encs checksum2 get putinterval
 | 
				
			||||||
 | 
					        % Put the end character
 | 
				
			||||||
 | 
					        sbs msglen 6 mul 18 add encs 48 get putinterval
 | 
				
			||||||
 | 
					    } {
 | 
				
			||||||
 | 
					        % Put the end character
 | 
				
			||||||
 | 
					        sbs msglen 6 mul 6 add encs 48 get putinterval      
 | 
				
			||||||
 | 
					    } ifelse
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % Return the arguments
 | 
				
			||||||
 | 
					    <<
 | 
				
			||||||
 | 
					    /ren //renlinear
 | 
				
			||||||
 | 
					    /sbs [sbs {48 sub} forall]
 | 
				
			||||||
 | 
					    /bhs [sbs length 1 add 2 idiv {height} repeat]
 | 
				
			||||||
 | 
					    /bbs [sbs length 1 add 2 idiv {0} repeat]
 | 
				
			||||||
 | 
					    includetext {
 | 
				
			||||||
 | 
					        /txt txt
 | 
				
			||||||
 | 
					    } if
 | 
				
			||||||
 | 
					    /opt options
 | 
				
			||||||
 | 
					    >>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dontdraw not //renlinear if
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} bind def
 | 
				
			||||||
 | 
					/code93 dup load /uk.co.terryburton.bwipp defineresource pop
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					/setpacking where {pop setpacking} if
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					gsave
 | 
				
			||||||
 | 
					50 50 translate
 | 
				
			||||||
 | 
					0 0 moveto <544f20474f2050524556> <696e636c7564657465787420696e636c756465636865636b> /code93 /uk.co.terryburton.bwipp findresource exec
 | 
				
			||||||
 | 
					grestore
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					showpage
 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
		 Before Width: | Height: | Size: 165 KiB After Width: | Height: | Size: 157 KiB  | 
| 
						 | 
					@ -6,7 +6,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from __future__ import print_function
 | 
					from __future__ import print_function
 | 
				
			||||||
import freitagslib.network as net
 | 
					import freitagslib.network as net
 | 
				
			||||||
from freitagslib.commands import BuyCommand, DepositCommand, ToGoCommand
 | 
					from freitagslib.commands import BuyCommand, DepositCommand
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import colorama
 | 
					import colorama
 | 
				
			||||||
from colorama import Fore, Style
 | 
					from colorama import Fore, Style
 | 
				
			||||||
| 
						 | 
					@ -19,7 +19,7 @@ import time
 | 
				
			||||||
import urllib2
 | 
					import urllib2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
COLOR_WARN = Fore.YELLOW
 | 
					COLOR_HINT = Fore.YELLOW + Style.BRIGHT
 | 
				
			||||||
COLOR_ERROR = Fore.RED
 | 
					COLOR_ERROR = Fore.RED
 | 
				
			||||||
COLOR_DEPOSIT = Fore.GREEN + Style.BRIGHT
 | 
					COLOR_DEPOSIT = Fore.GREEN + Style.BRIGHT
 | 
				
			||||||
COLOR_TO_GO = Fore.MAGENTA + Style.BRIGHT
 | 
					COLOR_TO_GO = Fore.MAGENTA + Style.BRIGHT
 | 
				
			||||||
| 
						 | 
					@ -70,14 +70,19 @@ def delay(what, seconds):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def warn_balance():
 | 
					def warn_balance():
 | 
				
			||||||
	print('Kontostrand im Minus, bitte Geld aufladen.')
 | 
						print('Kontostand im Minus, bitte Geld aufladen.')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def error_page(message):
 | 
					def error_page(error_message, hint_message=None):
 | 
				
			||||||
	clear()
 | 
						clear()
 | 
				
			||||||
	print(COLOR_ERROR + message + COLOR_RESET)
 | 
						print(COLOR_ERROR + error_message + COLOR_RESET)
 | 
				
			||||||
	print()
 | 
						print()
 | 
				
			||||||
	delay('Weiter', 3)
 | 
						delay_seconds = 3
 | 
				
			||||||
 | 
						if hint_message is not None:
 | 
				
			||||||
 | 
							print(COLOR_HINT + hint_message + COLOR_RESET)
 | 
				
			||||||
 | 
							print()
 | 
				
			||||||
 | 
							delay_seconds += 3
 | 
				
			||||||
 | 
						delay('Weiter', delay_seconds)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Status:
 | 
					class Status:
 | 
				
			||||||
| 
						 | 
					@ -98,22 +103,14 @@ class Status:
 | 
				
			||||||
		def color(amount):
 | 
							def color(amount):
 | 
				
			||||||
			return COLOR_WITHDRAW if amount < 0 else COLOR_DEPOSIT
 | 
								return COLOR_WITHDRAW if amount < 0 else COLOR_DEPOSIT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		def color_command(command):
 | 
					 | 
				
			||||||
			diff = command.difference()
 | 
					 | 
				
			||||||
			if diff >= 0:
 | 
					 | 
				
			||||||
				return COLOR_DEPOSIT
 | 
					 | 
				
			||||||
			return COLOR_TO_GO if isinstance(command, ToGoCommand) else COLOR_WITHDRAW
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		def show_total(balance, plus=' '):
 | 
							def show_total(balance, plus=' '):
 | 
				
			||||||
			print('%3s %-40s  %s%c %6.2f Euro%s' \
 | 
								print('%3s %-40s  %s%c %6.2f Euro%s' \
 | 
				
			||||||
					% ('', '', color(balance), sign(balance, plus),
 | 
										% ('', '', color(balance), sign(balance, plus),
 | 
				
			||||||
						abs(balance), COLOR_RESET))
 | 
											abs(balance), COLOR_RESET))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		def show_item(position, command):
 | 
							def show_item(position, diff, label, color):
 | 
				
			||||||
			diff = command.difference()
 | 
					 | 
				
			||||||
			label = command.label()
 | 
					 | 
				
			||||||
			print('%2d) %-40s  %s%c %6.2f Euro%s' \
 | 
								print('%2d) %-40s  %s%c %6.2f Euro%s' \
 | 
				
			||||||
					% (position, label, color_command(command), sign(diff),
 | 
										% (position, label, color, sign(diff),
 | 
				
			||||||
					abs(diff), COLOR_RESET))
 | 
										abs(diff), COLOR_RESET))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		def show_bar():
 | 
							def show_bar():
 | 
				
			||||||
| 
						 | 
					@ -127,8 +124,18 @@ class Status:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				print('Geplante Änderungen:')
 | 
									print('Geplante Änderungen:')
 | 
				
			||||||
				show_total(initial_balance)
 | 
									show_total(initial_balance)
 | 
				
			||||||
				for i, (command, balance_backup) in enumerate(self.transfers):
 | 
									i = 1
 | 
				
			||||||
					show_item(i + 1, command)
 | 
									for command, dummy in self.transfers:
 | 
				
			||||||
 | 
										if isinstance(command, BuyCommand):
 | 
				
			||||||
 | 
											if (command.includes_commodity()):
 | 
				
			||||||
 | 
												show_item(i, -command.commodity_value(), command.commodity_label(), COLOR_WITHDRAW)
 | 
				
			||||||
 | 
												i += 1
 | 
				
			||||||
 | 
											if (command.includes_deposit()):
 | 
				
			||||||
 | 
												show_item(i, -command.deposit_value(), command.deposit_label(), COLOR_TO_GO)
 | 
				
			||||||
 | 
												i += 1
 | 
				
			||||||
 | 
										else:
 | 
				
			||||||
 | 
											show_item(i, command.difference(), command.label(), COLOR_DEPOSIT)
 | 
				
			||||||
 | 
											i += 1
 | 
				
			||||||
				show_bar()
 | 
									show_bar()
 | 
				
			||||||
				if len(self.transfers) > 1:
 | 
									if len(self.transfers) > 1:
 | 
				
			||||||
					show_total(self.balance - initial_balance, plus='+')
 | 
										show_total(self.balance - initial_balance, plus='+')
 | 
				
			||||||
| 
						 | 
					@ -215,109 +222,78 @@ class Status:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if scope == TO_GO_ALL:
 | 
							if scope == TO_GO_ALL:
 | 
				
			||||||
			"""
 | 
								"""
 | 
				
			||||||
			Adds a ToGoCommands for each BuyCommands with deposit > 0 lacking a pair
 | 
								Makes all BuyCommands with deposit > 0 include deposit
 | 
				
			||||||
 | 
								...and updates future balance accordingly.
 | 
				
			||||||
			"""
 | 
								"""
 | 
				
			||||||
			after = list()
 | 
					 | 
				
			||||||
			dummy, initial_balance = self.transfers[0]
 | 
								dummy, initial_balance = self.transfers[0]
 | 
				
			||||||
			balance_before = initial_balance
 | 
								balance_before = initial_balance
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			def body(prev, command, balance_before):
 | 
								for command, dummy in self.transfers:
 | 
				
			||||||
				if isinstance(prev, BuyCommand) \
 | 
					 | 
				
			||||||
						and prev.deposit() > 0 \
 | 
					 | 
				
			||||||
						and (not isinstance(command, ToGoCommand) \
 | 
					 | 
				
			||||||
							or (isinstance(command, ToGoCommand) \
 | 
					 | 
				
			||||||
								and prev.item() != command.item())):
 | 
					 | 
				
			||||||
					to_go = ToGoCommand(prev.item())
 | 
					 | 
				
			||||||
					prev.set_to_go(True)
 | 
					 | 
				
			||||||
					after.append((to_go, balance_before))
 | 
					 | 
				
			||||||
					balance_before += to_go.difference()
 | 
					 | 
				
			||||||
				if command is not None:
 | 
					 | 
				
			||||||
					after.append((command, balance_before))
 | 
					 | 
				
			||||||
					balance_before += command.difference()
 | 
					 | 
				
			||||||
				return balance_before
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			prev = None
 | 
					 | 
				
			||||||
			for command, dummy in list(self.transfers):
 | 
					 | 
				
			||||||
				balance_before = body(prev, command, balance_before)
 | 
					 | 
				
			||||||
				prev = command
 | 
					 | 
				
			||||||
			balance_before = body(prev, None, balance_before)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			self.balance = balance_before
 | 
					 | 
				
			||||||
			self.transfers = after
 | 
					 | 
				
			||||||
		elif scope == TO_GO_NONE:
 | 
					 | 
				
			||||||
			"""
 | 
					 | 
				
			||||||
			Deletes all ToGoCommands
 | 
					 | 
				
			||||||
			"""
 | 
					 | 
				
			||||||
			after = list()
 | 
					 | 
				
			||||||
			first_command, initial_balance = self.transfers[0]
 | 
					 | 
				
			||||||
			balance_before = initial_balance
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			for command, dummy in list(self.transfers):
 | 
					 | 
				
			||||||
				if isinstance(command, BuyCommand) \
 | 
									if isinstance(command, BuyCommand) \
 | 
				
			||||||
						and command.is_to_go():
 | 
											and not command.includes_deposit() \
 | 
				
			||||||
					command.set_to_go(False)
 | 
											and command.deposit_value() > 0:
 | 
				
			||||||
				elif isinstance(command, ToGoCommand):
 | 
										command.include_deposit(True)
 | 
				
			||||||
					continue
 | 
									balance_before += command.difference()
 | 
				
			||||||
				after.append((command, balance_before))
 | 
					
 | 
				
			||||||
 | 
								self.balance = balance_before
 | 
				
			||||||
 | 
							elif scope == TO_GO_NONE:
 | 
				
			||||||
 | 
								"""
 | 
				
			||||||
 | 
								Makes all BuyCommands that include commodity
 | 
				
			||||||
 | 
								not include deposit any more
 | 
				
			||||||
 | 
								...and updates future balance accordingly.
 | 
				
			||||||
 | 
								"""
 | 
				
			||||||
 | 
								first_command, initial_balance = self.transfers[0]
 | 
				
			||||||
 | 
								balance_before = initial_balance
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								for command, dummy in self.transfers:
 | 
				
			||||||
 | 
									if isinstance(command, BuyCommand) \
 | 
				
			||||||
 | 
											and command.includes_commodity():
 | 
				
			||||||
 | 
										command.include_deposit(False)
 | 
				
			||||||
				balance_before += command.difference()
 | 
									balance_before += command.difference()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			self.balance = balance_before
 | 
								self.balance = balance_before
 | 
				
			||||||
			self.transfers = after
 | 
					 | 
				
			||||||
		elif scope == TO_GO_PREV:
 | 
							elif scope == TO_GO_PREV:
 | 
				
			||||||
			"""
 | 
								"""
 | 
				
			||||||
			Adds a ToGoCommand after previous BuyCommand
 | 
								Makes the last BuyCommand include deposit
 | 
				
			||||||
 | 
								...and updates future balance accordingly.
 | 
				
			||||||
			"""
 | 
								"""
 | 
				
			||||||
			prev, balance_backup = self.transfers[-1]
 | 
								prev, balance_backup = self.transfers[-1]
 | 
				
			||||||
			if not isinstance(prev, BuyCommand):
 | 
								if not isinstance(prev, BuyCommand):
 | 
				
			||||||
				error_page(_PRODUCT_FIRST)
 | 
									error_page(_PRODUCT_FIRST)
 | 
				
			||||||
				return
 | 
									return
 | 
				
			||||||
			to_go = ToGoCommand(prev.item())
 | 
								if prev.includes_deposit():
 | 
				
			||||||
			prev.set_to_go(True)
 | 
									error_page('FEHLER: Pfand für Produkt "%s" bereits aktiviert' % prev.item_name())
 | 
				
			||||||
			self.transfers.append((to_go, self.balance))
 | 
									return
 | 
				
			||||||
			self.balance += to_go.difference()
 | 
								if prev.deposit_value() <= 0:
 | 
				
			||||||
 | 
									error_page('FEHLER: Produkt "%s" hat kein Pfand' % prev.item_name())
 | 
				
			||||||
 | 
									return
 | 
				
			||||||
 | 
								before = prev.difference()
 | 
				
			||||||
 | 
								prev.include_deposit(True)
 | 
				
			||||||
 | 
								after = prev.difference()
 | 
				
			||||||
 | 
								self.balance += (after - before)
 | 
				
			||||||
		elif scope == TO_GO_ONLY:
 | 
							elif scope == TO_GO_ONLY:
 | 
				
			||||||
			"""
 | 
								"""
 | 
				
			||||||
			Replace all BuyCommands with deposit > 0 by
 | 
								Makes all BuyCommand that include commodity
 | 
				
			||||||
			a ToGoCommand.  Resolve ToGoCommand duplicates.
 | 
								be deposit only
 | 
				
			||||||
 | 
								...and updates future balance accordingly.
 | 
				
			||||||
			"""
 | 
								"""
 | 
				
			||||||
			after = list()
 | 
								dummy, initial_balance = self.transfers[0]
 | 
				
			||||||
			first_command, initial_balance = self.transfers[0]
 | 
					 | 
				
			||||||
			balance_before = initial_balance
 | 
								balance_before = initial_balance
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			for command, dummy in list(self.transfers):
 | 
								for command, dummy in self.transfers:
 | 
				
			||||||
				if isinstance(command, ToGoCommand) \
 | 
									if isinstance(command, BuyCommand) \
 | 
				
			||||||
						and prev_item is not None \
 | 
											and command.deposit_value() > 0 \
 | 
				
			||||||
						and command.item() == prev_item:
 | 
											and command.includes_commodity():
 | 
				
			||||||
					"""
 | 
										command.include_commodity(False)
 | 
				
			||||||
					Skip this very duplicate
 | 
										command.include_deposit(True)
 | 
				
			||||||
					"""
 | 
					 | 
				
			||||||
					prev_item = None
 | 
					 | 
				
			||||||
					continue
 | 
					 | 
				
			||||||
				elif isinstance(command, BuyCommand) \
 | 
					 | 
				
			||||||
						and command.deposit() > 0:
 | 
					 | 
				
			||||||
					"""
 | 
					 | 
				
			||||||
					Replace by ToGoCommand
 | 
					 | 
				
			||||||
					"""
 | 
					 | 
				
			||||||
					item = command.item()
 | 
					 | 
				
			||||||
					command = ToGoCommand(item)
 | 
					 | 
				
			||||||
					prev_item = item
 | 
					 | 
				
			||||||
				else:
 | 
					 | 
				
			||||||
					prev_item = None
 | 
					 | 
				
			||||||
				after.append((command, balance_before))
 | 
					 | 
				
			||||||
				balance_before += command.difference()
 | 
									balance_before += command.difference()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			self.balance = balance_before
 | 
								self.balance = balance_before
 | 
				
			||||||
			self.transfers = after
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def undo(self):
 | 
						def undo(self):
 | 
				
			||||||
		assert(self.logged_in())
 | 
							assert(self.logged_in())
 | 
				
			||||||
		if self.transfers:
 | 
							if self.transfers:
 | 
				
			||||||
			(last_command, balance_backup) = self.transfers[-1]
 | 
								dummy, balance_backup = self.transfers[-1]
 | 
				
			||||||
			if isinstance(last_command, ToGoCommand) \
 | 
					 | 
				
			||||||
					and self.transfers:
 | 
					 | 
				
			||||||
				second_last_command = self.transfers[-2]
 | 
					 | 
				
			||||||
				if isinstance(second_last_command, BuyCommand):
 | 
					 | 
				
			||||||
					second_last_command.set_to_go(False)
 | 
					 | 
				
			||||||
			self.transfers.pop()
 | 
								self.transfers.pop()
 | 
				
			||||||
			self.balance = balance_backup
 | 
								self.balance = balance_backup
 | 
				
			||||||
		else:
 | 
							else:
 | 
				
			||||||
| 
						 | 
					@ -352,6 +328,14 @@ def handle(line, status):
 | 
				
			||||||
	else:
 | 
						else:
 | 
				
			||||||
		try:
 | 
							try:
 | 
				
			||||||
			status.login(line)
 | 
								status.login(line)
 | 
				
			||||||
 | 
							except urllib2.HTTPError as e:
 | 
				
			||||||
 | 
								if e.code == 404:  # URL not found == user unknown
 | 
				
			||||||
 | 
									error_page('FEHLER: Benutzer "%s" nicht bekannt' % line,
 | 
				
			||||||
 | 
											hint_message='Ist in der WebApp unter "Einstellungen" ' \
 | 
				
			||||||
 | 
											'für Ihren Account Plugin "BarcodePlugin" ' \
 | 
				
			||||||
 | 
											'als erlaubt markiert?')
 | 
				
			||||||
 | 
								else:
 | 
				
			||||||
 | 
									error_page('FEHLER bei Kommunikation mit Server "%s"' % str(e))
 | 
				
			||||||
		except urllib2.URLError as e:
 | 
							except urllib2.URLError as e:
 | 
				
			||||||
			error_page('FEHLER bei Kommunikation mit Server "%s"' % str(e))
 | 
								error_page('FEHLER bei Kommunikation mit Server "%s"' % str(e))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,18 +5,16 @@
 | 
				
			||||||
# Licensed under GPL v3 or later
 | 
					# Licensed under GPL v3 or later
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import freitagslib.network as net
 | 
					import freitagslib.network as net
 | 
				
			||||||
from freitagslib.network import ITEM_ONLY, DEPOSIT_ONLY
 | 
					from freitagslib.network import ITEM_ONLY, DEPOSIT_ONLY, ITEM_AND_DEPOSIT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Command(object):
 | 
					class DepositCommand(object):
 | 
				
			||||||
	def difference(self):
 | 
					 | 
				
			||||||
		return self._difference
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class DepositCommand(Command):
 | 
					 | 
				
			||||||
	def __init__(self, amount):
 | 
						def __init__(self, amount):
 | 
				
			||||||
		self._difference = amount
 | 
							self._difference = amount
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def difference(self):
 | 
				
			||||||
 | 
							self._difference
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def run(self, user_name):
 | 
						def run(self, user_name):
 | 
				
			||||||
		net.deposit(self._difference, net.DEPOSIT_CASH, user_name)
 | 
							net.deposit(self._difference, net.DEPOSIT_CASH, user_name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,43 +22,61 @@ class DepositCommand(Command):
 | 
				
			||||||
		return '%.2f Euro einzahlen' % self._difference
 | 
							return '%.2f Euro einzahlen' % self._difference
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class _ItemBasedCommand(Command):
 | 
					class BuyCommand(object):
 | 
				
			||||||
	def __init__(self, item):
 | 
						def __init__(self, item):
 | 
				
			||||||
		self._item = item
 | 
							self._item = item
 | 
				
			||||||
 | 
							self._commodity = True
 | 
				
			||||||
 | 
							self._deposit = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def item(self):
 | 
						def _what_to_buy(self):
 | 
				
			||||||
		return self._item
 | 
							if self._deposit and self._commodity:
 | 
				
			||||||
 | 
								return ITEM_AND_DEPOSIT
 | 
				
			||||||
 | 
							elif self._deposit:
 | 
				
			||||||
 | 
								return DEPOSIT_ONLY
 | 
				
			||||||
 | 
							elif self._commodity:
 | 
				
			||||||
 | 
								return ITEM_ONLY
 | 
				
			||||||
 | 
							else:
 | 
				
			||||||
 | 
								raise ValueError("BuyCommand in illegal state")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def difference(self):
 | 
				
			||||||
class BuyCommand(_ItemBasedCommand):
 | 
							if self._deposit and self._commodity:
 | 
				
			||||||
	def __init__(self, item):
 | 
								return -(self._item.price + self._item.deposit)
 | 
				
			||||||
		super(BuyCommand, self).__init__(item)
 | 
							elif self._deposit:
 | 
				
			||||||
		self._difference = -item.price
 | 
								return -(self._item.deposit)
 | 
				
			||||||
		self._to_go = False  ## TODO session state, instead?
 | 
							elif self._commodity:
 | 
				
			||||||
 | 
								return -(self._item.price)
 | 
				
			||||||
 | 
							else:
 | 
				
			||||||
 | 
								raise ValueError("BuyCommand in illegal state")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def run(self, user_name):
 | 
						def run(self, user_name):
 | 
				
			||||||
		net.buy_item(self._item.id, what_about_it=ITEM_ONLY, user_name=user_name)
 | 
							net.buy_item(self._item.id, what_about_it=self._what_to_buy(), user_name=user_name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def label(self):
 | 
						def item_name(self):
 | 
				
			||||||
		return self._item.name
 | 
							return self._item.name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def is_to_go(self):
 | 
						def commodity_label(self):
 | 
				
			||||||
		return self._to_go
 | 
							if self._deposit:
 | 
				
			||||||
 | 
								return self._item.name
 | 
				
			||||||
 | 
							else:
 | 
				
			||||||
 | 
								return "%s (exkl. Pfand)" % self._item.name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def set_to_go(self, to_go):
 | 
						def deposit_label(self):
 | 
				
			||||||
		self._to_go = to_go
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	def deposit(self):
 | 
					 | 
				
			||||||
		return self._item.deposit
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class ToGoCommand(_ItemBasedCommand):
 | 
					 | 
				
			||||||
	def __init__(self, item):
 | 
					 | 
				
			||||||
		super(ToGoCommand, self).__init__(item)
 | 
					 | 
				
			||||||
		self._difference = -item.deposit
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	def run(self, user_name):
 | 
					 | 
				
			||||||
		net.buy_item(self._item.id, what_about_it=DEPOSIT_ONLY, user_name=user_name)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	def label(self):
 | 
					 | 
				
			||||||
		return '%s Pfand' % self._item.name
 | 
							return '%s Pfand' % self._item.name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def includes_commodity(self):
 | 
				
			||||||
 | 
							return self._commodity
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def includes_deposit(self):
 | 
				
			||||||
 | 
							return self._deposit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def include_commodity(self, commodity):
 | 
				
			||||||
 | 
							self._commodity = commodity
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def include_deposit(self, deposit):
 | 
				
			||||||
 | 
							self._deposit = deposit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def commodity_value(self):
 | 
				
			||||||
 | 
							return self._item.price
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def deposit_value(self):
 | 
				
			||||||
 | 
							return self._item.deposit
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,4 @@
 | 
				
			||||||
 | 
					CFLAGS=-g -Wall 
 | 
				
			||||||
 | 
					ser:  ser.c
 | 
				
			||||||
 | 
						gcc -ggdb -Wall ser.c -o ser -lpthread
 | 
				
			||||||
 | 
						#mipsel-linux-uclibc-gcc -o ser.mips ser.c -lpthread
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,320 @@
 | 
				
			||||||
 | 
					#include <stdio.h>		/* Standard input/output definitions */
 | 
				
			||||||
 | 
					#include <string.h>		/* String function definitions */
 | 
				
			||||||
 | 
					#include <unistd.h>		/* UNIX standard function definitions */
 | 
				
			||||||
 | 
					#include <fcntl.h>		/* File control definitions */
 | 
				
			||||||
 | 
					#include <errno.h>		/* Error number definitions */
 | 
				
			||||||
 | 
					#include <termios.h>		/* POSIX terminal control definitions */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#include <sys/stat.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <pthread.h>		/* Posix 1003.1c threads */
 | 
				
			||||||
 | 
					#include <signal.h>
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int fd;
 | 
				
			||||||
 | 
					int screensaver;
 | 
				
			||||||
 | 
					int brightness = 4;
 | 
				
			||||||
 | 
					char *fifo;
 | 
				
			||||||
 | 
					pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
 | 
				
			||||||
 | 
					pthread_t thread1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int
 | 
				
			||||||
 | 
					initport (int fd)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  struct termios options;
 | 
				
			||||||
 | 
					  // Get the current options for the port...
 | 
				
			||||||
 | 
					  tcgetattr (fd, &options);
 | 
				
			||||||
 | 
					  // Set the baud rates to 9600...
 | 
				
			||||||
 | 
					  cfsetispeed (&options, B9600);
 | 
				
			||||||
 | 
					  cfsetospeed (&options, B9600);
 | 
				
			||||||
 | 
					  // Enable the receiver and set local mode...
 | 
				
			||||||
 | 
					  options.c_cflag |= (CLOCAL | CREAD);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  options.c_cflag &= ~PARENB;
 | 
				
			||||||
 | 
					  options.c_cflag &= ~CSTOPB;
 | 
				
			||||||
 | 
					  options.c_cflag &= ~CSIZE;
 | 
				
			||||||
 | 
					  options.c_cflag |= CS8;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Set the new options for the port...
 | 
				
			||||||
 | 
					  tcsetattr (fd, TCSANOW, &options);
 | 
				
			||||||
 | 
					  return 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char display_init[] = { 0x1b, 0x40 };
 | 
				
			||||||
 | 
					char display_showtime[] = { 0x1F, 0x54 };
 | 
				
			||||||
 | 
					char display_cursor_off[] = { 0x1f, 0x43, 0x0 };
 | 
				
			||||||
 | 
					char display_cursor_on[] = { 0x1f, 0x43, 0x1 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char display_on[] = { 0x1f, 0x45, 0x0 };
 | 
				
			||||||
 | 
					char display_off[] = { 0x1f, 0x45, 0xff };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char display_overwrite[] = { 0x1f, 0x01 };
 | 
				
			||||||
 | 
					char display_vscroll[] = { 0x1f, 0x02 };
 | 
				
			||||||
 | 
					char display_hscroll[] = { 0x1f, 0x03 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char display_clear_screen[] = { 0x0c };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char display_time[] = {0x1f,0x55};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define DWC(c)               display_write(c,sizeof(c))
 | 
				
			||||||
 | 
					#define SEND_TEXT(t)         display_write(t,strlen(t))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SEND_DISPLAY_INIT    DWC(display_init)
 | 
				
			||||||
 | 
					#define SEND_CURSOR_OFF      DWC(display_cursor_off)
 | 
				
			||||||
 | 
					#define SEND_CURSOR_ON       DWC(display_cursor_on)
 | 
				
			||||||
 | 
					#define SEND_DEFINE_TIMER    DWC(display_showtime)
 | 
				
			||||||
 | 
					#define SEND_SHOW_TIMER      DWC(display_time)
 | 
				
			||||||
 | 
					#define SEND_MODE_OVERWRITE  DWC(display_overwrite)
 | 
				
			||||||
 | 
					#define SEND_MODE_VSCROLL    DWC(display_vscroll)
 | 
				
			||||||
 | 
					#define SEND_MODE_HSCROLL    DWC(display_hscroll)
 | 
				
			||||||
 | 
					#define SEND_DISPLAY_OFF     DWC(display_off)
 | 
				
			||||||
 | 
					#define SEND_DISPLAY_ON      DWC(display_on)
 | 
				
			||||||
 | 
					#define SEND_CLEAR           DWC(display_clear_screen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define TIME_BASE  	     200000
 | 
				
			||||||
 | 
					#define TB_TO_SECS(x)        (x*1000000/TIME_BASE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define TIME_CLOCK	     TB_TO_SECS(5)
 | 
				
			||||||
 | 
					#define TIME_DIM 	     TB_TO_SECS(30)
 | 
				
			||||||
 | 
					#define TIME_OFF 	     TB_TO_SECS(120)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define DEVICE               "/dev/ttyUSB0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define PAUSEMSG             "Hallo, bitte melde Dich am Barcodereader an, um das Kassensystem zu benutzen *** Angebot: Die Mate heute nur 0.75 *** "
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					#define LINELEN 20
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					display_write (const void *buf, size_t count)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  pthread_mutex_lock (&mutex1);
 | 
				
			||||||
 | 
					  write (fd, buf, count);
 | 
				
			||||||
 | 
					  pthread_mutex_unlock (&mutex1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					display_putstring (char *s)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  screensaver = 0;
 | 
				
			||||||
 | 
					  SEND_TEXT(s);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					showtime (void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  SEND_CURSOR_OFF;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  char c[5] = { 0x1F, 0x54, 0x00, 0x00 };
 | 
				
			||||||
 | 
					  time_t timer;			// Define the timer
 | 
				
			||||||
 | 
					  struct tm *tblock;		// Define a structure for time block
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  timer = time (NULL);
 | 
				
			||||||
 | 
					  tblock = localtime (&timer);
 | 
				
			||||||
 | 
					  c[2] = tblock->tm_hour;
 | 
				
			||||||
 | 
					  c[3] = tblock->tm_min;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  display_write (&c, 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  SEND_MODE_HSCROLL;
 | 
				
			||||||
 | 
					  char *msg = "Freitagsrunde 4!";
 | 
				
			||||||
 | 
					  display_write (msg, strlen (msg));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					display_dim (short i)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  //     return;
 | 
				
			||||||
 | 
					  if (i == brightness)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      //printf ("display_dim: would not change brightness. abort.\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  if (i > 0 && i < 5)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      int l = 0;
 | 
				
			||||||
 | 
					      char *d;
 | 
				
			||||||
 | 
					      if (brightness == 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
						  SEND_CURSOR_OFF;
 | 
				
			||||||
 | 
						  // turn display on again
 | 
				
			||||||
 | 
						  SEND_DISPLAY_ON;
 | 
				
			||||||
 | 
					          SEND_MODE_OVERWRITE;
 | 
				
			||||||
 | 
						  char c[4] = { 0x1f, 0x58, 0x04, 0x00 };
 | 
				
			||||||
 | 
						  l = 6;
 | 
				
			||||||
 | 
						  //c[5]=i;
 | 
				
			||||||
 | 
						  d = c;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
						  //set brightness directly:
 | 
				
			||||||
 | 
						  char c[4] = { 0x1f, 0x58, 0x01, 0x00 };
 | 
				
			||||||
 | 
						  l = 3;
 | 
				
			||||||
 | 
						  c[2] = i;
 | 
				
			||||||
 | 
						  d = c;
 | 
				
			||||||
 | 
						  //printf ("command mode: %x \n", c[2]);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					      display_write (d, l);
 | 
				
			||||||
 | 
					      brightness = i;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  else if (i == 0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      //turn off
 | 
				
			||||||
 | 
					      SEND_DISPLAY_OFF;
 | 
				
			||||||
 | 
					      brightness = i;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void *
 | 
				
			||||||
 | 
					rthread (void *args)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int pipe;
 | 
				
			||||||
 | 
					  char pc = ' ';
 | 
				
			||||||
 | 
					  char c = ' ';
 | 
				
			||||||
 | 
					  while (1)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      pipe = open ("/tmp/display", O_RDONLY);
 | 
				
			||||||
 | 
					      int r;
 | 
				
			||||||
 | 
					      while ((r = read (pipe, &c, 1)) > 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						  screensaver = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						  if (pc == '\n')
 | 
				
			||||||
 | 
						    {
 | 
				
			||||||
 | 
						      display_write (&pc, 1);
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
						  if (c != '\n')
 | 
				
			||||||
 | 
						    {
 | 
				
			||||||
 | 
						      display_write (&c, 1);
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
						  pc = c;
 | 
				
			||||||
 | 
						  display_dim (4);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					      close (pipe);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					sighandler (int sig)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  pthread_kill (thread1, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  SEND_DISPLAY_INIT;
 | 
				
			||||||
 | 
					  SEND_MODE_OVERWRITE;
 | 
				
			||||||
 | 
					  SEND_CURSOR_OFF;
 | 
				
			||||||
 | 
					  SEND_DISPLAY_OFF;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  close (fd);
 | 
				
			||||||
 | 
					  if (fifo) {unlink(fifo);}
 | 
				
			||||||
 | 
					  exit (0);
 | 
				
			||||||
 | 
					  //signal(sig, sighandler);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int
 | 
				
			||||||
 | 
					main (int argc, char **argv)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  char *devnode ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  //TODO: arg parser!
 | 
				
			||||||
 | 
					  fifo=strdup("/tmp/display");  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (argc != 2)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      devnode=strdup(DEVICE);
 | 
				
			||||||
 | 
					      printf ("no device specified, using default %s\n",devnode);
 | 
				
			||||||
 | 
					    }else{
 | 
				
			||||||
 | 
					      devnode=strdup(argv[1]);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  fd = open (devnode, O_RDWR | O_NOCTTY | O_NDELAY);
 | 
				
			||||||
 | 
					  if (fd == -1)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      perror (devnode);
 | 
				
			||||||
 | 
					      return 1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      fcntl (fd, F_SETFL, 0);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  initport (fd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  //init display, set, vertical scroll, cursor off
 | 
				
			||||||
 | 
					  SEND_DISPLAY_INIT;
 | 
				
			||||||
 | 
					  SEND_MODE_OVERWRITE;
 | 
				
			||||||
 | 
					  SEND_CURSOR_OFF;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pthread_create (&thread1, NULL, rthread, NULL);
 | 
				
			||||||
 | 
					  signal (SIGINT, sighandler);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (mkfifo (fifo, S_IRWXU | S_IRWXG | S_IRWXO))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      perror (fifo);
 | 
				
			||||||
 | 
					      if (errno != EEXIST && errno != ESPIPE)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
						  return (1);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  //showtime();
 | 
				
			||||||
 | 
					  display_putstring ("Display initialized  ");
 | 
				
			||||||
 | 
					  display_putstring (fifo);
 | 
				
			||||||
 | 
					  sleep (3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  screensaver = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  while (1)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      usleep(TIME_BASE);
 | 
				
			||||||
 | 
					      //printf ("screensaver = %05d brightness: %d\n", screensaver, brightness);
 | 
				
			||||||
 | 
					      if (screensaver < 10000)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
						  screensaver++;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (screensaver == TIME_CLOCK)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
						  showtime ();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					      if (screensaver == TIME_OFF)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
						  display_dim (0);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      //show a scroll text while the screensaver is active...
 | 
				
			||||||
 | 
					      if ((screensaver > (TIME_CLOCK+10)) && (screensaver < TIME_OFF)){
 | 
				
			||||||
 | 
					        char *message = calloc(LINELEN+1,sizeof(char));
 | 
				
			||||||
 | 
					        strncpy(message,PAUSEMSG+((screensaver-TIME_CLOCK-1)%strlen(PAUSEMSG)),LINELEN);
 | 
				
			||||||
 | 
					        int l = strlen(message);
 | 
				
			||||||
 | 
					        if (l<LINELEN){
 | 
				
			||||||
 | 
					         message = strncat(message, PAUSEMSG , LINELEN-l);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        SEND_TEXT("\x0b");
 | 
				
			||||||
 | 
					        SEND_TEXT(message);
 | 
				
			||||||
 | 
					        free(message);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      //after some more seconds of inactivity dim display and finally turn off
 | 
				
			||||||
 | 
					      if ((screensaver > TIME_DIM) && (brightness > 1))
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
						  //printf ("dimming\n");
 | 
				
			||||||
 | 
						  display_dim (brightness - 1);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  //you'll never get here 
 | 
				
			||||||
 | 
					  close (fd);
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue