home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Crawly Crypt Collection 1
/
crawlyvol1.bin
/
program
/
compiler
/
sozobon
/
scsrc20
/
top
/
main.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-02-22
|
4KB
|
169 lines
/* Copyright (c) 1988,1989,1991 by Sozobon, Limited. Author: Tony Andrews
*
* Permission is granted to anyone to use this software for any purpose
* on any computer system, and to redistribute it freely, with the
* following restrictions:
* 1) No charge may be made other than reasonable charges for reproduction.
* 2) Modified versions must be clearly marked as such.
* 3) The authors are not responsible for any harmful consequences
* of using this software, even if they result from defects in it.
*/
#include "top.h"
FILE *ifp, *ofp; /* input/output file pointers */
#ifndef MINIX
long _STKSIZ = 32768L; /* need mucho stack for recursion */
#endif
/*
* Options
*/
bool debug = FALSE;
bool do_brev = TRUE; /* branch reversals enabled */
bool do_peep = TRUE; /* peephole optimizations enabled */
bool do_regs = TRUE; /* do "registerizing" */
bool do_lrot = TRUE; /* do loop rotations */
bool gflag = FALSE; /* don't do stuff that confuses the debugger */
bool verbose = FALSE;
/*
* Optimization statistics (use -v to print)
*/
int s_bdel = 0; /* branches deleted */
int s_badd = 0; /* branches added */
int s_brev = 0; /* branch reversals */
int s_lrot = 0; /* loop rotations */
int s_peep1 = 0; /* 1 instruction peephole changes */
int s_peep2 = 0; /* 2 instruction peephole changes */
int s_peep3 = 0; /* 3 instruction peephole changes */
int s_idel = 0; /* instructions deleted */
int s_reg = 0; /* variables "registerized" */
#define TMPFILE "top_tmp.$$$" /* temporary file name */
int use_temp = FALSE; /* using temporary file */
char *Version =
"top Version 2.00 Copyright (c) 1988-1991 by Sozobon, Limited.";
usage()
{
fprintf(stderr, "usage: top [-gdvblpr] infile [outfile]\n");
exit(1);
}
main(argc, argv)
int argc;
char *argv[];
{
FILE *fopen();
register char *s;
while (argc > 1 && argv[1][0] == '-') {
for (s = &argv[1][1]; *s ;s++) {
switch (*s) {
case 'd': case 'D':
debug = TRUE;
break;
case 'b': case 'B':
do_brev = FALSE;
break;
case 'p': case 'P':
do_peep = FALSE;
break;
case 'r': case 'R':
do_regs = FALSE;
break;
case 'l': case 'L':
do_lrot = FALSE;
break;
case 'v': case 'V':
fprintf(stderr, "%s\n", Version);
verbose = TRUE;
break;
case 'g': case 'G':
gflag = TRUE;
break;
case 'O': case 'z': case 'Z':
/*
* When options are received from 'cc' they
* look like "-Oxxx", so just ignore the 'O'.
*/
break;
default:
usage();
break;
}
}
argv++;
argc--;
}
if (argc > 3)
usage();
if (argc > 1) {
if (strcmp(argv[1], "-") == 0)
ifp = stdin;
else if ((ifp = fopen(argv[1], "r")) == NULL) {
fprintf(stderr, "top: can't open input file '%s'\n",
argv[1]);
exit(1);
}
if (argc > 2) {
if (strcmp(argv[2], "-") == 0)
ofp = stdout;
else if ((ofp = fopen(argv[2], "w")) == NULL) {
fprintf(stderr, "top: can't open output file '%s'\n",
argv[2]);
exit(1);
}
} else {
if ((ofp = fopen(TMPFILE, "w")) == NULL) {
fprintf(stderr, "top: can't create temp file\n");
exit(1);
}
use_temp = TRUE;
}
} else
usage();
dofile();
if (verbose) {
if (do_peep) {
fprintf(stderr, "Peephole changes (1): %4d\n", s_peep1);
fprintf(stderr, "Peephole changes (2): %4d\n", s_peep2);
fprintf(stderr, "Peephole changes (3): %4d\n", s_peep3);
fprintf(stderr, "Instructions deleted: %4d\n", s_idel);
}
if (do_regs)
fprintf(stderr, "Variables registered: %4d\n", s_reg);
if (do_lrot)
fprintf(stderr, "Loop rotations : %4d\n", s_lrot);
if (do_brev)
fprintf(stderr, "Branch reversals : %4d\n", s_brev);
fprintf(stderr, "Branches removed : %4d\n", s_bdel - s_badd);
}
/*
* If we're overwriting the original file, remove the old
* version, and rename the temp file to the old name.
*/
if (use_temp) {
remove(argv[1]);
rename(TMPFILE, argv[1]);
}
exit(0);
}
dofile()
{
if (!readline())
return;
while (dofunc())
;
}