[comp.sources.misc] v07i087: Quick 'n Dirty Object Deposit Generator

allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc) (07/22/89)

Posting-number: Volume 7, Issue 87
Submitted-by: terrell@druhi.ATT.COM (TerrellE)
Archive-name: deposit

#! /bin/sh
# This file was wrapped with "dummyshar".  "sh" this file to extract.
# Contents:  deposit.c
echo extracting 'deposit.c'
if test -f 'deposit.c' -a -z "$1"; then echo Not overwriting 'deposit.c'; else
sed 's/^X//' << \EOF > 'deposit.c'
X/*
XThis is a program for generating hexadecimal object code deposits
Xfor copyright registration of computer programs.
X
XAn object code deposit is the first and last 25 pages of a binary, octal,
Xor hexadecimal dump of a computer program.  Before using this program,
Xconsult an expert on copyright law, or at least a good book on copyright law.
XFor example:
X
XRemer and Elias, "Legal Care for your Software", 3d. ed., Nolo Press, 1987
X
XNOTE:  on IBM PCs this program should be compiled with the TINY memory model.
X
XUsing the program:
X
XBy default, the output of this program goes to the computer screen.
XThe output can be redirected to a file or printer.  For example:
X
Xdeposit junkmail.exe "Junk Mail v. 1.4" > prn:
X
XThe above command will generate an object code deposit for the program
X"junkmail.exe".  Each page will have a header of "Junk Mail v. 1.4  Page XX".
X
Xdeposit c:\sources\junkmail\junkmail.exe "Junk Mail v. 1.4" > deposit.txt
X
XThe above command will generate an object code deposit and place it in the
Xfile "deposit.txt".
X
XThis program was written by Eric Bergman-Terrell, and is in the public domain.
X*/
X
X#include <stdio.h>
X#include <sys/types.h>
X#include <sys/stat.h>
X
X#define ERROR	-1
X#define SUCCESS	 0
X
X#define COL_WIDTH	80  /* Width of columns - can be changed to 132. */
X#define PAGES		25
X
X#define TOP_MARGIN	3
X#define BOT_MARGIN	3
X
X#define TOT_LINES	66
X#define PRINT_LINES	(TOT_LINES - (TOP_MARGIN + BOT_MARGIN))
X
X#define BYTES_PER_LINE		(COL_WIDTH / 2)
X#define PAGE_BUFFER_SIZE	(PRINT_LINES * BYTES_PER_LINE)
X
Xtypedef char BUFFER[PAGE_BUFFER_SIZE];
X
X
Xvoid print_page(page, buffer, no_bytes, page_heading)
X
X/*
XPrint the current page of the hexadecimal dump.
X*/
X
Xint	page, no_bytes;
XBUFFER	buffer;
Xchar	*page_heading;
X
X{
Xint i;
X
Xif (no_bytes > 0)
X  {
X  printf("\n%s  Page %5d\n\n", page_heading, page);
X
X  for (i = 0; i < no_bytes; i++)
X    {
X    printf("%X%X", (int) buffer[i] / 16, (int) buffer[i] % 16);
X
X    if (((i + 1) % BYTES_PER_LINE) == 0)
X      printf("\n");
X    }
X
X  printf("\n\n\n");
X  }
X}
X
X
Xvoid main(argc, argv)
X
Xint	argc;
Xchar	*argv[];
X
X{
XFILE   *file;
Xlong int	file_size;
Xint    		result, start_last_page, page, max_page;
XBUFFER 		buffer;
Xstruct stat 	stat_buf;
X
Xif (argc != 3)
X  {
X  printf("usage: deposit <file name> <page header>\n");
X  exit(ERROR);
X  }
X
Xresult = stat(argv[1], &stat_buf);
X
Xif (result != SUCCESS)
X  {
X  printf("deposit: cannot open file %s\n", argv[1]);
X  exit(ERROR);
X  }
X
Xfile_size = stat_buf.st_size;
X
Xfile = fopen(argv[1], "rb");
X
Xif (file == NULL)
X  {
X  printf("deposit: cannot open file %s\n", argv[1]);
X  exit(ERROR);
X  }
X
X/* Determine the maximum page number. */
Xmax_page = (short) (file_size / PAGE_BUFFER_SIZE) + 1;
X
X/* Correct value if last page is exactly full. */
Xif (file_size % PAGE_BUFFER_SIZE == 0)
X  max_page--;
X
X/* Determine the page number of the first page of the last 25 pages. */
Xstart_last_page = max_page - PAGES + 1;
X
X/* Cope with object files with less than 50 pages. */
Xif (start_last_page <= PAGES)
X  start_last_page = PAGES + 1;
X
X/* Print the first 25 pages. */
Xfor (page = 1; page <= PAGES; page++)
X  {
X  result = fread(buffer, 1, PAGE_BUFFER_SIZE, file);
X  print_page(page, buffer, result, argv[2]);
X  }
X
X/* Discard pages before the last 25 pages. */
Xfor (; page < start_last_page; page++)
X  result = fread(buffer, 1, PAGE_BUFFER_SIZE, file);
X
X/* Print the last 25 pages. */
Xfor (; page <= max_page; page++)
X  {
X  result = fread(buffer, 1, PAGE_BUFFER_SIZE, file);
X  print_page(page, buffer, result, argv[2]);
X  }
X
Xfclose(file);
X
Xexit(SUCCESS);
X}
X
EOF
chars=`wc -c < 'deposit.c'`
if test $chars !=     3534; then echo 'deposit.c' is $chars characters, should be     3534 characters!; fi
fi
exit 0