[Coco] Printing utility for linux users

Gene Heskett gene.heskett at verizon.net
Fri May 16 16:54:19 EDT 2008


On Friday 16 May 2008, John W. Linville wrote:

>On Fri, May 16, 2008 at 06:56:58AM -0400, Gene Heskett wrote:

>> Because many of us do not have decent printers that still understand ascii

>> from the coco's we all love, here is a couple of utils that can restore

>> your ability to make hard copy of your program listings and such. And no,

>> I didn't write very much of this, a fellow named Jon LaBadie on the

>> amanda-user list did 95% of it. He is a script genius.

>

>Hey, Gene! That's cool.

>

>A casual glance suggests that this works for ASCII text only.


Support for that would have to come from cups I believe. Text was my instant
need, so I scratched that 'itch' with Jon's help.

It, I find out when I start hammering on it, needs two more lines of code, so
the latest is below. It hasn't had a chance to cool for more than hour, but
works much more correctly now.


>Anyone put any thought to DMP or CGP (or Epson or whatever) emulation?

>

>John

--------------------
#!/bin/bash

#### Initialize Variables ####

SEP="<<<END>>>" # special line indicating the end of a transmitted file
SWriteCtl=0 ## Unused?

# output file name

CollectDir=/tmp/CoCo
BaseFN=CoCoFile
SeqNo=0 # start at zero, incremented before first opening

# input data source

DefDev=/dev/ttyUSB1 # if not given as argument 1 on cmd line
InDev=${1:-${DefDev}}
exec 0< ${InDev} # changes input for while read inp

# sub command

CoCoPrCmd=/usr/local/libexec/coco_print

# timed read constants, reduce till it breaks

MaxTime=5 # seconds
MaxRpts=2 # number of repeat timeouts

#### define functions ####

rename_output_file () {
# deal with currently open tmp file (if any)
if (( SeqNo > 0 ))
then
1>&- # close stdout (TmpOutFile)
mv ${TmpOutFile} ${OutFile}
# no reason the above should not work, but
# if it doesn't, restore your version below
# mv ${TmpOutFile} ${OutFile}
fi
}

next_output_file () {
# determine name of new tmp file
SeqNo=$(( SeqNo + 1))
OutFile=${CollectDir}/${BaseFN}-${SeqNo}
echo "OutFile="$OutFile >&2
TmpOutFile=${OutFile}.tmp
echo "TmpOutFile="$TmpOutFile >&2
# open/create new tmp file as stdout
exec 1> ${TmpOutFile}
StartedWriting=0 # false
TimeOuts=0
}

next_output_file

while : # infinite loop
do
# At start of each output file need to do a
# blocked read, subsequently a timed read
# Reads are from stdin, the $InDev above
if (( StartedWriting ))
then
echo "using timed read of "$MaxTime" seconds" >&2
IFS= read -t $MaxTime inp
else
echo using blocking read >&2
IFS= read inp
fi

ReadStatus=$?

# after the above read there are several situations possible
# 1) read exits 0 (successful)
# a) a line of file data was received
# b) the special file separator line was received
# 2) read exits 1 (non-zero, failed)
# a) partial line of file data received
# b) no file data received
# c) EOF meaning communications link was dropped
# (not handled in current code)

if (( ReadStatus == 0 ))
then # got a whole line
if [[ $inp == $SEP ]]
then
rename_output_file
${CoCoPrCmd} $OutFile &
next_output_file
else
printf "%s\n" "$inp"
StartedWriting=1
TimeOuts=0
# need to clear inp here too, else last line is doubled
inp=""
fi
continue
else # timeout of read cmd
if (( ${#inp} > 0 ))
then # received part line
printf "%s" "$inp" # no \n
StartedWriting=1
TimeOuts=0
# need to clear inp here, else last line repeats forever
inp=""
else # no data read in
TimeOuts=$(( TimeOuts + 1))
if (( TimeOuts == MaxRpts ))
then
echo "Timeout "$CoCoPrCmd $TmpOutFile >&2
rename_output_file
${CoCoPrCmd} $OutFile &
next_output_file
TimeOuts=0
fi
fi
continue
fi
done

------------------

--
Cheers, Gene
"There are four boxes to be used in defense of liberty:
soap, ballot, jury, and ammo. Please use in that order."
-Ed Howdershelt (Author)
I'm having a MID-WEEK CRISIS!



More information about the Coco mailing list