From moore.WBST@Xerox.ARPA Tue Sep 10 15:14:08 1985 Received: from ucbkim.ARPA by ucbdali.ARPA (5.5/4.48) id AA10859; Tue, 10 Sep 85 15:13:58 PDT Received: from UCB-VAX.ARPA (ucbvax.ARPA) by ucbkim.ARPA (5.5/5.3) id AA00229; Tue, 10 Sep 85 14:28:49 PDT Received: from Xerox.ARPA (xerox.arpa.ARPA) by UCB-VAX.ARPA (4.24/5.3) id AA01317; Tue, 10 Sep 85 14:23:25 pdt Received: from Aurora.ms by ArpaGateway.ms ; 10 SEP 85 14:25:54 PDT Date: 10 Sep 85 17:25:44 EDT (Tuesday) From: moore.WBST@Xerox.ARPA Subject: counting pages in a press file To: sklower@BERKELEY Cc: parmelee@CU-ARPA.CS.CORNELL.EDU Message-Id: <850910-142554-4998@Xerox> Status: R Hi, Here is the hack on iptotext that will count the pages and write them to an accounting file. I have tried it with both troff generated interpress files and Star generated ones. I don't really understand the Berkeley spooling system (even after glancing at the manual) so I don't know if this is what you really want. What it DOES however, is to take an ip master on the standard input and count the number of pages it has. This information is written to the accounting file which might be named on the command line. What it doesn't do is copy the IP master to the standard output or send the file to a printer. I hope that this isn't a necessary function... lee #!/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 the files: # Makefile # getopt.c # ipf.c # This archive created: Tue Sep 10 17:12:41 1985 export PATH; PATH=/bin:$PATH if test -f 'Makefile' then echo shar: over-writing existing file "'Makefile'" fi cat << \SHAR_EOF > 'Makefile' # # Copyright (c) 1984, 1985 Xerox Corp. # DESTINCLUDE=/usr/new/include DESTBIN=../../../bin ipf: ipf.o getopt.o cc -o ipf ipf.o getopt.o ipf.o: $(DESTINCLUDE)/iptokens.h $(DESTINCLUDE)/ipnames.h cc -c -I$(DESTINCLUDE) ipf.c lint: lint -I$(DESTINCLUDE) ipf.c getopt.c clean: rm -f ipf *.o install: $(DESTBIN)/ipf $(DESTBIN)/ipf: ipf install -c -s ipf $(DESTBIN) SHAR_EOF if test -f 'getopt.c' then echo shar: over-writing existing file "'getopt.c'" fi cat << \SHAR_EOF > 'getopt.c' /* * getopt - get option letter from argv * This software is in the public domain * Originally written by Henry Spenser at the U. of Toronto */ #include <stdio.h> char *optarg; /* Global argument pointer. */ int optind = 0; /* Global argv index. */ static char *scan = NULL; /* Private scan pointer. */ extern char *index(); int getopt(argc, argv, optstring) int argc; char *argv[]; char *optstring; { register char c; register char *place; optarg = NULL; if (scan == NULL || *scan == '\0') { if (optind == 0) optind++; if (optind >= argc || argv[optind][0] != '-' || argv[optind][1] == '\0') return(EOF); if (strcmp(argv[optind], "--")==0) { optind++; return(EOF); } scan = argv[optind]+1; optind++; } c = *scan++; place = index(optstring, c); if (place == NULL || c == ':') { fprintf(stderr, "%s: unknown option -%c\n", argv[0], c); return('?'); } place++; if (*place == ':') { if (*scan != '\0') { optarg = scan; scan = NULL; } else { optarg = argv[optind]; optind++; } } return(c); } SHAR_EOF if test -f 'ipf.c' then echo shar: over-writing existing file "'ipf.c'" fi cat << \SHAR_EOF > 'ipf.c' /* * Interpress utility - count the number of pages in a interpress file * * Written for Xerox Corporation by Lee Moore & William LeFebvre * * Copyright (c) 1984, 1985 Xerox Corp. * * History: * 2-sep-85 lee moore created out of iptotext.c */ #ifdef vax11c # include stdio # include setjmp # include ctype # include "iptokens.h" # include "ipnames.h" #else # include <stdio.h> # include <setjmp.h> # include <ctype.h> # include "iptokens.h" # include "ipnames.h" #endif jmp_buf next_file; extern int errno; main(argc, argv) int argc; char *argv[]; { FILE *acctFile; int c, pageCount; char *login, *host; extern int optind; extern char *optarg; login = NULL; host = NULL; while ((c = getopt(argc, argv, "cw:l:i:n:h:")) != EOF) switch (c) { case 'c': case 'w': case 'l': case 'i': break; case 'n': login = optarg; break; case 'h': host = optarg; break; default: printf("option '%c' not allowed\n"); } if (argc - optind == 1) { pageCount = do_file(stdin); if( pageCount < 0 ) exit(2); if( (acctFile = fopen(argv[optind], "a")) == NULL ) { fprintf(stderr, "ipf: can't open acct file: %s\n", argv[optind]); exit(2); } if( login ) if( host ) fprintf(acctFile, "%d\t%s:%s\n", pageCount, host, login); else fprintf(acctFile, "%d\t%s\n", pageCount, login); exit(0); } } /* * process one file */ do_file(file) FILE *file; { # define Buffsize 256 char buff[Buffsize]; char *ptr; int len; int bodyDepth; /* how many bodies down we are */ register int bodyCount, /* how many bodies we have seen so far */ val, byte; /* has to be "int" for stdio EOF detection */ /* stdio is a pile! */ int hlen; hlen = strlen(IP_Header); /* for error recovery */ if (setjmp(next_file) != 0) { return -1; } /* get the header */ for (hlen = 0, ptr = buff; hlen < Buffsize; hlen++) { if ((*ptr++ = getnoeofc(file)) == ' ') break; } *ptr = '\0'; /* check the validity of the header */ if (strcmp(buff, IP_Header) != 0) { fprintf(stderr, " (INVALID HEADER!)"); } bodyDepth = 0; bodyCount = 0; /* main loop */ while ((byte = getc(file)) != EOF) { if ((byte & 0200) == 0) { /* a short number */ val = (byte << 8) + getnoeofc(file) - INTEGER_ZERO; } else { /* something else */ switch(byte >> 5) { case (SHORT_OP >> 5): break; case (LONG_OP >> 5): val = ((byte & 037) << 8) + getnoeofc(file); if( val == OP_beginBody ) { bodyDepth++; } else if( val == OP_endBody ) { bodyDepth--; /* is this a top level body? */ if( bodyDepth == 0 ) bodyCount++; } break; case (SHORT_SEQUENCE >> 5): len = getnoeofc(file); eatBytes(file, len); break; case (LONG_SEQUENCE >> 5): len = getnoeofc(file) << 16; len += (getnoeofc(file) << 8); len += getnoeofc(file); eatBytes(file, len); break; } } } return bodyCount - 1; /* the preamble is an extra body */ } /* * get a character */ getnoeofc(file) FILE *file; { register int val; #ifdef vax11c val= getc(file); if ( feof(file) ) #else if ((val = getc(file)) == EOF) #endif { fprintf(stderr, "Unexpected EOF!"); longjmp(next_file, 1); } return(val); } /* * read some bytes from the input stream */ eatBytes(file, length) FILE *file; int length; { register int count; count = length; while(count-- > 0) { (void) getnoeofc(file); } } SHAR_EOF # End of shell archive exit 0