v13i026: Cassette label formatting program
Rich Salz
rsalz at bbn.com
Tue Feb 9 07:25:59 AEST 1988
Submitted-by: Tom Smith <analog!smith>
Posting-number: Volume 13, Issue 26
Archive-name: casette-lbl
This is a C program that reads files containing album title, artist, and
songlist, and outputs a PostScript description of a cassette label
suitable for framing or inserting into a standard-issue cassette case.
Documentation is provided in both manpage and README files, and a Makefile
is here as well.
Our site connection with hplabs gets wedged at times.
Thomas Smith {hplabs, ucbvax!sun!sunncal}!analog!smith
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
# cassette.c
# overhead_ps.c
# printlabels
# Makefile
export PATH; PATH=/bin:/usr/bin:$PATH
echo shar: "extracting 'cassette.c'" '(2403 characters)'
if test -f 'cassette.c'
then
echo shar: "will not over-write existing file 'cassette.c'"
else
sed 's/^X//' << \SHAR_EOF > 'cassette.c'
X/*
X * Copyright (C) 1987, Thomas H. Smith -- San Francisco, California
X * Program 'Cassette':
X * Permission is granted to any individual or institution
X * to use, copy, modify, or redistribute this software so long as it
X * is not sold for profit and provided this copyright notice is retained.
X *
X * PostScript is a registered trademark of Adobe Systems, Inc.
X */
X#include <stdio.h>
X#include "cassette.h"
X
Xmain(argc, argv)
Xint argc;
Xchar *argv[];
X{
X FILE *open_file();
X char *album1, *album2;
X int number_songs = FALSE;
X
X album1 = argv[1];
X album2 = argv[2];
X
X if (argc > 1) {
X if (strcmp(argv[1], "-n") == 0) {
X number_songs = TRUE;
X argc--;
X album1 = argv[2];
X album2 = argv[3];
X }
X }
X
X if ((argc != 3) && (argc != 2)) {
X (void) fprintf(stderr, "usage: %s [-n] <album1> [<album2>]\n",
X argv[0]);
X exit(1);
X }
X
X output_ps_globals();
X output_ps_outline();
X if (argc == 2) {
X file_to_postscript(open_file(album1), number_songs, ONLY);
X } else {
X file_to_postscript(open_file(album1), number_songs, SIDE1);
X file_to_postscript(open_file(album2), number_songs, SIDE2);
X }
X output_ps_trailer();
X}
X
X
XFILE *
Xopen_file(filename)
Xchar *filename;
X{
X FILE *fd, *fopen();
X
X fd = fopen(filename, "r");
X if (fd == NULL) {
X perror(filename);
X exit(1);
X }
X return(fd);
X}
X
X
Xfile_to_postscript(file, number_songs, position)
XFILE *file;
Xint number_songs, position;
X{
X char *title, *artist, *noise_red, **songs1, **songs2;
X int noise_type;
X extern char *input_title(), *input_artist(), *input_noise_reduction();
X extern char **input_songs();
X
X artist = input_artist(file);
X title = input_title(file);
X noise_red = input_noise_reduction(file, &noise_type);
X songs1 = input_songs(file);
X if (position == ONLY) /* look for two-record sets */
X songs2 = input_songs(file);
X
X output_ps_artist(title, artist, position);
X output_ps_title(title, artist, position);
X output_ps_noise_reduction(noise_red, noise_type, position);
X if ((position == ONLY) && (songs2[0] != NULL)) {
X output_ps_songs(songs1, number_songs, SIDE1);
X output_ps_songs(songs2, number_songs, SIDE2);
X } else {
X output_ps_songs(songs1, number_songs, position);
X }
X
X (void) free(artist);
X (void) free(title);
X (void) free(noise_red);
X free_song_list(songs1);
X if (position == ONLY)
X free_song_list(songs2);
X}
SHAR_EOF
if test 2403 -ne "`wc -c < 'cassette.c'`"
then
echo shar: "error transmitting 'cassette.c'" '(should have been 2403 characters)'
fi
fi
echo shar: "extracting 'overhead_ps.c'" '(6941 characters)'
if test -f 'overhead_ps.c'
then
echo shar: "will not over-write existing file 'overhead_ps.c'"
else
sed 's/^X//' << \SHAR_EOF > 'overhead_ps.c'
X/*
X * Copyright (C) 1987, Thomas H. Smith -- San Francisco, California
X * Program 'Cassette':
X * Permission is granted to any individual or institution
X * to use, copy, modify, or redistribute this software so long as it
X * is not sold for profit and provided this copyright notice is retained.
X *
X * PostScript is a registered trademark of Adobe Systems, Inc.
X * The name 'Dolby' and the Dolby symbol are trademarks
X * of Dolby Industries, Inc.
X */
X#include <stdio.h>
X#include "dimensions.h"
X#include "cassette.h"
X
X
Xoutput_ps_globals()
X{
X /* global definitions */
X OUTPUT("%%\tglobals\n");
X OUTPUT("/inches { 72 mul } def\n");
X OUTPUT("/currentx { currentpoint pop } def\n");
X OUTPUT("/currenty { currentpoint exch pop } def\n");
X OUTPUT("/lowerdone { false } def\n");
X OUTPUT("/doscalefont {\n dup dup /maxfontsize exch def\n");
X OUTPUT(" /fontsize exch def scalefont\n} def\n");
X OUTPUT("/adjustfont {\n dup /fontsize exch fontsize mul def\n");
X OUTPUT(" scalefont\n} def\n");
X OUTPUT("/interline { fontsize 1.33 mul } def\n");
X OUTPUT("/creturn { linestart currenty interline sub moveto } def\n");
X
X OUTPUT("/overflowsline {");
X OUTPUT(" stringwidth pop currentx add lineend ge } def\n");
X OUTPUT("/indent { %.3f inches 0 rmoveto } def\n", CONTINUEDIST);
X OUTPUT("/breakline {\n {\n ( ) search exch\n");
X OUTPUT(" dup overflowsline {\n creturn pageoverflow indent\n");
X OUTPUT(" } if show\n {\t%% test of search\n show\n");
X OUTPUT(" } { exit } ifelse\n } loop\n} def\n");
X
X OUTPUT("/shrinkshow {\n {\n dup overflowsline {\n");
X OUTPUT(" fontsize maxfontsize 2 div 1 add lt {\n");
X OUTPUT(" /oldindent /indent load def /indent { } def\n");
X OUTPUT(" 0 fontsize rmoveto breakline\n");
X OUTPUT(" /indent /oldindent load def\n");
X OUTPUT(" exit\n } {\n");
X OUTPUT(" currentfont .9 adjustfont setfont\n } ifelse\n");
X OUTPUT(" } {\n linestart currenty moveto\n");
X OUTPUT(" show exit\n } ifelse\n } loop\n} def\n");
X
X OUTPUT("/elipsesshow {\n dup overflowsline {\n");
X OUTPUT(" {\n ( ) search exch dup overflowsline {\n");
X OUTPUT(" (...) show pop { pop } if pop exit\n");
X OUTPUT(" } {\n show\n } ifelse\n");
X OUTPUT(" {\t%%test of search\n show\n");
X OUTPUT(" } { exit } ifelse\n } loop\n");
X OUTPUT(" } { show } ifelse\n} def\n");
X
X OUTPUT("/pageoverflow {\n currenty %.3f le lowerdone not and {\n",
X VSPACE + BORDERWIDTH);
X OUTPUT(" dolowerblock linestart -%.3f moveto\n } if\n} def\n",
X SONGSIZE + VSPACE + BORDERWIDTH);
X
X OUTPUT("/dosong {\n pageoverflow\n");
X OUTPUT(" dup overflowsline {\n breakline\n");
X OUTPUT(" } {\n show\n } ifelse\n creturn\n");
X OUTPUT("} def\n");
X
X /* extra lower outline if necessary */
X OUTPUT("%%\textra lower block outline\n");
X OUTPUT("/dolowerblock {\n");
X OUTPUT(" gsave newpath [] 0 setdash 0 0 moveto\n");
X OUTPUT(" 0 -%.3f inches lineto\n", BODYHEIGHT);
X OUTPUT(" %.3f inches -%.3f inches lineto\n", WIDTH, BODYHEIGHT);
X OUTPUT(" %.3f inches 0 lineto\n", WIDTH);
X
X OUTPUT(" %.3f setlinewidth stroke\n", BORDERWIDTH);
X OUTPUT(" 0 0 moveto %.3f inches 0 lineto\n", WIDTH);
X OUTPUT(" %.3f setlinewidth stroke\n", (BORDERWIDTH * 2));
X
X OUTPUT(" %.3f inches -%.3f inches %.3f add moveto\n", WIDTH / 2.0,
X BODYHEIGHT, VSPACE + BORDERWIDTH);
X OUTPUT(" %.3f inches -%.3f lineto\n", WIDTH / 2.0,
X VSPACE + (BORDERWIDTH / 2));
X OUTPUT(" [.3 1] 0 setdash %.3f setlinewidth stroke\n", DASHWIDTH);
X OUTPUT(" /lowerdone { true } def\n");
X OUTPUT(" grestore\n} def\n");
X
X output_ps_dolby();
X}
X
X
Xoutput_ps_outline()
X{
X OUTPUT("\n%%\toutline of label\n");
X
X /* body of label */
X OUTPUT("newpath\n");
X OUTPUT("0 0 moveto\n");
X OUTPUT("0 %.3f inches lineto\n", BODYHEIGHT + EDGEHEIGHT);
X OUTPUT("%.3f inches %.3f inches lineto\n",
X WIDTH, BODYHEIGHT + EDGEHEIGHT);
X OUTPUT("%.3f inches 0 lineto\n", WIDTH);
X OUTPUT("closepath %.3f setlinewidth stroke\n", BORDERWIDTH);
X
X /* edge of label */
X OUTPUT("newpath\n");
X OUTPUT("0 %.3f inches moveto\n", BODYHEIGHT);
X OUTPUT("%.3f inches %.3f inches lineto\n", WIDTH, BODYHEIGHT);
X OUTPUT("0 %.3f inches moveto\n", BODYHEIGHT + EDGEHEIGHT);
X OUTPUT("%.3f inches %.3f inches lineto\n",
X WIDTH, BODYHEIGHT + EDGEHEIGHT);
X OUTPUT("%.3f setlinewidth stroke\n", BORDERWIDTH * 2);
X
X /* overhang of label */
X OUTPUT("newpath\n");
X OUTPUT("0 %.3f inches moveto\n", BODYHEIGHT + EDGEHEIGHT);
X OUTPUT("0 %.3f inches rlineto %.3f inches 0 rlineto\n", TABSHORTHEIGHT,
X ((WIDTH - TABWIDTH) / 2.0) - TABDELTA);
X OUTPUT("%.3f inches %.3f inches rlineto\n", TABDELTA, TABDELTA);
X OUTPUT("%.3f inches 0 rlineto\n", TABWIDTH);
X OUTPUT("%.3f inches -%.3f inches rlineto\n", TABDELTA, TABDELTA);
X OUTPUT("%.3f inches %.3f inches lineto\n",
X WIDTH, BODYHEIGHT + EDGEHEIGHT + TABSHORTHEIGHT);
X OUTPUT("0 -%.3f inches rlineto\n", TABSHORTHEIGHT);
X OUTPUT("%.3f setlinewidth stroke\n", BORDERWIDTH);
X
X /* dashed interior lines */
X OUTPUT("\n%%\tdashed interior lines\n");
X
X OUTPUT("newpath\n");
X OUTPUT("0 %.3f inches %.3f sub moveto\n", BODYHEIGHT,
X TITLE2SIZE + (VSPACE * 2) + BORDERWIDTH);
X OUTPUT("%.3f inches %.3f inches %.3f sub lineto\n", WIDTH, BODYHEIGHT,
X TITLE2SIZE + (VSPACE * 2) + BORDERWIDTH);
X
X OUTPUT("%.3f inches %.3f inches %.3f sub moveto\n", WIDTH / 2.0,
X BODYHEIGHT, VSPACE + BORDERWIDTH);
X OUTPUT("%.3f inches %.3f lineto\n", WIDTH / 2.0,
X VSPACE + (BORDERWIDTH / 2));
X
X OUTPUT("[.3 1] 0 setdash %.3f setlinewidth stroke\n", DASHWIDTH);
X}
X
X
Xoutput_ps_trailer()
X{
X OUTPUT("showpage\n");
X}
X
X
Xstatic
Xoutput_ps_dolby()
X{
X OUTPUT("%%\t\tDolby trademark symbol\n");
X OUTPUT("%%\t\t\tThe name Dolby and this symbol\n");
X OUTPUT("%%\t\t\tare trademarks of Dolby Industries, Inc.\n");
X OUTPUT("/dolby {\n");
X OUTPUT(" gsave -%.3f 0 rmoveto currentpoint newpath\n", DOLBY_WIDTH);
X OUTPUT(" %.3f add %.3f -90 90 arc\n", DOLBY_RADIUS, DOLBY_RADIUS);
X OUTPUT(" currentx %.3f add currenty %.3f sub %.3f 90 -90 arc\n",
X DOLBY_WIDTH, DOLBY_RADIUS, DOLBY_RADIUS);
X OUTPUT(" -%.3f 0 rmoveto\n", DOLBY_WIDTH);
X OUTPUT(" 0 setgray currentpoint fill moveto\n");
X
X /* line around it */
X OUTPUT(" 0 %.3f rlineto %.3f 0 rlineto\n",
X DOLBY_HEIGHT, DOLBY_WIDTH);
X OUTPUT(" 0 -%.3f rlineto -%.3f 0 rlineto\n",
X DOLBY_HEIGHT, DOLBY_WIDTH);
X OUTPUT(" [] 0 setdash 0 setlinewidth currentpoint stroke moveto\n");
X
X /* line through center */
X OUTPUT(" %.3f 0 rmoveto 0 %.3f rlineto\n",
X DOLBY_WIDTH / 2.0, DOLBY_HEIGHT);
X OUTPUT(" 1 setgray stroke\n");
X OUTPUT(" grestore\n} def\n");
X}
SHAR_EOF
if test 6941 -ne "`wc -c < 'overhead_ps.c'`"
then
echo shar: "error transmitting 'overhead_ps.c'" '(should have been 6941 characters)'
fi
fi
echo shar: "extracting 'printlabels'" '(1418 characters)'
if test -f 'printlabels'
then
echo shar: "will not over-write existing file 'printlabels'"
else
sed 's/^X//' << \SHAR_EOF > 'printlabels'
X
X# Bourne shell file -- no leading comment!
X
X# page dimensions
XHPage="8.5 inches"
XVPage="11 inches"
XHMargin=".5 inches"
XVMargin=".5 inches"
X
X# cassette label dimensions
XBorder=1
XCWidth="4 inches $Border add"
XCHeight="3.5 inches $Border add"
X
X# division between adjacent labels
XDivision=1.5
X
XMiddleHPage="$HPage 2 div"
XMiddleVPage="$VPage 2 div"
X
Xif [ ! "$1" ]; then
X echo "usage: $0 [-a] [-m] file [file...]" 1>&2
X exit 1
Xfi
X
X# if printing adjacent labels
Xif [ "$1" = "-a" ]; then
X LeftEdge="$MiddleHPage $CHeight sub $Division sub"
X TopEdge="$MiddleVPage $CWidth add $Division add"
X shift
Xelse
X LeftEdge="$HMargin"
X TopEdge="$VPage $VMargin sub"
Xfi
X
X# if manually feeding paper
Xif [ "$1" = "-m" ]; then
X echo "statusdict begin /manualfeed true store end"
X ManualFeed=True
X shift
Xfi
X
Xecho "/inches { 72 mul } def"
X
Xwhile [ "$1" ] ; do
X for Position in 1 2 3 4 ; do
X if [ "$1" ]; then
X File=$1
X case $Position in
X 1)
X X=$MiddleHPage
X Y=$TopEdge
X ;;
X 2)
X X=$MiddleHPage
X Y=$MiddleVPage
X ;;
X 3)
X X=$LeftEdge
X Y=$TopEdge
X ;;
X 4)
X X=$LeftEdge
X Y=$MiddleVPage
X ;;
X esac
X echo gsave
X echo $X $Y translate
X echo 270 rotate
X sed /showpage/d $File
X echo grestore
X shift
X fi
X done
X echo showpage
Xdone
X
Xif [ "$ManualFeed" ]; then
X echo "statusdict begin /manualfeed false store end"
Xfi
SHAR_EOF
if test 1418 -ne "`wc -c < 'printlabels'`"
then
echo shar: "error transmitting 'printlabels'" '(should have been 1418 characters)'
fi
fi
echo shar: "extracting 'Makefile'" '(1042 characters)'
if test -f 'Makefile'
then
echo shar: "will not over-write existing file 'Makefile'"
else
sed 's/^X//' << \SHAR_EOF > 'Makefile'
XCFLAGS = -O
XLDFLAGS = -s
X
XCASSETTE = cassette
XPRINTLABELS = printlabels
XINSTALLDIR = /usr/new
XMANDIR = /usr/man/man1
XSHARFILE = cassette.shar
X
XCFILES = input_file.c cassette.c output_ps.c overhead_ps.c
XOFILES = input_file.o cassette.o output_ps.o overhead_ps.o
XHFILES = cassette.h dimensions.h
XMISCFILES = Makefile README cassette.1 \
X album1.sample album2.sample double.sample $(PRINTLABELS)
X
XINSTALLFILES = $(INSTALLDIR)/$(CASSETTE) \
X $(INSTALLDIR)/$(PRINTLABELS) \
X $(MANDIR)/cassette.1
X
X$(CASSETTE): $(OFILES)
X cc $(CFLAGS) $(LDFLAGS) -o $@ $(OFILES)
X
Xinstall: $(INSTALLFILES)
X
X$(INSTALLDIR)/$(CASSETTE): $(CASSETTE)
X install -m 755 $(CASSETTE) $@
X
X$(INSTALLDIR)/$(PRINTLABELS): $(PRINTLABELS)
X install -m 755 $(PRINTLABELS) $@
X
X$(MANDIR)/cassette.1: cassette.1
X install -m 644 cassette.1 $@
X
X$(SHARFILE): $(CFILES) $(HFILES) $(MISCFILES)
X shar $(CFILES) $(HFILES) $(MISCFILES) > $@
X
Xlint: $(CFILES)
X lint $(LINTFLAGS) $(CPPFLAGS) $(CFILES)
X
Xclean:
X /bin/rm -f $(OFILES) $(CASSETTE) $(SHARFILE) tags
X
Xtags: $(CFILES)
X ctags $(CFILES)
SHAR_EOF
if test 1042 -ne "`wc -c < 'Makefile'`"
then
echo shar: "error transmitting 'Makefile'" '(should have been 1042 characters)'
fi
fi
exit 0
# End of shell archive
exit 0
--
For comp.sources.unix stuff, mail to sources at uunet.uu.net.
More information about the Comp.sources.unix
mailing list