Path: utzoo!mnetor!uunet!rsalz From: rsalz@uunet.UU.NET (Rich Salz) Newsgroups: comp.sources.unix Subject: REPOST v13i026: Cassette label formatting program Message-ID: <6309@uunet.UU.NET> Date: 9 Feb 88 03:54:46 GMT Organization: UUNET Communications Services, Arlington, VA Lines: 1212 Approved: rsalz@uunet.UU.NET Submitted-by: Tom Smith Posting-number: Volume 13, Issue 26 Archive-name: casette-lbl [ Sigh; I thought NNTP was above these kind of things... :-) /r$ ] 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: # input_file.c # cassette.c # output_ps.c # overhead_ps.c # cassette.h # dimensions.h # Makefile # README # cassette.1 # album1.sample # album2.sample # double.sample export PATH; PATH=/bin:/usr/bin:$PATH echo shar: "extracting 'input_file.c'" '(3566 characters)' if test -f 'input_file.c' then echo shar: "will not over-write existing file 'input_file.c'" else sed 's/^X//' << \SHAR_EOF > 'input_file.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 X#include X#include "cassette.h" X Xstatic char buffer[BUFSIZ]; Xstatic char *bufferlist[BUFSIZ]; Xchar *create_string(), *strip_white(); X X Xchar * Xinput_title(fd) XFILE *fd; X{ X buffer[0] = '\0'; X (void) fgets(buffer, BUFSIZ, fd); X /* nuke trailing newline */ X buffer[strlen(buffer) - 1] = '\0'; X escape_parens(buffer); X return(create_string(strip_white(buffer))); X} X X Xchar * Xinput_artist(fd) XFILE *fd; X{ X buffer[0] = '\0'; X (void) fgets(buffer, BUFSIZ, fd); X /* nuke trailing newline */ X buffer[strlen(buffer) - 1] = '\0'; X escape_parens(buffer); X return(create_string(strip_white(buffer))); X} X X Xchar * Xinput_noise_reduction(fd, noise_type) XFILE *fd; Xint *noise_type; X{ X char *noise; X X buffer[0] = '\0'; X (void) fgets(buffer, BUFSIZ, fd); X /* nuke trailing newline */ X buffer[strlen(buffer) - 1] = '\0'; X escape_parens(buffer); X noise = create_string(strip_white(buffer)); X X /* see if this is a common noise reduction type */ X if (noise[0] == '\0') { X *noise_type = NONE; X } else if ((strncmp(noise, "dolby", 5) == 0) || X (strncmp(noise, "Dolby", 5) == 0)) { X if ((noise[strlen(noise)-1] == 'c') || (noise[strlen(noise)-1] == 'C')) X *noise_type = DOLBY_C; X else X *noise_type = DOLBY_B; X } else if ((strcmp(noise, "dbx") == 0) || (strcmp(noise, "DBX") == 0)) { X *noise_type = DBX; X } else { X *noise_type = OTHER; X } X X return(noise); X} X X Xchar ** Xinput_songs(fd) XFILE *fd; X{ X register int index; X char **returnlist; X extern char *malloc(); X X buffer[0] = '\0'; X for (index = 0; index < BUFSIZ; index++) { X if (fgets(buffer, BUFSIZ, fd) == NULL) X break; X /* nuke trailing newline */ X buffer[strlen(buffer) - 1] = '\0'; X if (EMPTYSTRING(buffer)) X break; X escape_parens(buffer); X bufferlist[index] = create_string(strip_white(buffer)); X } X X returnlist = (char **) malloc((unsigned) index * sizeof(char *) + 1); X bcopy((char *) bufferlist, (char *) returnlist, index * sizeof(char *)); X returnlist[index] = (char *) NULL; X return(returnlist); X} X X Xfree_song_list(songs) Xchar **songs; X{ X register int index; X X for (index = 0; songs[index] != NULL; index++) X (void) free(songs[index]); X free((char *) songs); X} X X Xstatic Xescape_parens(srcbuffer) Xchar *srcbuffer; X{ X register char *src, *dest; X char destbuffer[BUFSIZ]; X extern char *strcpy(); X X for (src = srcbuffer, dest = destbuffer; X (dest < &(destbuffer[BUFSIZ-1])) && (*src != '\0'); X src++, dest++) { X if ((*src == '(') || (*src == ')')) X *dest++ = '\\'; X *dest = *src; X } X *dest = '\0'; X (void) strcpy(srcbuffer, destbuffer); X} X X Xstatic char * Xstrip_white(string) Xchar *string; X{ X register char *begin, *end; X X for (begin = string; isspace(*begin) && (*begin != '\0'); begin++) ; X for (end = &(begin[strlen(string) - 1]); X isspace(*end) && (end != begin); end--) ; X if (end != begin) X *++end = '\0'; X X return(begin); X} X X Xstatic char * Xcreate_string(str) Xchar *str; X{ X char *newstring; X extern char *malloc(), *strcpy(); X X newstring = malloc((unsigned) strlen(str) + 1); X (void) strcpy(newstring, str); X return(newstring); X} SHAR_EOF if test 3566 -ne "`wc -c < 'input_file.c'`" then echo shar: "error transmitting 'input_file.c'" '(should have been 3566 characters)' fi fi echo shar: "extracting 'cassette.c'" '(2411 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 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] []", 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 2411 -ne "`wc -c < 'cassette.c'`" then echo shar: "error transmitting 'cassette.c'" '(should have been 2411 characters)' fi fi echo shar: "extracting 'output_ps.c'" '(5556 characters)' if test -f 'output_ps.c' then echo shar: "will not over-write existing file 'output_ps.c'" else sed 's/^X//' << \SHAR_EOF > 'output_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 */ X#include X#include "dimensions.h" X#include "cassette.h" X X Xoutput_ps_artist(title, artist, position) Xchar *title, *artist; Xint position; X{ X OUTPUT("\n%%\tArtist\n"); X if (EMPTYSTRING(title)) { X OUTPUT("%%\t\tNo artist specified\n"); X return; X } X X OUTPUT("/%s findfont %.3f doscalefont setfont\n", ARTISTFONT, ARTISTSIZE); X switch (position) { X case ONLY: X OUTPUT("/linestart {\n %.3f inches\n", WIDTH / 2.0); X OUTPUT(" (%s) stringwidth pop 2 div sub\n} def\n", artist); X OUTPUT("/lineend %.3f inches %.3f sub def\n", WIDTH, HSPACE); X break; X case SIDE1: X OUTPUT("/linestart %.3f def\n", HSPACE + (BORDERWIDTH / 2)); X OUTPUT("/lineend %.3f inches %.3f sub def\n", WIDTH / 2.0, HSPACE); X break; X case SIDE2: X OUTPUT("/linestart %.3f inches def\n", WIDTH / 2.0); X OUTPUT("/lineend %.3f inches %.3f sub def\n", WIDTH, HSPACE); X break; X } X X OUTPUT("linestart %.3f inches %.3f sub moveto\n", X BODYHEIGHT + EDGEHEIGHT, X ARTISTSIZE + VSPACE + X BORDERWIDTH - CHARFUDGE); X X OUTPUT("(%s) shrinkshow\n", artist); X} X X Xoutput_ps_title(title, artist, position) Xchar *title, *artist; Xint position; X{ X OUTPUT("\n%%\tTitle\n"); X OUTPUT("/%s findfont %.3f doscalefont setfont\n", TITLEFONT, TITLESIZE); X X if (EMPTYSTRING(title)) { X /* self-titled -- use artist for title */ X title = artist; X } X X switch (position) { X case ONLY: X OUTPUT("/linestart {\n %.3f inches\n", WIDTH / 2.0); X OUTPUT(" (%s) stringwidth pop 2 div sub\n} def\n", title); X OUTPUT("/lineend %.3f inches %.3f sub def\n", WIDTH, HSPACE); X break; X case SIDE1: X OUTPUT("/linestart %.3f def\n", HSPACE + (BORDERWIDTH / 2)); X OUTPUT("/lineend %.3f inches %.3f sub def\n", WIDTH / 2.0, HSPACE); X break; X case SIDE2: X OUTPUT("/linestart %.3f inches def\n", WIDTH / 2.0); X OUTPUT("/lineend %.3f inches %.3f sub def\n", WIDTH, HSPACE); X break; X } X X OUTPUT("linestart %.3f inches %.3f add moveto\n", BODYHEIGHT, X VSPACE + BORDERWIDTH + CHARFUDGE); X X if (title == artist) { X /* if self-titled, center title vertically */ X OUTPUT("0 %.3f inches %.3f sub rmoveto\n", EDGEHEIGHT / 2.0, X VSPACE + BORDERWIDTH + (TITLESIZE / 2.0)); X } X X OUTPUT("(%s) shrinkshow\n", title); X X /* secondary title */ X OUTPUT("\n%%\tSecondary Title\n"); X OUTPUT("/%s findfont %.3f doscalefont setfont\n", TITLE2FONT, TITLE2SIZE); X X switch (position) { X case ONLY: X case SIDE1: X OUTPUT("/linestart %.3f def\n", HSPACE + (BORDERWIDTH / 2)); X OUTPUT("/lineend %.3f inches %.3f sub def\n", X (WIDTH / 2.0) - .33, HSPACE); X break; X case SIDE2: X OUTPUT("/linestart %.3f inches %.3f add def\n", WIDTH / 2.0, X HSPACE + (DASHWIDTH / 2)); X OUTPUT("/lineend %.3f inches %.3f sub def\n", WIDTH - .33, HSPACE); X break; X } X X OUTPUT("linestart %.3f inches %.3f sub moveto\n", BODYHEIGHT, X TITLE2SIZE + VSPACE + BORDERWIDTH); X OUTPUT("(%s) elipsesshow\n", title); X} X X Xoutput_ps_noise_reduction(noise_red, noise_type, position) Xchar *noise_red; Xint noise_type, position; X{ X OUTPUT("\n%%\tNoise reduction symbol\n"); X if (noise_type == NONE) { X OUTPUT("%%\t(None specified)\n"); X return; X } X X OUTPUT("/%s findfont %.3f doscalefont setfont\n", X NOISEFONT, NOISESIZE); X if ((position == ONLY) || (position == SIDE1)) { X OUTPUT("%.3f inches %.3f sub %.3f inches %.3f sub moveto\n", X WIDTH / 2.0, X HSPACE + (DASHWIDTH / 2), BODYHEIGHT, X TITLE2SIZE + VSPACE + BORDERWIDTH); X } else /* SIDE2 */ { X OUTPUT("%.3f inches %.3f sub %.3f inches %.3f sub moveto\n", X WIDTH, X HSPACE + (BORDERWIDTH / 2), BODYHEIGHT, X TITLE2SIZE + VSPACE + BORDERWIDTH); X } X X switch (noise_type) { X case DOLBY_B: X OUTPUT("dolby\n"); X return; X case DOLBY_C: X OUTPUT("( C) stringwidth pop -1 mul 0 rmoveto dolby ( C) show\n"); X return; X /* case DBX: */ X } X X /* other type of noise reduction */ X OUTPUT("(%s) stringwidth pop -1 mul 0 rmoveto\n", noise_red); X OUTPUT("(%s) show\n", noise_red); X} X X Xoutput_ps_songs(songs, number_songs, position) Xchar **songs; Xint number_songs, position; X{ X register int index; X X OUTPUT("\n%%\tSong list\n"); X OUTPUT("/%s findfont %.3f doscalefont setfont\n", SONGFONT, SONGSIZE); X X if ((position == ONLY) || (position == SIDE1)) { X OUTPUT("/linestart %.3f def\n", HSPACE + (BORDERWIDTH / 2)); X OUTPUT("/lineend %.3f inches %.3f sub def\n", X WIDTH / 2.0, HSPACE + (DASHWIDTH / 2)); X } else /* SIDE2 */ { X OUTPUT("/linestart %.3f inches %.3f add def\n", X WIDTH / 2.0, HSPACE + (DASHWIDTH / 2)); X OUTPUT("/lineend %.3f inches %.3f sub def\n", X WIDTH, HSPACE + (BORDERWIDTH / 2)); X } X X /* starting position */ X OUTPUT("\nlinestart %.3f inches %.3f sub moveto\n", BODYHEIGHT, X TITLE2SIZE + SONGSIZE + (VSPACE * 3) X + BORDERWIDTH + DASHWIDTH); X X /* array of song titles */ X OUTPUT("[\n"); X for (index = 0; songs[index] != NULL; index++) { X if (number_songs) X OUTPUT(" (%d. %s)\n", index + 1, songs[index]); X else X OUTPUT(" (%s)\n", songs[index]); X } X OUTPUT("] { dosong } forall\n"); X} SHAR_EOF if test 5556 -ne "`wc -c < 'output_ps.c'`" then echo shar: "error transmitting 'output_ps.c'" '(should have been 5556 characters)' fi fi echo shar: "extracting 'overhead_ps.c'" '(6924 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 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(" currentfont .9 adjustfont setfont\n"); X OUTPUT(" fontsize maxfontsize 2 div 1 add le {\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 } if\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 6924 -ne "`wc -c < 'overhead_ps.c'`" then echo shar: "error transmitting 'overhead_ps.c'" '(should have been 6924 characters)' fi fi echo shar: "extracting 'cassette.h'" '(669 characters)' if test -f 'cassette.h' then echo shar: "will not over-write existing file 'cassette.h'" else sed 's/^X//' << \SHAR_EOF > 'cassette.h' 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 X#define TRUE (1) X#define FALSE (0) X X/* cassette sides */ X#define ONLY 0 X#define SIDE1 1 X#define SIDE2 2 X X/* recognized noise reduction types */ X#define NONE 0 X#define DOLBY_B 1 X#define DOLBY_C 2 X#define DBX 3 X#define OTHER 4 X X#define OUTPUT (void) printf X#define EMPTYSTRING(str) (str[0] == '\0') SHAR_EOF if test 669 -ne "`wc -c < 'cassette.h'`" then echo shar: "error transmitting 'cassette.h'" '(should have been 669 characters)' fi fi echo shar: "extracting 'dimensions.h'" '(1774 characters)' if test -f 'dimensions.h' then echo shar: "will not over-write existing file 'dimensions.h'" else sed 's/^X//' << \SHAR_EOF > 'dimensions.h' 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 X/* dimension tweaks dimensions in points */ X#define VSPACE 4.0 /* vertical whitespace border */ X#define HSPACE 6.0 /* horizontal whitespace border */ X#define BORDERWIDTH 2.0 /* width of outline border */ X#define DASHWIDTH 0.25 /* width of interior dashed lines */ X#define CHARFUDGE 1.0 /* fudge for vertically centering text */ X X/* dimensions of dolby symbol */ X#define DOLBY_HEIGHT 5.0 X#define DOLBY_WIDTH (DOLBY_HEIGHT+1.0) X#define DOLBY_RADIUS (DOLBY_HEIGHT / 2.0) X X/* font used for album title */ X#define TITLEFONT "Helvetica-Bold" X#define TITLESIZE 10.0 X X/* font used for secondary album title */ X#define TITLE2FONT "Times-Italic" X#define TITLE2SIZE 9.0 X X/* font used for album artist */ X#define ARTISTFONT "Helvetica" X#define ARTISTSIZE 10.0 X X/* font used for noise reduction */ X#define NOISEFONT "Helvetica" X#define NOISESIZE 5.0 X X/* font used for song list */ X#define SONGFONT "Times-Roman" X#define SONGSIZE 8.0 X X/* dimensions of cassette label in inches */ X#define EDGEHEIGHT 0.5 /* height of label edge */ X#define BODYHEIGHT 2.5 /* height of label body */ X#define WIDTH 4.0 /* width of entire label */ X X#define CONTINUEDIST 0.75 /* indent for long song name continuation */ X X/* width of overhang tab */ X#define TABWIDTH (WIDTH - (TABDELTA * 2.0)) X#define TABSHORTHEIGHT 0.25 /* height of short portion of overhang tab */ X#define TABDELTA 0.25 /* delta between short and tall tab portions */ SHAR_EOF if test 1774 -ne "`wc -c < 'dimensions.h'`" then echo shar: "error transmitting 'dimensions.h'" '(should have been 1774 characters)' fi fi echo shar: "extracting 'Makefile'" '(1028 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/loc 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 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 cp $(CASSETTE) $@ X chmod 755 $@ X X$(INSTALLDIR)/$(PRINTLABELS): $(PRINTLABELS) X cp $(PRINTLABELS) $@ X chmod 755 $@ X X$(MANDIR)/cassette.1: cassette.1 X cp cassette.1 $@ X chmod 644 $@ 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) X Xtags: $(CFILES) X ctags $(CFILES) SHAR_EOF if test 1028 -ne "`wc -c < 'Makefile'`" then echo shar: "error transmitting 'Makefile'" '(should have been 1028 characters)' fi fi echo shar: "extracting 'README'" '(3893 characters)' if test -f 'README' then echo shar: "will not over-write existing file 'README'" else sed 's/^X//' << \SHAR_EOF > 'README' XCassette label formatting programs: X Build these with X % make X and install with X % make install X X Dimensions, fonts, and other tweakable parameters are in dimensions.h. X This was developed under UNIX 4.2 but ought to port to System V and X other flavors easily. Possible porting considerations are: X bcopy() -- memcpy() (or something) in System V. X fgets() -- reads line up to AND INCLUDING newline. X perror() -- prints diagnostic error message for system calls. X X Happy listening! X XCassette: X Cassette takes as input files describing the title, artist, and songs X on the sides of a cassette tape, and sends a PostScript(TM) description X of a cassette label suitable for sending to a high-resolution printer X (such as a laserprinter) to the standard output. The resulting label X may be inserted into a standard-issue cassette tape case. X X The input file format is the following: X One file for each album (collection of artist, title, and songs). X The first line of each file is the artist, the second is the title, X the third is the noise reduction scheme used, and the songs are X listed one-per-line thereafter. X X An empty title line signifies a self-titled album. X An empty noise-reduction line indicates no noise reduction used. X An empty song line divides songs on the first side of the tape X from those on the second side (a la two-record set). X X Leading and trailing white space on any line is not significant. X X The cassette program copes with: X 1) Extra-long artist, title, and song names. X 2) Recognizing Dolby(TM) B and C (and outputting the Dolby symbol). X 3) Long song list -- outputs an extended label outline. X 4) Self-titled albums X 5) One side of a tape unused. X And much, much more. X X Syntax: X cassette [-n] [] X X The '-n' option triggers numbering of the songs. X XPrintlabels: X Printlabels is a simplistic bourne-shell script that takes the output X of cassette (above) and surrounds it with PostScript(TM) commands to X orient the output for more efficient printing on an 8 1/2 by 11 page. X The output of Printlabels is sent to the standard output. X Four non-extended labels or two extended ones can fit on a page, and X page-feeds are inserted every four labels automatically. X X Syntax: X printlabels [-a] [-m]