home *** CD-ROM | disk | FTP | other *** search
- Subject: v16i023: Public lineprinter spooler package, Part10/16
- Newsgroups: comp.sources.unix
- Sender: sources
- Approved: rsalz@uunet.UU.NET
-
- Submitted-by: papowell@julius.cs.umn.edu
- Posting-number: Volume 16, Issue 23
- Archive-name: plp/part10
-
- #! /bin/sh
- # This is a shell archive. Remove anything before this line, then unpack
- # it by saving it into a file and typing "sh file". To overwrite existing
- # files, type "sh file -c". You can also feed this as standard input via
- # unshar, or by typing "sh <file", e.g.. If this archive is complete, you
- # will see the following message at the end:
- # "End of archive 10 (of 16)."
- # Contents: src/chartable.c src/pac.c utilities/cpr/cpr.c
- PATH=/bin:/usr/bin:/usr/ucb ; export PATH
- if test -f 'src/chartable.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'src/chartable.c'\"
- else
- echo shar: Extracting \"'src/chartable.c'\" \(14924 characters\)
- sed "s/^X//" >'src/chartable.c' <<'END_OF_FILE'
- X/***************************************************************************
- X * U. Minnesota LPD Software * Copyright 1987, 1988, Patrick Powell
- X ***************************************************************************
- X * MODULE: chartable.c
- X * raster character representations
- X * Fixed width,
- X ***************************************************************************
- X * Revision History: Created deep in the bowels of history.
- X * $Log: chartable.c,v $
- X * Revision 3.1 88/06/18 09:33:53 papowell
- X * Version 3.0- Distributed Sat Jun 18 1988
- X *
- X * Revision 2.1 88/05/09 10:07:37 papowell
- X * PLP: Released Version
- X *
- X * Revision 1.1 88/03/01 11:08:14 papowell
- X * Initial revision
- X *
- X * Stolen by everybody.
- X * Fri Jan 15 13:53:37 CST 1988
- X ***************************************************************************/
- X#ifndef lint
- static char id_str1[] =
- X "$Header: chartable.c,v 3.1 88/06/18 09:33:53 papowell Exp $ PLP Copyright 1988 Patrick Powell";
- X#endif lint
- X
- X#define c_______ 0
- X#define c______1 01
- X#define c_____1_ 02
- X#define c____1__ 04
- X#define c____11_ 06
- X#define c___1___ 010
- X#define c___1__1 011
- X#define c___1_1_ 012
- X#define c___11__ 014
- X#define c__1____ 020
- X#define c__1__1_ 022
- X#define c__1_1__ 024
- X#define c__11___ 030
- X#define c__111__ 034
- X#define c__111_1 035
- X#define c__1111_ 036
- X#define c__11111 037
- X#define c_1_____ 040
- X#define c_1____1 041
- X#define c_1___1_ 042
- X#define c_1__1__ 044
- X#define c_1_1___ 050
- X#define c_1_1__1 051
- X#define c_1_1_1_ 052
- X#define c_11____ 060
- X#define c_11_11_ 066
- X#define c_111___ 070
- X#define c_111__1 071
- X#define c_111_1_ 072
- X#define c_1111__ 074
- X#define c_1111_1 075
- X#define c_11111_ 076
- X#define c_111111 077
- X#define c1______ 0100
- X#define c1_____1 0101
- X#define c1____1_ 0102
- X#define c1____11 0103
- X#define c1___1__ 0104
- X#define c1___1_1 0105
- X#define c1___11_ 0106
- X#define c1__1___ 0110
- X#define c1__1__1 0111
- X#define c1__11_1 0115
- X#define c1__1111 0117
- X#define c1_1____ 0120
- X#define c1_1___1 0121
- X#define c1_1_1_1 0125
- X#define c1_1_11_ 0126
- X#define c1_111__ 0134
- X#define c1_1111_ 0136
- X#define c11____1 0141
- X#define c11___1_ 0142
- X#define c11___11 0143
- X#define c11_1___ 0150
- X#define c11_1__1 0151
- X#define c111_11_ 0166
- X#define c1111___ 0170
- X#define c11111__ 0174
- X#define c111111_ 0176
- X#define c1111111 0177
- X
- char chartab[][HEIGHT] = /* this is relatively easy to modify */
- X /* just look: */
- X{
- X { c_______,
- X c_______,
- X c_______,
- X c_______,
- X c_______,
- X c_______,
- X c_______,
- X c_______,
- X c_______ }, /* */
- X
- X { c__11___,
- X c__11___,
- X c__11___,
- X c__11___,
- X c__11___,
- X c_______,
- X c_______,
- X c__11___,
- X c__11___ }, /* ! */
- X
- X { c_1__1__,
- X c_1__1__,
- X c_______,
- X c_______,
- X c_______,
- X c_______,
- X c_______,
- X c_______,
- X c_______ }, /* " */
- X
- X { c_______,
- X c__1_1__,
- X c__1_1__,
- X c1111111,
- X c__1_1__,
- X c1111111,
- X c__1_1__,
- X c__1_1__,
- X c_______ }, /* # */
- X
- X { c___1___,
- X c_11111_,
- X c1__1__1,
- X c1__1___,
- X c_11111_,
- X c___1__1,
- X c1__1__1,
- X c_11111_,
- X c___1___ }, /* $ */
- X
- X { c_1_____,
- X c1_1___1,
- X c_1___1_,
- X c____1__,
- X c___1___,
- X c__1____,
- X c_1___1_,
- X c1___1_1,
- X c_____1_ }, /* % */
- X
- X { c_11____,
- X c1__1___,
- X c1___1__,
- X c_1_1___,
- X c__1____,
- X c_1_1__1,
- X c1___11_,
- X c1___11_,
- X c_111__1 }, /* & */
- X
- X { c___11__,
- X c___11__,
- X c___1___,
- X c__1____,
- X c_______,
- X c_______,
- X c_______,
- X c_______,
- X c_______ }, /* ' */
- X
- X { c____1__,
- X c___1___,
- X c__1____,
- X c__1____,
- X c__1____,
- X c__1____,
- X c__1____,
- X c___1___,
- X c____1__ }, /* ( */
- X
- X { c__1____,
- X c___1___,
- X c____1__,
- X c____1__,
- X c____1__,
- X c____1__,
- X c____1__,
- X c___1___,
- X c__1____ }, /* ) */
- X
- X { c_______,
- X c___1___,
- X c1__1__1,
- X c_1_1_1_,
- X c__111__,
- X c_1_1_1_,
- X c1__1__1,
- X c___1___,
- X c_______ }, /* * */
- X
- X { c_______,
- X c___1___,
- X c___1___,
- X c___1___,
- X c1111111,
- X c___1___,
- X c___1___,
- X c___1___,
- X c_______ }, /* + */
- X
- X { c_______,
- X c_______,
- X c_______,
- X c_______,
- X c__11___,
- X c__11___,
- X c__1____,
- X c_1_____,
- X c_______ }, /* , */
- X
- X { c_______,
- X c_______,
- X c_______,
- X c_______,
- X c1111111,
- X c_______,
- X c_______,
- X c_______,
- X c_______ }, /* - */
- X
- X { c_______,
- X c_______,
- X c_______,
- X c_______,
- X c_______,
- X c_______,
- X c_______,
- X c__11___,
- X c__11___ }, /* . */
- X
- X { c_______,
- X c______1,
- X c_____1_,
- X c____1__,
- X c___1___,
- X c__1____,
- X c_1_____,
- X c1______,
- X c_______ }, /* / */
- X
- X { c_11111_,
- X c1_____1,
- X c1____11,
- X c1___1_1,
- X c1__1__1,
- X c1_1___1,
- X c11____1,
- X c1_____1,
- X c_11111_ }, /* 0 */
- X
- X { c___1___,
- X c__11___,
- X c_1_1___,
- X c___1___,
- X c___1___,
- X c___1___,
- X c___1___,
- X c___1___,
- X c_11111_ }, /* 1 */
- X
- X { c_11111_,
- X c1_____1,
- X c______1,
- X c_____1_,
- X c__111__,
- X c_1_____,
- X c1______,
- X c1______,
- X c1111111 }, /* 2 */
- X
- X { c_11111_,
- X c1_____1,
- X c______1,
- X c______1,
- X c__1111_,
- X c______1,
- X c______1,
- X c1_____1,
- X c_11111_ }, /* 3 */
- X
- X { c_____1_,
- X c____11_,
- X c___1_1_,
- X c__1__1_,
- X c_1___1_,
- X c1____1_,
- X c1111111,
- X c_____1_,
- X c_____1_ }, /* 4 */
- X
- X { c1111111,
- X c1______,
- X c1______,
- X c11111__,
- X c_____1_,
- X c______1,
- X c______1,
- X c1____1_,
- X c_1111__ }, /* 5 */
- X
- X { c__1111_,
- X c_1_____,
- X c1______,
- X c1______,
- X c1_1111_,
- X c11____1,
- X c1_____1,
- X c1_____1,
- X c_11111_ }, /* 6 */
- X
- X { c1111111,
- X c1_____1,
- X c_____1_,
- X c____1__,
- X c___1___,
- X c__1____,
- X c__1____,
- X c__1____,
- X c__1____ }, /* 7 */
- X
- X { c_11111_,
- X c1_____1,
- X c1_____1,
- X c1_____1,
- X c_11111_,
- X c1_____1,
- X c1_____1,
- X c1_____1,
- X c_11111_ }, /* 8 */
- X
- X { c_11111_,
- X c1_____1,
- X c1_____1,
- X c1_____1,
- X c_111111,
- X c______1,
- X c______1,
- X c1_____1,
- X c_1111__ }, /* 9 */
- X
- X { c_______,
- X c_______,
- X c_______,
- X c__11___,
- X c__11___,
- X c_______,
- X c_______,
- X c__11___,
- X c__11___ }, /* : */
- X
- X
- X { c__11___,
- X c__11___,
- X c_______,
- X c_______,
- X c__11___,
- X c__11___,
- X c__1____,
- X c_1_____,
- X c_______ }, /* ; */
- X
- X { c____1__,
- X c___1___,
- X c__1____,
- X c_1_____,
- X c1______,
- X c_1_____,
- X c__1____,
- X c___1___,
- X c____1__ }, /* < */
- X
- X { c_______,
- X c_______,
- X c_______,
- X c1111111,
- X c_______,
- X c1111111,
- X c_______,
- X c_______,
- X c_______ }, /* = */
- X
- X { c__1____,
- X c___1___,
- X c____1__,
- X c_____1_,
- X c______1,
- X c_____1_,
- X c____1__,
- X c___1___,
- X c__1____ }, /* > */
- X
- X { c__1111_,
- X c_1____1,
- X c_1____1,
- X c______1,
- X c____11_,
- X c___1___,
- X c___1___,
- X c_______,
- X c___1___ }, /* ? */
- X
- X { c__1111_,
- X c_1____1,
- X c1__11_1,
- X c1_1_1_1,
- X c1_1_1_1,
- X c1_1111_,
- X c1______,
- X c_1____1,
- X c__1111_ }, /* @ */
- X
- X { c__111__,
- X c_1___1_,
- X c1_____1,
- X c1_____1,
- X c1111111,
- X c1_____1,
- X c1_____1,
- X c1_____1,
- X c1_____1 }, /* A */
- X
- X { c111111_,
- X c_1____1,
- X c_1____1,
- X c_1____1,
- X c_11111_,
- X c_1____1,
- X c_1____1,
- X c_1____1,
- X c111111_ }, /* B */
- X
- X { c__1111_,
- X c_1____1,
- X c1______,
- X c1______,
- X c1______,
- X c1______,
- X c1______,
- X c_1____1,
- X c__1111_ }, /* C */
- X
- X { c11111__,
- X c_1___1_,
- X c_1____1,
- X c_1____1,
- X c_1____1,
- X c_1____1,
- X c_1____1,
- X c_1___1_,
- X c11111__ }, /* D */
- X
- X { c1111111,
- X c1______,
- X c1______,
- X c1______,
- X c111111_,
- X c1______,
- X c1______,
- X c1______,
- X c1111111 }, /* E */
- X
- X { c1111111,
- X c1______,
- X c1______,
- X c1______,
- X c111111_,
- X c1______,
- X c1______,
- X c1______,
- X c1______ }, /* F */
- X
- X { c__1111_,
- X c_1____1,
- X c1______,
- X c1______,
- X c1______,
- X c1__1111,
- X c1_____1,
- X c_1____1,
- X c__1111_ }, /* G */
- X
- X { c1_____1,
- X c1_____1,
- X c1_____1,
- X c1_____1,
- X c1111111,
- X c1_____1,
- X c1_____1,
- X c1_____1,
- X c1_____1 }, /* H */
- X
- X { c_11111_,
- X c___1___,
- X c___1___,
- X c___1___,
- X c___1___,
- X c___1___,
- X c___1___,
- X c___1___,
- X c_11111_ }, /* I */
- X
- X { c__11111,
- X c____1__,
- X c____1__,
- X c____1__,
- X c____1__,
- X c____1__,
- X c____1__,
- X c1___1__,
- X c_111___ }, /* J */
- X
- X { c1_____1,
- X c1____1_,
- X c1___1__,
- X c1__1___,
- X c1_1____,
- X c11_1___,
- X c1___1__,
- X c1____1_,
- X c1_____1 }, /* K */
- X
- X { c1______,
- X c1______,
- X c1______,
- X c1______,
- X c1______,
- X c1______,
- X c1______,
- X c1______,
- X c1111111 }, /* L */
- X
- X { c1_____1,
- X c11___11,
- X c1_1_1_1,
- X c1__1__1,
- X c1_____1,
- X c1_____1,
- X c1_____1,
- X c1_____1,
- X c1_____1 }, /* M */
- X
- X { c1_____1,
- X c11____1,
- X c1_1___1,
- X c1__1__1,
- X c1___1_1,
- X c1____11,
- X c1_____1,
- X c1_____1,
- X c1_____1 }, /* N */
- X
- X { c__111__,
- X c_1___1_,
- X c1_____1,
- X c1_____1,
- X c1_____1,
- X c1_____1,
- X c1_____1,
- X c_1___1_,
- X c__111__ }, /* O */
- X
- X { c111111_,
- X c1_____1,
- X c1_____1,
- X c1_____1,
- X c111111_,
- X c1______,
- X c1______,
- X c1______,
- X c1______ }, /* P */
- X
- X { c__111__,
- X c_1___1_,
- X c1_____1,
- X c1_____1,
- X c1_____1,
- X c1__1__1,
- X c1___1_1,
- X c_1___1_,
- X c__111_1 }, /* Q */
- X
- X { c111111_,
- X c1_____1,
- X c1_____1,
- X c1_____1,
- X c111111_,
- X c1__1___,
- X c1___1__,
- X c1____1_,
- X c1_____1 }, /* R */
- X
- X { c_11111_,
- X c1_____1,
- X c1______,
- X c1______,
- X c_11111_,
- X c______1,
- X c______1,
- X c1_____1,
- X c_11111_ }, /* S */
- X
- X { c1111111,
- X c___1___,
- X c___1___,
- X c___1___,
- X c___1___,
- X c___1___,
- X c___1___,
- X c___1___,
- X c___1___ }, /* T */
- X
- X { c1_____1,
- X c1_____1,
- X c1_____1,
- X c1_____1,
- X c1_____1,
- X c1_____1,
- X c1_____1,
- X c1_____1,
- X c_11111_ }, /* U */
- X
- X { c1_____1,
- X c1_____1,
- X c1_____1,
- X c_1___1_,
- X c_1___1_,
- X c__1_1__,
- X c__1_1__,
- X c___1___,
- X c___1___ }, /* V */
- X
- X { c1_____1,
- X c1_____1,
- X c1_____1,
- X c1_____1,
- X c1__1__1,
- X c1__1__1,
- X c1_1_1_1,
- X c11___11,
- X c1_____1 }, /* W */
- X
- X { c1_____1,
- X c1_____1,
- X c_1___1_,
- X c__1_1__,
- X c___1___,
- X c__1_1__,
- X c_1___1_,
- X c1_____1,
- X c1_____1 }, /* X */
- X
- X { c1_____1,
- X c1_____1,
- X c_1___1_,
- X c__1_1__,
- X c___1___,
- X c___1___,
- X c___1___,
- X c___1___,
- X c___1___ }, /* Y */
- X
- X { c1111111,
- X c______1,
- X c_____1_,
- X c____1__,
- X c___1___,
- X c__1____,
- X c_1_____,
- X c1______,
- X c1111111 }, /* Z */
- X
- X { c_1111__,
- X c_1_____,
- X c_1_____,
- X c_1_____,
- X c_1_____,
- X c_1_____,
- X c_1_____,
- X c_1_____,
- X c_1111__ }, /* [ */
- X
- X { c_______,
- X c1______,
- X c_1_____,
- X c__1____,
- X c___1___,
- X c____1__,
- X c_____1_,
- X c______1,
- X c_______ }, /* \ */
- X
- X { c__1111_,
- X c_____1_,
- X c_____1_,
- X c_____1_,
- X c_____1_,
- X c_____1_,
- X c_____1_,
- X c_____1_,
- X c__1111_ }, /* ] */
- X
- X { c___1___,
- X c__1_1__,
- X c_1___1_,
- X c1_____1,
- X c_______,
- X c_______,
- X c_______,
- X c_______ }, /* ^ */
- X
- X { c_______,
- X c_______,
- X c_______,
- X c_______,
- X c_______,
- X c_______,
- X c_______,
- X c1111111,
- X c_______ }, /* _ */
- X
- X { c__11___,
- X c__11___,
- X c___1___,
- X c____1__,
- X c_______,
- X c_______,
- X c_______,
- X c_______,
- X c_______ }, /* ` */
- X
- X { c_______,
- X c_______,
- X c_______,
- X c_1111__,
- X c_____1_,
- X c_11111_,
- X c1_____1,
- X c1____11,
- X c_1111_1 }, /* a */
- X
- X { c1______,
- X c1______,
- X c1______,
- X c1_111__,
- X c11___1_,
- X c1_____1,
- X c1_____1,
- X c11___1_,
- X c1_111__ }, /* b */
- X
- X { c_______,
- X c_______,
- X c_______,
- X c_1111__,
- X c1____1_,
- X c1______,
- X c1______,
- X c1____1_,
- X c_1111__ }, /* c */
- X
- X { c_____1_,
- X c_____1_,
- X c_____1_,
- X c_111_1_,
- X c1___11_,
- X c1____1_,
- X c1____1_,
- X c1___11_,
- X c_111_1_ }, /* d */
- X
- X { c_______,
- X c_______,
- X c_______,
- X c_1111__,
- X c1____1_,
- X c111111_,
- X c1______,
- X c1____1_,
- X c_1111__ }, /* e */
- X
- X { c___11__,
- X c__1__1_,
- X c__1____,
- X c__1____,
- X c11111__,
- X c__1____,
- X c__1____,
- X c__1____,
- X c__1____ }, /* f */
- X
- X { c_111_1_,
- X c1___11_,
- X c1____1_,
- X c1____1_,
- X c1___11_,
- X c_111_1_,
- X c_____1_,
- X c1____1_,
- X c_1111__ }, /* g */
- X
- X { c1______,
- X c1______,
- X c1______,
- X c1_111__,
- X c11___1_,
- X c1____1_,
- X c1____1_,
- X c1____1_,
- X c1____1_ }, /* h */
- X
- X { c_______,
- X c___1___,
- X c_______,
- X c__11___,
- X c___1___,
- X c___1___,
- X c___1___,
- X c___1___,
- X c__111__ }, /* i */
- X
- X { c____11_,
- X c_____1_,
- X c_____1_,
- X c_____1_,
- X c_____1_,
- X c_____1_,
- X c_____1_,
- X c_1___1_,
- X c__111__ }, /* j */
- X
- X { c1______,
- X c1______,
- X c1______,
- X c1___1__,
- X c1__1___,
- X c1_1____,
- X c11_1___,
- X c1___1__,
- X c1____1_ }, /* k */
- X
- X { c__11___,
- X c___1___,
- X c___1___,
- X c___1___,
- X c___1___,
- X c___1___,
- X c___1___,
- X c___1___,
- X c__111__ }, /* l */
- X
- X { c_______,
- X c_______,
- X c_______,
- X c1_1_11_,
- X c11_1__1,
- X c1__1__1,
- X c1__1__1,
- X c1__1__1,
- X c1__1__1 }, /* m */
- X
- X { c_______,
- X c_______,
- X c_______,
- X c1_111__,
- X c11___1_,
- X c1____1_,
- X c1____1_,
- X c1____1_,
- X c1____1_ }, /* n */
- X
- X { c_______,
- X c_______,
- X c_______,
- X c_1111__,
- X c1____1_,
- X c1____1_,
- X c1____1_,
- X c1____1_,
- X c_1111__ }, /* o */
- X
- X { c1_111__,
- X c11___1_,
- X c1____1_,
- X c1____1_,
- X c11___1_,
- X c1_111__,
- X c1______,
- X c1______,
- X c1______ }, /* p */
- X
- X { c_111_1_,
- X c1___11_,
- X c1____1_,
- X c1____1_,
- X c1___11_,
- X c_111_1_,
- X c_____1_,
- X c_____1_,
- X c_____1_ }, /* q */
- X
- X { c_______,
- X c_______,
- X c_______,
- X c1_111__,
- X c11___1_,
- X c1______,
- X c1______,
- X c1______,
- X c1______ }, /* r */
- X
- X { c_______,
- X c_______,
- X c_______,
- X c_1111__,
- X c1____1_,
- X c_11____,
- X c___11__,
- X c1____1_,
- X c_1111__ }, /* s */
- X
- X { c_______,
- X c__1____,
- X c__1____,
- X c11111__,
- X c__1____,
- X c__1____,
- X c__1____,
- X c__1__1_,
- X c___11__ }, /* t */
- X
- X { c_______,
- X c_______,
- X c_______,
- X c1____1_,
- X c1____1_,
- X c1____1_,
- X c1____1_,
- X c1___11_,
- X c_111_1_ }, /* u */
- X
- X { c_______,
- X c_______,
- X c_______,
- X c1_____1,
- X c1_____1,
- X c1_____1,
- X c_1___1_,
- X c__1_1__,
- X c___1___ }, /* v */
- X
- X { c_______,
- X c_______,
- X c_______,
- X c1_____1,
- X c1__1__1,
- X c1__1__1,
- X c1__1__1,
- X c1__1__1,
- X c_11_11_ }, /* w */
- X
- X { c_______,
- X c_______,
- X c_______,
- X c1____1_,
- X c_1__1__,
- X c__11___,
- X c__11___,
- X c_1__1__,
- X c1____1_ }, /* x */
- X
- X { c1____1_,
- X c1____1_,
- X c1____1_,
- X c1____1_,
- X c1___11_,
- X c_111_1_,
- X c_____1_,
- X c1____1_,
- X c_1111__ }, /* y */
- X
- X { c_______,
- X c_______,
- X c_______,
- X c111111_,
- X c____1__,
- X c___1___,
- X c__1____,
- X c_1_____,
- X c111111_ }, /* z */
- X
- X { c___11__,
- X c__1____,
- X c__1____,
- X c__1____,
- X c_1_____,
- X c__1____,
- X c__1____,
- X c__1____,
- X c___11__ }, /* } */
- X
- X { c___1___,
- X c___1___,
- X c___1___,
- X c___1___,
- X c___1___,
- X c___1___,
- X c___1___,
- X c___1___,
- X c___1___ }, /* | */
- X
- X { c__11___,
- X c____1__,
- X c____1__,
- X c____1__,
- X c_____1_,
- X c____1__,
- X c____1__,
- X c____1__,
- X c__11___ }, /* } */
- X
- X { c_11____,
- X c1__1__1,
- X c____11_,
- X c_______,
- X c_______,
- X c_______,
- X c_______,
- X c_______,
- X c_______ }, /* ~ */
- X
- X { c_1__1__,
- X c1__1__1,
- X c__1__1_,
- X c_1__1__,
- X c1__1__1,
- X c__1__1_,
- X c_1__1__,
- X c1__1__1,
- X c__1__1_ } /* rub-out */
- X};
- END_OF_FILE
- if test 14924 -ne `wc -c <'src/chartable.c'`; then
- echo shar: \"'src/chartable.c'\" unpacked with wrong size!
- fi
- # end of 'src/chartable.c'
- fi
- if test -f 'src/pac.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'src/pac.c'\"
- else
- echo shar: Extracting \"'src/pac.c'\" \(15473 characters\)
- sed "s/^X//" >'src/pac.c' <<'END_OF_FILE'
- X/***************************************************************************
- X * U. Minnesota LPD Software * Copyright 1987, 1988, Patrick Powell
- X ***************************************************************************
- X * MODULE: pac.c
- X * Accounting Summary
- X ***************************************************************************
- X * Revision History: Created Thu Feb 4 15:39:38 CST 1988
- X * $Log: pac.c,v $
- X * Revision 3.1 88/06/18 09:35:14 papowell
- X * Version 3.0- Distributed Sat Jun 18 1988
- X *
- X * Revision 2.2 88/05/14 10:20:47 papowell
- X * Modified -X flag handling
- X *
- X * Revision 2.1 88/05/09 10:09:39 papowell
- X * PLP: Released Version
- X *
- X * Revision 1.6 88/05/05 20:07:32 papowell
- X * Minor changes to shut up lint.
- X *
- X * Revision 1.5 88/04/15 13:06:00 papowell
- X * Std_environ() call added, to ensure that fd 0 (stdin), 1 (stdout), 2(stderr)
- X * have valid file descriptors; if not open, then /dev/null is used.
- X *
- X * Revision 1.4 88/04/07 09:11:50 papowell
- X * Removed redundant break; strangely, lint did not pick this up
- X *
- X * Revision 1.3 88/03/25 15:00:57 papowell
- X * Debugged Version:
- X * 1. Added the PLP control file first transfer
- X * 2. Checks for MX during file transfers
- X * 3. Found and fixed a mysterious bug involving the SYSLOG facilities;
- X * apparently they open files and then assume that they will stay
- X * open.
- X * 4. Made sure that stdin, stdout, stderr was available at all times.
- X *
- X * Revision 1.2 88/03/11 19:28:52 papowell
- X * Minor Changes, Updates
- X *
- X * Revision 1.1 88/03/01 11:08:58 papowell
- X * Initial revision
- X *
- X ***************************************************************************/
- X
- X#ifndef lint
- static char id_str1[] =
- X "$Header: pac.c,v 3.1 88/06/18 09:35:14 papowell Exp $ PLP Copyright 1988 Patrick Powell";
- X#endif lint
- X#include "lp.h"
- X/***************************************************************************
- X * pac - printer/ploter accounting information
- X * SYNOPSIS
- X * pac [ -Pprinter ] [ -pprice ] [ -a ] [ -e ] [ -s ]
- X * DESCRIPTION
- X * Pac reads the printer/plotter accounting files, accumulating
- X * the number of pages (the usual case) or feet (for raster
- X * devices) of paper consumed by each user, and printing out
- X * how much each user consumed in pages or feet and dollars.
- X * -Pprinter
- X * Selects the printer. If not specified, the value of
- X * the environment variable PRINTER is used, and if it is
- X * not defined, the default printer for the site.
- X * -pprice
- X * The price per page to be used, instead of the printcap
- X * co (cost) entry. If none is specified, the default
- X * price of $0.02 per page is used.
- X * -a Accounting is done for all printers. A cumulative sum-
- X * mary of usage of all the entries will be printed.
- X * -e Accounting is done for each printer entry in turn.
- X * -s Summarize the accounting information in the summary
- X * accounting file. Used with the -a or -e flag all the
- X * accounting information for each printer can be done at
- X * once. This option has the side effect of truncating
- X * the original file. It copies the original file to a
- X * backup before doing any action.
- X * The accounting file is specified in the printcap af entry.
- X * The summary accounting file has the .sum suffix added.
- X * FILES
- X * printcap af entry
- X * NOTES
- X * The accounting information is generated by the various
- X * filters used by the LPD daemon. For each user file they
- X * should write a line to the accounting file in the following
- X * format.
- X * user host printer pages format date
- X * papowell umn-cs 10 C April 13 1988
- X * The summary file will produce entries of the form:
- X * user host printer pages format runs cost
- X * papowell umn-cs 1320 17 32.00
- X ***************************************************************************/
- int All; /* do for all printers */
- int Each; /* do for each printer */
- int Summary; /* do a summary for each printer */
- int Xpert;
- int Page_price; /* cost per page to be used */
- float pagecost = 0.0; /* cost per page (or what ever) */
- X
- X/*
- X * Hash Table
- X * Each user has his own entry
- X */
- X
- X#define HASHSIZE 97 /* Number of hash buckets */
- X
- struct entry {
- X struct entry *next; /* Forward hash link */
- X char user[32]; /* user name */
- X char host[32]; /* host name */
- X char printer[32]; /* host name */
- X long pages; /* Feet or pages of paper */
- X char format[32]; /* format */
- X long runs; /* Number of runs */
- X float price; /* cost for this */
- X struct entry *chain; /* list link */
- X};
- X
- struct entry *Hash_table[HASHSIZE]; /* Hash table proper */
- struct entry *All_user, *Sum_user, *Raw_user;
- X
- X
- main( argc, argv )
- X int argc;
- X char **argv;
- X{
- X char **list;
- X
- X /*
- X * set umask to avoid problems with user umask
- X */
- X (void)umask(0);
- X /*
- X * Set fd 0, 1, 2 to /dev/null if not open
- X */
- X Std_environ();
- X# ifdef XPERIMENT
- X Setup_test();
- X# endif XPERIMENT
- X /*
- X * set up the pathnames for information files
- X */
- X Tailor_names();
- X
- X /*
- X * process the parameters
- X */
- X Get_parms(argc, argv);
- X
- X if( All | Each ){
- X for( list = All_printers(); *list; ++list ){
- X Printer = *list;
- X Process();
- X }
- X } else {
- X Process();
- X }
- X if( All ){
- X Sort_file( &All_user );
- X Dump_info(All_user, "All");
- X }
- X}
- X
- X/***************************************************************************
- X * Get_parms()
- X * get the parameters
- X ***************************************************************************/
- static char *optstr = "D:P:Xaep:s";
- Get_parms( argc, argv )
- X int argc;
- X char **argv;
- X{
- X int option;
- X
- X while( (option = Getopt(argc,argv,optstr)) != EOF ){
- X switch( option ){
- X case 'p':
- X Check_int_dup( option, &Page_price, Optarg );
- X break;
- X case 'D':
- X Check_int_dup( option, &Debug, Optarg );
- X break;
- X case 'P':
- X if( Printer ){
- X Check_str_dup( option, Printer, Optarg );
- X }
- X Printer = Optarg;
- X break;
- X case 'X':
- X Check_dup( option, &Xpert );
- X# ifdef DEBUG
- X Setup_test();
- X Tailor_names();
- X# else
- X Diemsg( "-X not allowed" );
- X# endif DEBUG
- X break;
- X case 'e':
- X Check_dup( option, &Each );
- X break;
- X case 'a':
- X Check_dup( option, &All );
- X break;
- X case 's':
- X Check_dup( option, &Summary );
- X break;
- X case '?':
- X break;
- X default:
- X fatal(XLOG_INFO, "Get_parms: badparm %c", option );
- X }
- X }
- X
- X /*
- X * set up the Parms[] array
- X */
- X for( ; Optind < argc; ++Optind ){
- X if( Parmcount < MAXPARMS ){
- X Parms[Parmcount].str = argv[Optind];
- X ++Parmcount;
- X } else {
- X Diemsg( "too many files to print; break job up" );
- X }
- X }
- X Get_Printer(0);
- X /*
- X * set default format
- X */
- X if( FROMHOST[0] == 0 ){
- X (void)strcpy(FROMHOST, Host);
- X }
- X if(Debug>4){
- X (void)fprintf( stdout, "Printer %s, All %s, Each %s, Summary %s",
- X Printer, All, Each, Summary );
- X }
- X}
- X
- X/***************************************************************************
- X * Check_int_dup( int option, int *value, char *arg )
- X * 1. check to see if value has been set
- X * 2. if not, then get integer value from arg
- X ***************************************************************************/
- X
- Check_int_dup( option, value, arg )
- X int option;
- X int *value;
- X char *arg;
- X{
- X if( *value ){
- X Diemsg( "duplicate option %c", option );
- X }
- X if( sscanf( arg, "%d", value ) != 1 || *value <= 0){
- X Diemsg( "option %c parameter (%s) is not positive integer",
- X option, arg);
- X }
- X}
- X/***************************************************************************
- X * Check_str_dup( int option, char *value, char *arg )
- X * 1. check to see if value has been set
- X * 2. if not, then set it
- X ***************************************************************************/
- Check_str_dup( option, value, arg )
- X int option;
- X char *value;
- X char *arg;
- X{
- X if( *value ){
- X Diemsg( "duplicate option %c", option );
- X }
- X if( strlen( arg ) > MAXPARMLEN ){
- X Diemsg( "option %c arguement too long (%s)", option, arg );
- X }
- X (void)strcpy(value, arg );
- X}
- X/***************************************************************************
- X * Check_dup( int option, int *value )
- X * 1. check to see if value has been set
- X * 2. if not, then set it
- X ***************************************************************************/
- Check_dup( option, value )
- X int option;
- X int *value;
- X{
- X if( *value ){
- X Diemsg( "duplicate option %c", option );
- X }
- X *value = 1;
- X}
- X
- X
- X/***************************************************************************
- X * Process
- X * Get the accounting file.
- X * 1. Read printcap entry.
- X * 2. Get the accounting file information
- X * 3. If we are to summarize, read the summyary
- X * 4. Combine the summary and other file information.
- X * 5. if we are to summarize, copy the information to the output summary file
- X * save the original file, and truncate it.
- X ***************************************************************************/
- Process()
- X{
- X char buf[BUFSIZ];
- X FILE *fp, *bp, *sp; /* Accounting and summary file */
- X
- X fp = bp = sp = 0;
- X if(Get_pc_entry(Printer, Status_pc_vars, Status_pc_len) == 0){
- X Warnmsg("Printer %s does not exist\n", Printer );
- X return;
- X }
- X if( SD == 0 || *SD == 0 ){
- X if(Debug>2)log(XLOG_DEBUG,"not a Printer");
- X return;
- X }
- X /* chdir to spool directory */
- X if (chdir(SD) < 0) {
- X logerr_die( XLOG_NOTICE,"cannot chdir to %s", SD);
- X }
- X if( AF == 0 || *AF == 0 ){
- X Warnmsg("Printer %s does not have accounting file", Printer );
- X return;
- X }
- X if( (fp = fopen( AF, "r+" )) == 0 ){
- X Warnmsg("Printer %s does not have accounting file", Printer );
- X return;
- X }
- X (void)strcpy(buf, AF );
- X (void)strcat(buf, ".bac" );
- X if( (bp = fopen( buf, "w" )) == NULL ){
- X logerr_die( XLOG_NOTICE,"cannot open backup file %s", buf);
- X }
- X if( Summary ){
- X (void)strcpy(buf, AF );
- X (void)strcat(buf, ".sum" );
- X if( (sp = fopen( buf, "r+" )) == NULL ){
- X logerr_die( XLOG_NOTICE,"cannot open summary file %s", buf);
- X }
- X }
- X Get_raw_file(fp,bp);
- X if( Summary ){
- X Get_summary(sp);
- X Merge_raw_sum();
- X Sort_file( &Sum_user );
- X Update_sum(sp);
- X if( Each ){
- X Dump_info( Sum_user, Printer );
- X }
- X } else if( !All ){
- X Dump_info( Raw_user, Printer );
- X }
- X if( All ){
- X Merge_raw_all();
- X }
- X if( Sum_user ){
- X Free_entry( Sum_user );
- X Sum_user = 0;
- X }
- X Free_entry( Raw_user );
- X Raw_user = 0;
- X if( sp ){
- X (void)fclose(sp);
- X }
- X if( bp ){
- X (void)fclose(bp);
- X }
- X if( fp ){
- X (void)fclose(fp);
- X }
- X}
- X
- cleanup()
- X{
- X exit(1);
- X}
- X/*
- X * Get_raw_file()
- X * read and copy the raw accounting file into the backup,
- X * set up the Raw information
- X */
- X
- Get_raw_file(f, b)
- X FILE *f, *b;
- X{
- X char buf[BUFSIZ];
- X char user[BUFSIZ];
- X char host[BUFSIZ];
- X char printer[BUFSIZ];
- X char format[BUFSIZ];
- X int pages;
- X int i;
- X struct entry *p, *Add_entry();
- X Raw_user = 0;
- X
- X Clean_hash();
- X
- X while( fgets(buf, sizeof(buf), f ) ){
- X (void)fputs(buf, b);
- X /* break out the fields */
- X i = sscanf(buf,"%s %s %s %d %s\n",user,host,printer,&pages,format);
- X if( i < 4 || strlen(user) > 32 || strlen(host)>32
- X || pages < 0 || strlen(format)>32){
- X Warnmsg( "bad format of accounting information: %s\n", buf );
- X }
- X p = Add_entry( &Raw_user, user, host, printer, format );
- X p->pages += pages;
- X p->runs += 1;
- X }
- X}
- X/*
- X * Get_summary()
- X * read and copy the raw accounting file into the backup,
- X * set up the Raw information
- X */
- X
- Get_summary(f)
- X FILE *f;
- X{
- X char buf[BUFSIZ];
- X char user[BUFSIZ];
- X char host[BUFSIZ];
- X char printer[BUFSIZ];
- X char format[BUFSIZ];
- X int pages;
- X int jobs;
- X int i;
- X struct entry *p, *Add_entry();
- X
- X Sum_user = 0;
- X
- X Clean_hash();
- X
- X while( fgets(buf, sizeof(buf), f ) ){
- X /* break out the fields */
- X i = sscanf(buf,"%s %s %s %d %s %d\n",
- X user,host,printer,&pages,format,&jobs);
- X if( i < 4 || strlen(user) > 32 || strlen(host)>32
- X || pages < 0 || strlen(format)>32){
- X Warnmsg( "bad format of accounting information: %s\n", buf );
- X }
- X p = Add_entry( &Sum_user, user, host, printer, format );
- X p->pages += pages;
- X p->runs += jobs;
- X }
- X}
- X
- Clean_hash()
- X{
- X int i;
- X for(i = 0; i < HASHSIZE; ++i ){
- X Hash_table[i] = 0;
- X }
- X}
- X
- int
- Hash( s )
- X char *s;
- X{
- X int i;
- X
- X i = s[1]*3 + s[0] + s[strlen(s) -1 ]*7;
- X return( i % HASHSIZE );
- X}
- X
- struct entry *
- XFind_entry( user, host, printer, format )
- X char *user, *host, *printer, *format;
- X{
- X struct entry *p;
- X int i;
- X
- X i = Hash( user );
- X
- X p = Hash_table[i];
- X
- X while( p ){
- X if( strcmp(user, p->user ) == 0
- X && strcmp(host, p->host ) == 0
- X && strcmp(printer, p->printer ) == 0
- X && strcmp(format, p->format ) == 0 ){
- X return(p);
- X }
- X p = p->next;
- X }
- X return( p );
- X}
- X
- static struct entry *entry_list;
- X#define NENTRY 25
- X
- struct entry *
- Make_entry( list, user, host, printer, format )
- X struct entry **list;
- X char *user, *host, *printer, *format;
- X{
- X struct entry *p;
- X static struct entry blank; /* all zeros */
- X int i;
- X
- X if( entry_list == 0 ){
- X p = entry_list =
- X (struct entry *)malloc( sizeof(struct entry) * NENTRY );
- X for( i = 0; i < (NENTRY - 1); ++i ){
- X p[i].next = &p[i+1];
- X }
- X p[i].next = 0;
- X }
- X p = entry_list;
- X entry_list = p->next;
- X
- X *p = blank;
- X p->next = 0;
- X p->chain = 0;
- X
- X i = Hash( user );
- X p->next = Hash_table[i];
- X Hash_table[i] = p;
- X (void)strcpy( p->user, user );
- X (void)strcpy( p->host, host );
- X (void)strcpy( p->printer, printer );
- X (void)strcpy( p->format, format );
- X p->chain = *list;
- X *list = p;
- X return( p );
- X}
- X
- XFree_entry( p )
- X struct entry *p;
- X{
- X struct entry *q;
- X while( p ){
- X q = p->chain;
- X p->next = entry_list;
- X entry_list = p;
- X p = q;
- X }
- X}
- X
- struct entry *
- Add_entry( list, user, host, printer, format )
- X struct entry **list;
- X char *user, *host, *printer;
- X char *format;
- X{
- X struct entry *p;
- X p = Find_entry( user, host, printer, format );
- X if( p == 0 ){
- X p = Make_entry( list, user, host, printer, format );
- X }
- X return( p );
- X}
- X
- Merge_raw_sum()
- X{
- X Merge_raw(&Sum_user);
- X}
- Merge_raw_all()
- X{
- X Merge_raw(&All_user);
- X}
- Merge_raw(s)
- X struct entry **s;
- X{
- X struct entry *p, *q;
- X
- X /*
- X * assume that you have just read in the summary file
- X */
- X p = *s;
- X while( p ){
- X q = Make_entry( s, p->user, p->host, p->printer, p->format);
- X q->runs += p->runs;
- X q->pages += p->pages;
- X p = p->chain;
- X }
- X}
- X
- Update_sum( fp )
- X FILE *fp;
- X{
- X struct entry *p;
- X
- X /*
- X * next, truncate the file
- X */
- X if( ftruncate( fileno(fp), 0 ) < 0 ){
- X logerr_die( XLOG_INFO, "cannot truncate summary file" );
- X }
- X for( p = Sum_user; p; p = p->chain ){
- X (void)fprintf( fp, "%s %s %s %d %s %d\n", p->user, p->host, p->printer,
- X p->pages, p->format, p->runs );
- X }
- X}
- X
- cmpx( l, r )
- X struct entry **l, **r;
- X{
- X int c;
- X struct entry *sl, *sr;
- X sl = *l;
- X sr = *r;
- X if( (c = strcmp( sl->user, sr->user )) == 0
- X && (c = strcmp( sl->host, sr->host )) == 0 ){
- X c = strcmp( sl->printer, sr->printer );
- X }
- X return( c );
- X}
- Sort_file(st)
- X struct entry **st;
- X{
- X int i, n;
- X struct entry *p, **q;
- X
- X /* count the number of entries */
- X
- X for( i = 0, p = *st; p; p = p->chain, ++i );
- X n = i;
- X if( n > 0 ){
- X q = (struct entry **)malloc( (unsigned)n*sizeof(struct entry *));
- X if( q == 0 ){
- X logerr_die( XLOG_INFO, "malloc failed" );
- X }
- X for( i = 0, p = *st; i < n; p = p->chain, ++i ){
- X q[i] = p;
- X }
- X qsort( (char *)q, i, sizeof(struct entry *), cmpx );
- X for( i = 0; i < n-1; ++i ){
- X q[i]->chain = q[i+1];
- X }
- X q[i]->chain = 0;
- X }
- X
- X}
- X
- Dump_info( p, header )
- X struct entry *p;
- X char *header;
- X{
- X (void)fprintf( stdout, "%s\n", header );
- X for( ; p; p = p->chain ){
- X (void)fprintf( stdout, "%s %s %s %d %s %d\n", p->user, p->host, p->printer,
- X p->pages, p->format, p->runs );
- X }
- X}
- END_OF_FILE
- if test 15473 -ne `wc -c <'src/pac.c'`; then
- echo shar: \"'src/pac.c'\" unpacked with wrong size!
- fi
- # end of 'src/pac.c'
- fi
- if test -f 'utilities/cpr/cpr.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'utilities/cpr/cpr.c'\"
- else
- echo shar: Extracting \"'utilities/cpr/cpr.c'\" \(14860 characters\)
- sed "s/^X//" >'utilities/cpr/cpr.c' <<'END_OF_FILE'
- X/*
- X * This program prints the files named in its argument list, preceding
- X * the output with a table of contents. Each file is assumed to be C
- X * source code (but doesn't have to be) in that the program searches
- X * for the beginning and end of functions. Function names are added to
- X * the table of contents, provided the name starts at the beginning of
- X * a line. The function name in the output is double striken.
- X *
- X * By default blank space is inserted after every closing '}'
- X * character. Thus functions and structure declarations are nicely
- X * isolated in the output. The only drawback to this is that structure
- X * initialization tables sometimes produce lots of white space.
- X * The "-r" option removes this space, or changes it to the indicated
- X * length.
- X *
- X * The option "-l" indicates that the following argument is to be
- X * the page length used for output (changing the page length hasn't been
- X * tested much).
- X *
- X * The option "-s" indicates that the table of contents should be sorted
- X * by function name within each file.
- X *
- X * The option "-n" indicates that output lines should be numbered with
- X * the corresponding line number from the input file.
- X *
- X * The option "-p" indicates what proportion of the page in steps of 16
- X * should be used for deciding if a new function needs a new page.
- X * That is -p12 (the default) indicates that if a function starts
- X * within the top 12/16 (3/4) of the page then do it, otherwise put it
- X * on a new page. Thus the higher the number (upto 16) the closer to
- X * the bottom of the page will functions be started. -p0 says put each
- X * func on a new page.
- X *
- X * Try it! You'll like it. (I call it cpr.c)
- X *
- X * Written by:
- X * Paul Breslin
- X * Human Computing Resources Corp.
- X * 10 St. Mary St.
- X * Toronto, Ontario
- X * Canada, M4Y 1P9
- X *
- X * -- ...!decvax!utcsrgv!hcr!phb
- X *
- X * Sorting and standard input reading from:
- X * Rick Wise, CALCULON Corp., Rockville, MD.
- X * -- ...!decvax!harpo!seismo!rlgvax!cvl!umcp-cs!cal-unix!wise
- X *
- X * File modified time,
- X * numbered output,
- X * optional white space,
- X * improved function start tests from:
- X * David Wasley, U.C.Berkeley
- X * -- ...!ucbvax!topaz.dlw
- X * Modified the -r to leave variable amounts of space
- X * Patrick Powell, U. Waterloo
- X *
- X * Changed handling of form feeds to start a new page AND print heading:
- X * Terry Doner, U of Waterloo
- X *
- X * Fixed up to locate more functions, and added -p option
- X * Dennis Vadura, U of Waterloo
- X *
- X * It will find things like struct foo *f()...
- X * but not things like int
- X * f
- X * ()...
- X * ie. the constraint is that the () must appear on the same line
- X * as the function name.
- X *
- X * Clean up a bit for 80286 machines (lints a bit cleaner, too)
- X * Dan Frank, Prairie Computing
- X */
- X#include <sys/types.h>
- X#include <sys/stat.h>
- X#include <stdio.h>
- X#include <ctype.h>
- X#include <signal.h>
- X#include <string.h>
- extern int errno; /* system error number */
- extern char *sys_errlist[]; /* error message */
- extern char *malloc() ; /* important for 8086-like systems */
- X
- X#define BP 0xC /* Form feed */
- X
- X#define TOC_SIZE 4096
- X
- X#define NEWFILE 1
- X#define NEWFUNCTION 2
- X
- XFILE *File;
- X
- int Braces; /* Keeps track of brace depth */
- int LineNumber; /* Count output lines */
- int PageNumber = 0; /* You figure this one out */
- int PageLength = 66; /* -l <len> Normal paper length */
- int PagePart = 12; /* Decision on paging for new fn*/
- int PageEnd; /* Accounts for space at bottom */
- int SawFunction;
- int InComment;
- int InString;
- X
- long FileLineNumber; /* Input file line number */
- X
- char *ProgName;
- char Today[30];
- char *Name; /* Current file name */
- X
- char FunctionName[80];
- char FileDate[24]; /* Last modified time of file */
- X
- char SortFlag; /* -s == sort table of contents */
- char NumberFlag; /* -n == output line numbers */
- int Space_to_leave = 5; /* -r<number> space to leave */
- int TabWidth = 0; /* -t <number> width of tabs */
- X
- main(argc, argv)
- char **argv;
- X {
- X register int i;
- X char *ctime();
- X time_t thetime, time();
- X char *parm;
- X int c;
- X
- X ProgName = argv[0];
- X thetime = time((time_t *)0);
- X strcpy(Today,ctime(&thetime));
- X
- X for( i=1; argc > i; ++i )
- X {
- X if( argv[i][0] != '-'
- X || argv[i][1] == '\0' ) break;
- X
- X parm = argv[i];
- X while( c = *++parm ) switch( c ){
- X case 't':
- X if( argc < 3 ) Usage();
- X TabWidth = atoi(argv[++i]);
- X if( TabWidth < 0 )
- X TabWidth = 0;
- X break;
- X
- X case 'l':
- X if( argc < 3 ) Usage();
- X PageLength = atoi(argv[++i]);
- X break;
- X
- X case 's':
- X ++SortFlag;
- X break;
- X
- X case 'n':
- X ++NumberFlag;
- X break;
- X
- X case 'r':
- X if( (c = parm[1]) && isdigit( c )
- X &&( c = atoi( parm+1 )) > 0 ){
- X Space_to_leave = c;
- X } else {
- X Space_to_leave = 0;
- X }
- X while( *parm ){
- X ++parm;
- X }
- X --parm;
- X break;
- X
- X case 'p':
- X if( (c = parm[1]) && isdigit( c )
- X &&( c = atoi( parm+1 )) >= 0 ){
- X PagePart = (c <= 16) ? c: 16;
- X }
- X while( *parm ){
- X ++parm;
- X }
- X --parm;
- X break;
- X
- X default:
- X Usage();
- X break;
- X }
- X }
- X PageEnd = PageLength - ((PageLength > 30) ? 2 : 1);
- X
- X StartTempFile();
- X
- X if( i == argc )
- X { /* no file names */
- X File = stdin;
- X Name = "Standard Input";
- X List();
- X }
- X
- X for(; i < argc; ++i )
- X {
- X if( strcmp(argv[i], "-") == 0 )
- X {
- X File = stdin;
- X Name = "Standard Input";
- X }
- X else
- X {
- X if( (File = fopen( Name = argv[i], "r" )) == NULL )
- X {
- X fprintf(stderr,"%s: Can't open file '%s': %s\n",
- X ProgName, Name, sys_errlist[errno] );
- X continue;
- X }
- X }
- X List();
- X if( File != stdin ) fclose(File);
- X }
- X
- X if( PageNumber > 1 || LineNumber > 0 )
- X putchar(BP);
- X EndTempFile();
- X
- X DumpTableOfContents();
- X DumpTempFiles();
- X Done();
- X }
- X
- Usage()
- X {
- X fprintf(stderr, "Usage: %s [-n] [-t tabwidth] [-p[num]] [-r[num]] [-s] [-l pagelength] [files] [-]\n",
- X ProgName);
- X exit(1);
- X }
- X
- int SaveOut;
- char *TempName;
- char *Temp2Name;
- X
- StartTempFile()
- X {
- X int Done();
- X extern char *mktemp();
- X
- X CatchSignalsPlease(Done);
- X
- X SaveOut = dup(1);
- X TempName = mktemp("/tmp/cprXXXXXX");
- X if( freopen(TempName, "w", stdout) == NULL )
- X {
- X fprintf(stderr, "%s: Can't open temp file '%s': %s\n", ProgName,
- X TempName, sys_errlist[errno]);
- X exit(1);
- X }
- X }
- X
- XEndTempFile()
- X {
- X Temp2Name = mktemp("/tmp/CPRXXXXXX");
- X if( freopen(Temp2Name, "w", stdout) == NULL )
- X {
- X fprintf(stderr, "%s: Can't open temp file '%s': %s\n", ProgName,
- X Temp2Name, sys_errlist[errno]);
- X exit(1);
- X }
- X }
- X
- DumpTempFiles()
- X {
- X register int pid, w;
- X
- X fclose(stdout);
- X dup(SaveOut);
- X
- X while( (pid = fork()) < 0 ) sleep(1);
- X if( pid )
- X while ((w = wait((int *)0)) != pid && w != -1);
- X else
- X {
- X CatchSignalsPlease(SIG_DFL);
- X
- X execl( "/bin/cat", "cat", Temp2Name, TempName, (char *)0 );
- X fprintf(stderr, "%s: exec of /bin/cat failed: %s\n", ProgName,
- X sys_errlist[errno]);
- X exit(0);
- X }
- X }
- X
- Done()
- X {
- X CatchSignalsPlease(SIG_IGN);
- X
- X if( TempName ) unlink( TempName );
- X if( Temp2Name ) unlink( Temp2Name );
- X
- X exit(0);
- X }
- X
- CatchSignalsPlease(action)
- int (*action)();
- X {
- X if( signal(SIGINT, SIG_IGN) != SIG_IGN ) signal(SIGINT, action);
- X if( signal(SIGQUIT, SIG_IGN) != SIG_IGN ) signal(SIGQUIT, action);
- X if( signal(SIGHUP, SIG_IGN) != SIG_IGN ) signal(SIGHUP, action);
- X }
- X
- List()
- X {
- X register int bp;
- X register char *bufp;
- X char buffer[256];
- X
- X NewFile();
- X bp = Braces = 0;
- X InString = InComment = 0; /* reset for new file -DV */
- X SawFunction = 0;
- X bufp = buffer;
- X while( fgets(bufp, sizeof(buffer), File) != NULL )
- X {
- X ++FileLineNumber;
- X if( bp ) NewFunction();
- X
- X if( ++LineNumber >= PageEnd ) NewPage();
- X
- X if( bufp[0] == '\f'
- X && bufp[1] == '\n'
- X && bufp[2] == '\0' ) NewPage(); /* was strcpy(bufp, "^L\n");*/
- X
- X if( NumberFlag )
- X {
- X if( *bufp == '\n' )
- X printf(" ");
- X else
- X printf("%6ld ", FileLineNumber);
- X }
- X if( (Braces == 0) && LooksLikeFunction(bufp) )
- X AddToTableOfContents(NEWFUNCTION);
- X
- X bp = PutLine(buffer);
- X }
- X }
- X
- PutLine(l)
- register char *l;
- X {
- X extern char *EndComment();
- X extern char *EndString();
- X register char c;
- X int bp;
- X char *save;
- X
- X bp = 0;
- X for( save = l; c = *l; ++l )
- X if( InComment )
- X l = EndComment(l);
- X else if( InString )
- X l = EndString(l);
- X else
- X switch(c)
- X {
- X case '{':
- X ++Braces;
- X break;
- X
- X case '}':
- X if( --Braces == 0 )
- X bp = 1;
- X break;
- X
- X case '\'':
- X for( ++l; *l && *l != '\''; ++l )
- X if( *l == '\\' && *(l+1) ) ++l;
- X break;
- X
- X case '"':
- X InString = 1;
- X break;
- X
- X case '/':
- X if( *(l+1) == '*' )
- X {
- X InComment = 1;
- X ++l;
- X }
- X break;
- X }
- X printf("%s", save);
- X return(bp);
- X }
- X
- char *
- XEndComment(p)
- register char *p;
- X {
- X register char c;
- X
- X /*
- X * Always return pointer to last non-null char looked at.
- X */
- X while( c = *p++ )
- X if( c == '*' && *p == '/' )
- X {
- X InComment = 0;
- X return(p);
- X }
- X return(p-2);
- X }
- X
- char *
- XEndString(p)
- register char *p;
- X {
- X register char c;
- X
- X /*
- X * Always return pointer to last non-null char looked at.
- X */
- X while( c = *p++ )
- X if( c == '\\' && *p )
- X {
- X ++p;
- X continue;
- X }
- X else if( c == '"' )
- X {
- X InString = 0;
- X return(p-1);
- X }
- X return(p-2);
- X }
- X
- NewFunction()
- X {
- X register int i;
- X
- X if( Space_to_leave <= 0 || !SawFunction ) return;
- X if( LineNumber + Space_to_leave > (PageLength * PagePart / 16) )
- X NewPage();
- X else
- X {
- X for( i=0; i < (Space_to_leave); ++i ) putchar('\n');
- X LineNumber += Space_to_leave;
- X }
- X
- X SawFunction = 0;
- X }
- X
- X#define HEADER_SIZE 3
- X
- NewPage()
- X {
- X if( PageNumber >= 0 ) ++PageNumber;
- X putchar(BP);
- X LineNumber = 0;
- X
- X PutHeader();
- X }
- X
- PutHeader()
- X {
- X register int i, l, j;
- X
- X putchar('\n');
- X ++LineNumber;
- X l = strlen(Name);
- X for( j=0; j < l; ++j )
- X printf("%c\b%c\b%c", Name[j], Name[j], Name[j]);
- X
- X if( PageNumber > 0 )
- X {
- X printf(" %.17s", FileDate);
- X GoToColumn(l+19, 70);
- X printf("Page:%4d\n\n", PageNumber);
- X ++LineNumber;
- X ++LineNumber;
- X }
- X else
- X {
- X GoToColumn(l, 55);
- X printf("%s\n\n", Today);
- X ++LineNumber;
- X ++LineNumber;
- X }
- X }
- X
- GoToColumn(from, to)
- register int from, to;
- X {
- X if( from < to)
- X {
- X if( TabWidth > 0 ){
- X from &= ~(TabWidth-1);
- X for( ; (from + TabWidth) <= to; from += TabWidth )
- X putchar('\t');
- X }
- X for( ; from < to; from++ )
- X putchar(' ');
- X }
- X }
- X
- X#define isidchr(c) (isalnum(c) || (c == '_'))
- X
- X/* This used to incorrectly identify a declaration such as
- X * int (*name[])() = { initializers ... }
- X * as a function. It also picked up this in an assembler file:
- X * #define MACRO(x) stuff
- X * MACRO(x):
- X * Fixed both of these. -IAN!
- X */
- LooksLikeFunction(s)
- register char *s;
- X {
- X register char *p;
- X register int i;
- X char *save;
- X
- X if( InComment || InString ) return(0);
- X
- X save = s;
- X
- X i = 0;
- X do
- X {
- X p = FunctionName;
- X
- X while( *s && (*s == ' ') || (*s == '\t') ) ++s;
- X if( *s == '*' ) ++s;
- X if( !*s || ((*s != '_') && !isalpha(*s)) ) return(0);
- X
- X while( isidchr(*s) )
- X *p++ = *s++;
- X *p = '\0';
- X
- X while( *s && (*s == ' ') || (*s == '\t') ) ++s;
- X i++;
- X }
- X while ( *s && *s != '(' && i < 4 );
- X
- X if( *s != '(' || *(s+1) == '*' ) return(0);
- X
- X for (i = 0; *s; s++)
- X {
- X switch( *s )
- X {
- X case '(':
- X ++i;
- X continue;
- X
- X case ')':
- X --i;
- X break;
- X
- X default:
- X break;
- X }
- X if( i == 0 ) break;
- X }
- X if( !*s ) return(0);
- X
- X while( *s )
- X {
- X if( *s == '{') break;
- X if( *s == ';' || *s == ':' ) return(0);
- X ++s;
- X }
- X
- X /*
- X * This will cause the function name part of the line to
- X * be double striken. Note that this assumes the name and the opening
- X * parentheses are on the same line...
- X */
- X
- X if( p = strchr( save, '(' ) )
- X {
- X p--;
- X while( p != save && isidchr( *(p-1) ) ) p--;
- X for( i=0; save != p; save++, i++ ) putchar(' ');
- X for( ; *p != '('; p++, i++ ) putchar( *p );
- X }
- X else
- X for( i=0; *save && (*save == '*' || isidchr(*save)); ++i, ++save)
- X if( *save == '*' )
- X putchar(' ');
- X else
- X putchar(*save);
- X
- X while( i --> 0 ) putchar('\b');
- X
- X SawFunction = 1;
- X return(1);
- X }
- X
- static char *Toc[TOC_SIZE];
- static int TocPages[TOC_SIZE];
- static int TocCount;
- X
- AddToTableOfContents(type)
- X {
- X if( TocCount > TOC_SIZE )
- X return;
- X if( TocCount == TOC_SIZE )
- X {
- X fprintf(stderr, "%s: More than %d Table of contents entries; others ignored.\n",
- X ProgName, TOC_SIZE);
- X ++TocCount;
- X return;
- X }
- X
- X if( type == NEWFILE )
- X AddFile();
- X else
- X AddFunction();
- X }
- X
- AddFunction()
- X {
- X register int l;
- X register char *p;
- X
- X /* This heuristic stops multiple occurrences of a function,
- X * selected by #ifdefs, to all end up many times over in the
- X * Table of Contents. One only needs to see it once. -IAN!
- X */
- X if( TocCount > 0 && TocPages[TocCount-1] == PageNumber
- X && strcmp(Toc[TocCount-1],FunctionName) == 0 )
- X return;
- X l = strlen(FunctionName);
- X p = Toc[TocCount] = (char *)malloc(l+1);
- X strcpy(p, FunctionName);
- X TocPages[TocCount] = PageNumber;
- X ++TocCount;
- X }
- X
- AddFile()
- X {
- X register int i, l;
- X register int len;
- X char temp[20];
- X
- X len = strlen(Name) + 20;
- X len = (len < 130) ? 130 : len;
- X Toc[TocCount] = (char *)malloc(len);
- X sprintf(Toc[TocCount], "\n File: %s ", Name);
- X l = strlen(Toc[TocCount]);
- X if( l < 64 )
- X {
- X if( TabWidth > 0 ){
- X i = ((64 - l) / TabWidth) + 1;
- X while( i-- > 0 )
- X Toc[TocCount][l++] = '\t';
- X }
- X else{
- X while( l < 64 )
- X Toc[TocCount][l++] = ' ';
- X }
- X Toc[TocCount][l++] = '\0';
- X }
- X sprintf(temp, " Page %4d\n", PageNumber);
- X strcat(Toc[TocCount], temp);
- X ++TocCount;
- X }
- X
- NewFile()
- X {
- X GetFileTime();
- X NewPage();
- X AddToTableOfContents(NEWFILE);
- X FileLineNumber = 0;
- X }
- X
- GetFileTime()
- X {
- X struct stat st;
- X
- X if( File == stdin )
- X strncpy(FileDate, &Today[4], 20);
- X else
- X {
- X fstat(fileno(File), &st);
- X strncpy(FileDate, ctime(&st.st_mtime) + 4, 20);
- X }
- X strncpy(&FileDate[12], &FileDate[15], 5);
- X FileDate[18] = '\0';
- X }
- X
- DumpTableOfContents()
- X {
- X register int i, j;
- X int index[TOC_SIZE];
- X
- X if( TocCount == 0 ) return;
- X
- X for (i = 0; i < TocCount; i++) index[i] = i;
- X if( SortFlag )
- X SortTable(index);
- X
- X Name = "Table of Contents";
- X
- X PageNumber = -1;
- X LineNumber = 0;
- X NewPage();
- X
- X for( i=0; i < TocCount; ++i )
- X {
- X if( Toc[index[i]][0] == '\n' )
- X {
- X if( (LineNumber + 5) >= PageEnd ) NewPage();
- X
- X printf("%s", Toc[index[i]]);
- X LineNumber += 2;
- X continue;
- X }
- X if( ++LineNumber >= PageEnd ) NewPage();
- X
- X printf(" %s ", Toc[index[i]]);
- X for( j=strlen(Toc[index[i]]); j < 48; ++j ) putchar('.');
- X printf(" %4d\n", TocPages[index[i]]);
- X }
- X }
- X
- SortTable(index)
- register int *index;
- X {
- X register int i, temp, flag;
- X
- X do {
- X flag = 0;
- X for (i = 0; i < TocCount - 1; i++)
- X {
- X if( Toc[index[i]][0] == '\n' || Toc[index[i+1]][0] == '\n' )
- X continue; /* don't sort across file names */
- X if( strcmp(Toc[index[i]], Toc[index[i+1]]) > 0)
- X {
- X temp = index[i];
- X index[i] = index[i+1];
- X index[i+1] = temp;
- X flag = 1;
- X }
- X }
- X } while( flag );
- X }
- X
- X
- END_OF_FILE
- if test 14860 -ne `wc -c <'utilities/cpr/cpr.c'`; then
- echo shar: \"'utilities/cpr/cpr.c'\" unpacked with wrong size!
- fi
- # end of 'utilities/cpr/cpr.c'
- fi
- echo shar: End of archive 10 \(of 16\).
- cp /dev/null ark10isdone
- MISSING=""
- for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ; do
- if test ! -f ark${I}isdone ; then
- MISSING="${MISSING} ${I}"
- fi
- done
- if test "${MISSING}" = "" ; then
- echo You have unpacked all 16 archives.
- rm -f ark[1-9]isdone ark[1-9][0-9]isdone
- else
- echo You still need to unpack the following archives:
- echo " " ${MISSING}
- fi
- ## End of shell archive.
- exit 0
-
-