allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc) (07/19/89)
Posting-number: Volume 7, Issue 86 Submitted-by: loy@gtx.UUCP (Bob Loy) Archive-name: whpl/part13 # whpl13of13.shar #---cut here---cut here---cut here---cut here---cut here--- #! /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. # This archive created: Sat Jan 14 04:05:29 MST 1989 export PATH; PATH=/bin:$PATH echo shar: extracting "'sortcount.c'" '(22016 characters)' if test -f 'sortcount.c' then echo shar: will not over-write existing file "'sortcount.c'" else sed 's/^X//' << \SHAR_EOF > 'sortcount.c' X X#ifndef lint X static char sccsid[] = " %M% %I% "; X static char dateid[] = " %E% "; X#endif X X/*@#==========================================================================* X@@# X@@@#@^ sortcount.c X@# X@# Purpose: X@@# Count live, dead, male &/or female whales in files, & optionally X@@# create output files of same. X@# X@#@^Options: X@#@^ -l count all live whales in input file(s) X@#@^ -d count all dead whales in input file(s) X@#@^ -m count all male whales in input file(s) X@#@^ -f count all female whales in input file(s) X@#@^ -s creates sorted output files, otherwise, only count is reported X@#@^ X@# Examples: X@# sortcount -l whn010101 -f X@# count live female whales in file whn010101 X@# sortcount -d whn010101 whn010102 whn010103 -s X@# count dead whales in the three files, and create an output file X@# of only those dead whales. X@# sortcount -m `cat wfile` X@# count all male whales in all the whale files listed in "wfile" X@# sortcount -s `cat anotherfile` -l -d -m -f X@# count live, dead, male & female whales in files listed in "an- X@# otherfile", and create four output files of: live dead, male & X@# female whales. Names of the output files will appear on stdout. X@# sortcount `cat anotherfile` -s X@# same as above (none of the opts -l, -d, -m or -f defaults to all) X@# X@# Compiling: X@# cc -O sortcount.c -o sortcount X@# X@# Functions: X@# void read_infile(); X@# void write_outheads(); X@# void next_whale(); X@# void write_outfile(); X@# void pick_outfiles(); X@# void open_outfiles(); X@# void close_outfiles(); X@# void print_count(); X@# int skip_arg(); X@# short cmd_line(); X@# void main(); X@# X@# General Comments: X@# Note: Header information for output files will be taken from FIRST X@# command line argument opened for reading. X@# There is no checking to see if the output files were opened properly. X@# X@#---------------------------------------------------------------------------*/ X X/*---------------------------------------------------------------------------* X Top-level Declaration - includes, defines, externs & globals. X*----------------------------------------------------------------------------*/ X X#include <stdio.h> X X#define Ushort unsigned short X X /* EXTERNS FROM */ X /* Functions From libraries: */ X extern FILE *fopen(); X extern int scanf(); X extern int fprintf(); X extern int strncmp(); X extern char *strcpy(); X extern void exit(); X X /* Functions From : */ X /* Variables From : */ X X /* EXTERNS TO */ X /* Functions To : */ X /* Variables To : */ X X /* GLOBALS */ X static Ushort masterflg = 0; X static Ushort sortflg = 0; X static Ushort liveflg = 0; X static Ushort deadflg = 0; X static Ushort malflg = 0; X static Ushort femflg = 0; X static FILE *outfp1; X static FILE *outfp2; X static FILE *outfp3; X static FILE *outfp4; X static FILE *infp; X static char whinstr[99]; X static char *test = whinstr; X static long tell; X static long livethis = 0; X static long deadthis = 0; X static long malthis = 0; X static long femthis = 0; X static long whthis = 0; X static long livetot = 0; X static long deadtot = 0; X static long maltot = 0; X static long femtot = 0; X static long whtot = 0; X X X/*---------------------------------------------------------------------------* X@ X@@ void read_infile(); Reads second line of each whale record to determine X@@ whether whale is alive or dead, male or female. X@ caller: main() X@ calls : sscanf() X@ X@*---------------------------------------------------------------------------*/ X Xvoid Xread_infile() X{ X char die[2]; X char sex[2]; X X whthis++; X sscanf(whinstr, "%s%s", die, sex); X if(die[0] == 'L') X liveflg = 1; X if(die[0] == 'D') X deadflg = 1; X if(sex[0] == 'M') X malflg = 1; X if(sex[0] == 'F') X femflg = 1; X} X X/*---------------------------------------------------------------------------* X@ X@@ void write_outheads(); Writes header information to output files. X@ caller: main() X@ calls : fputs() X@ X@*---------------------------------------------------------------------------*/ X Xvoid Xwrite_outheads() X{ X switch(masterflg) X { X case 0: X case 15: X fputs(whinstr, outfp3); X fputs(whinstr, outfp4); X /* Falls thru on purpose */ X case 3: X case 7: X case 11: X case 12: X case 13: X case 14: X fputs(whinstr, outfp2); X /* Falls thru on purpose */ X case 1: X case 2: X case 4: X case 5: X case 6: X case 8: X case 9: X case 10: X fputs(whinstr, outfp1); X break; X default: X fprintf(stderr, "\nwrite_outheads(): switch error\n"); X break; X } X} X X/*---------------------------------------------------------------------------* X@ X@@ void next_whale(); Finds next whale in input file, keeps present whale X@@ from being written out to an output file. X@ caller: pick_outfiles() X@ calls : fgets() X@ X@*---------------------------------------------------------------------------*/ X Xvoid Xnext_whale() X{ X fseek(infp, tell, 0); X test = fgets(whinstr, 97, infp); X do{ X tell = ftell(infp); X test = fgets(whinstr, 97, infp); X if(whinstr[0] == '#') X break; X } while(test != NULL); X} X X/*---------------------------------------------------------------------------* X@ X@@ void write_outfile(); Writes out present whale to an output file, and X@@ finds next whale in input file. X@ caller: pick_outfiles() X@ calls : fgets(), fputs() X@ X@*---------------------------------------------------------------------------*/ X Xvoid Xwrite_outfile(filep) X FILE *filep; X{ X fseek(infp, tell, 0); X test = fgets(whinstr, 97, infp); X do{ X if(sortflg) X fputs(whinstr, filep); X tell = ftell(infp); X test = fgets(whinstr, 97, infp); X if(whinstr[0] == '#') X break; X } while(test != NULL); X} X X/*---------------------------------------------------------------------------* X@ X@@ void pick_outfiles(); Tests flags set by read_infile() to determine X@@ whether to write out whale, and if so, to which output file. X@ caller: main() X@ calls : write_outfile(), next_whale() X@ X@*---------------------------------------------------------------------------*/ X Xvoid Xpick_outfiles() X{ X switch(masterflg) X { X case 0: X case 15: X if(liveflg) X { X if(malflg) X { X write_outfile(outfp1); X livethis++; X malthis++; X } X if(femflg) X { X write_outfile(outfp2); X livethis++; X femthis++; X } X } X if(deadflg) X { X if(malflg) X { X write_outfile(outfp3); X deadthis++; X malthis++; X } X if(femflg) X { X write_outfile(outfp4); X deadthis++; X femthis++; X } X } X break; X case 1: X if(liveflg) X { X write_outfile(outfp1); X livethis++; X } X else X next_whale(); X break; X case 2: X if(deadflg) X { X write_outfile(outfp1); X deadthis++; X } X else X next_whale(); X break; X case 3: X if(liveflg) X { X write_outfile(outfp1); X livethis++; X } X if(deadflg) X { X write_outfile(outfp2); X deadthis++; X } X else X next_whale(); X break; X case 4: X if(malflg) X { X write_outfile(outfp1); X malthis++; X } X else X next_whale(); X break; X case 5: X if(liveflg && malflg) X { X write_outfile(outfp1); X livethis++; X malthis++; X } X else X next_whale(); X break; X case 6: X if(deadflg && malflg) X { X write_outfile(outfp1); X deadthis++; X malthis++; X } X else X next_whale(); X break; X case 7: X if(malflg) X { X if(liveflg) X { X write_outfile(outfp1); X livethis++; X malthis++; X } X if(deadflg) X { X write_outfile(outfp2); X deadthis++; X malthis++; X } X } X else X next_whale(); X break; X case 8: X if(femflg) X { X write_outfile(outfp1); X femthis++; X } X else X next_whale(); X break; X case 9: X if(liveflg && femflg) X { X write_outfile(outfp1); X livethis++; X femthis++; X } X else X next_whale(); X break; X case 10: X if(deadflg && femflg) X { X write_outfile(outfp1); X deadthis++; X femthis++; X } X else X next_whale(); X break; X case 11: X if(femflg) X { X if(liveflg) X { X write_outfile(outfp1); X livethis++; X femthis++; X } X if(deadflg) X { X write_outfile(outfp2); X deadthis++; X femthis++; X } X } X else X next_whale(); X break; X case 12: X if(malflg) X { X write_outfile(outfp1); X malthis++; X } X if(femflg) X { X write_outfile(outfp2); X femthis++; X } X else X next_whale(); X break; X case 13: X if(liveflg) X { X if(malflg) X { X write_outfile(outfp1); X livethis++; X malthis++; X } X if(femflg) X { X write_outfile(outfp2); X livethis++; X femthis++; X } X } X else X next_whale(); X break; X case 14: X if(deadflg) X { X if(malflg) X { X write_outfile(outfp1); X deadthis++; X malthis++; X } X if(femflg) X { X write_outfile(outfp2); X deadthis++; X femthis++; X } X } X else X next_whale(); X break; X default: X fprintf(stderr, "\npick_outfiles(): switch error\n"); X break; X } X} X X/*---------------------------------------------------------------------------* X@ X@@ void open_outfiles(); Opens output files based on command line flags. X@ caller: main() X@ calls : fopen() X@ X@*---------------------------------------------------------------------------*/ X Xvoid Xopen_outfiles() X{ X switch(masterflg) X { X case 0: X case 15: X outfp1 = fopen("whlm", "w"); X outfp2 = fopen("whlf", "w"); X outfp3 = fopen("whdm", "w"); X outfp4 = fopen("whdf", "w"); X fprintf(stderr, " Output file: \"whlm\" opened.\n"); X fprintf(stderr, " Output file: \"whlf\" opened.\n"); X fprintf(stderr, " Output file: \"whdm\" opened.\n"); X fprintf(stderr, " Output file: \"whdf\" opened.\n"); X break; X case 1: X outfp1 = fopen("whl", "w"); X fprintf(stderr, " Output file: \"whl\" opened.\n"); X break; X case 2: X outfp1 = fopen("whd", "w"); X fprintf(stderr, " Output file: \"whd\" opened.\n"); X break; X case 3: X outfp1 = fopen("whl", "w"); X outfp2 = fopen("whd", "w"); X fprintf(stderr, " Output file: \"whl\" opened.\n"); X fprintf(stderr, " Output file: \"whd\" opened.\n"); X break; X case 4: X outfp1 = fopen("whxm", "w"); X fprintf(stderr, " Output file: \"whxm\" opened.\n"); X break; X case 5: X outfp1 = fopen("whlm", "w"); X fprintf(stderr, " Output file: \"whlm\" opened.\n"); X break; X case 6: X outfp1 = fopen("whdm", "w"); X fprintf(stderr, " Output file: \"whdm\" opened.\n"); X break; X case 7: X outfp1 = fopen("whlm", "w"); X outfp2 = fopen("whdm", "w"); X fprintf(stderr, " Output file: \"whlm\" opened.\n"); X fprintf(stderr, " Output file: \"whdm\" opened.\n"); X break; X case 8: X outfp1 = fopen("whxf", "w"); X fprintf(stderr, " Output file: \"whxf\" opened.\n"); X break; X case 9: X outfp1 = fopen("whlf", "w"); X fprintf(stderr, " Output file: \"whlf\" opened.\n"); X break; X case 10: X outfp1 = fopen("whdf", "w"); X fprintf(stderr, " Output file: \"whdf\" opened.\n"); X break; X case 11: X outfp1 = fopen("whlf", "w"); X outfp2 = fopen("whdf", "w"); X fprintf(stderr, " Output file: \"whlf\" opened.\n"); X fprintf(stderr, " Output file: \"whdf\" opened.\n"); X break; X case 12: X outfp1 = fopen("whxm", "w"); X outfp2 = fopen("whxf", "w"); X fprintf(stderr, " Output file: \"whxm\" opened.\n"); X fprintf(stderr, " Output file: \"whxf\" opened.\n"); X break; X case 13: X outfp1 = fopen("whlm", "w"); X outfp2 = fopen("whlf", "w"); X fprintf(stderr, " Output file: \"whlm\" opened.\n"); X fprintf(stderr, " Output file: \"whlf\" opened.\n"); X break; X case 14: X outfp1 = fopen("whdm", "w"); X outfp2 = fopen("whdf", "w"); X fprintf(stderr, " Output file: \"whdm\" opened.\n"); X fprintf(stderr, " Output file: \"whdf\" opened.\n"); X break; X default: X fprintf(stderr, "\nopen_outfiles(): switch error\n"); X break; X } X fprintf(stderr, "\n"); X} X X/*---------------------------------------------------------------------------* X@ X@@ void close_outfiles(); Closes output files based on command line flags. X@ caller: main() X@ calls : fclose() X@ X@*---------------------------------------------------------------------------*/ X Xvoid Xclose_outfiles() X{ X switch(masterflg) X { X case 0: X case 15: X fclose(outfp3); X fclose(outfp4); X /* Falls thru on purpose */ X case 3: X case 7: X case 11: X case 12: X case 13: X case 14: X fclose(outfp2); X /* Falls thru on purpose */ X case 1: X case 2: X case 4: X case 5: X case 6: X case 8: X case 9: X case 10: X fclose(outfp1); X break; X default: X fprintf(stderr, "\nclose_outfiles(): switch error\n"); X break; X } X} X X/*---------------------------------------------------------------------------* X@ X@@ void print_count(); Outputs whale counts to stdout based on command X@@ line flags. X@ caller: main() X@ calls : fprintf() X@ X@*---------------------------------------------------------------------------*/ X Xvoid Xprint_count(lw, dw, mw, fw) X long lw, dw, mw, fw; X{ X switch(masterflg) X { X case 0: X case 15: X fprintf(stdout, " Live = %4d\n", lw); X fprintf(stdout, " Dead = %4d\n", dw); X fprintf(stdout, " Male = %4d\n", mw); X fprintf(stdout, " Female = %4d\n", fw); X break; X case 1: X fprintf(stdout, " Live = %4d\n", lw); X break; X case 2: X fprintf(stdout, " Dead = %4d\n", dw); X break; X case 3: X fprintf(stdout, " Live = %4d\n", lw); X fprintf(stdout, " Dead = %4d\n", dw); X break; X case 4: X fprintf(stdout, " Male = %4d\n", mw); X break; X case 5: X fprintf(stdout, " Live Male =%4d\n", lw); X break; X case 6: X fprintf(stdout, " Dead Male =%4d\n", dw); X break; X case 7: X fprintf(stdout, " Live Male =%4d\n", lw); X fprintf(stdout, " Dead Male =%4d\n", dw); X break; X case 8: X fprintf(stdout, " Female = %4d\n", fw); X break; X case 9: X fprintf(stdout, " Live Fem =%4d\n", lw); X break; X case 10: X fprintf(stdout, " Dead Fem =%4d\n", dw); X break; X case 11: X fprintf(stdout, " Live Fem =%4d\n", lw); X fprintf(stdout, " Dead Fem =%4d\n", dw); X break; X case 12: X fprintf(stdout, " Male = %4d\n", mw); X fprintf(stdout, " Female = %4d\n", fw); X break; X case 13: X fprintf(stdout, " Live Male =%4d\n", mw); X fprintf(stdout, " Live Fem =%4d\n", fw); X break; X case 14: X fprintf(stdout, " Dead Male =%4d\n", mw); X fprintf(stdout, " Dead Fem =%4d\n", fw); X break; X default: X fprintf(stderr, "\nprint_count(): switch error\n"); X break; X } X} X X/*---------------------------------------------------------------------------* X@ X@@ int skip_arg(); Signals arguments beginning "-" so program won't try X@@ to open them as filenames. X@ caller: main() X@ return: 1 if function finds arg beginning with "-" X@ 0 otherwise X@ X@*---------------------------------------------------------------------------*/ X Xint Xskip_arg(j, argv) X int j; X char *argv[]; X{ X if(argv[j][0] == '-') X return(1); X else X return(0); X} X X/*---------------------------------------------------------------------------* X@ X@@ short cmd_line(count, strings); Gets filename(s) and args from cmnd line. X@ output: Opens named input file(s) X@ caller: main() X@ return: 0 if function makes it to end X@ 1 if file opens with error X@ X@*---------------------------------------------------------------------------*/ X Xshort Xcmd_line(argc, argv) X int argc; X char *argv[]; X{ X int namepos = 0; X int j; X X fprintf(stderr, "\n"); X /* Check for file name, occurs when first char is not '-' */ X for(j = 0; j < argc; j++) X { X if(strncmp(argv[j], "-s", 2) == 0) X sortflg = 1; X if(strncmp(argv[j], "-l", 2) == 0) X masterflg |= 0x1; X if(strncmp(argv[j], "-d", 2) == 0) X masterflg |= 0x2; X if(strncmp(argv[j], "-m", 2) == 0) X masterflg |= 0x4; X if(strncmp(argv[j], "-f", 2) == 0) X masterflg |= 0x8; X if(*argv[j] != '-') X namepos = j; X } X /* If nothing on command line besides program name or -'s */ X if(!namepos) X { X fprintf(stderr, "\n No input filename(s)!\n\n"); X return(1); X } X return(0); X} X X/*---------------------------------------------------------------------------* X@ X@@ void main(); Calling module for sortcount.c X@ input : As many input files as are on command line X@ calls : cmd_line(), open_outfiles(), skip_arg(), write_outheads(), X@ read_infile(), pick_outfiles(), print_count(), close_outfiles(); X@ fopen(), fclose(), ftell(), exit() X@ X@*---------------------------------------------------------------------------*/ X Xvoid Xmain(argc, argv) X int argc; X char *argv[]; X{ X static short once = 1; X int j; X X if(cmd_line(argc, argv)) X { X fprintf(stderr, " Problems with command line input. Exiting.\n\n"); X exit(9); X } X if(sortflg) X open_outfiles(); X j = 1; X while(skip_arg(j, argv)) X j++; X while((infp = fopen(argv[j], "r")) != NULL) X { X tell = ftell(infp); X test = fgets(whinstr, 97, infp); X while(whinstr[0] != '#') X { X if(once) X if(sortflg) X write_outheads(); X tell = ftell(infp); X test = fgets(whinstr, 97, infp); X if(test == NULL) X break; X } X while(test != NULL) X { X once = 0; X if(whinstr[0] == '#') X { X fgets(whinstr, 97, infp); X fgets(whinstr, 97, infp); X read_infile(); X pick_outfiles(); X liveflg = deadflg = malflg = femflg = 0; X } X } X whtot += whthis; X livetot += livethis; X deadtot += deadthis; X maltot += malthis; X femtot += femthis; X fprintf(stdout, "Whales this file =%4d\n", whthis); X print_count(livethis, deadthis, malthis, femthis); X whthis = livethis = deadthis = malthis = femthis = 0; X j++; X if(j >= argc) X break; X while(skip_arg(j, argv)) X { X j++; X if(j + 1 >= argc) X break; X } X } X fprintf(stdout, "Whales all files =%4d\n", whtot); X print_count(livetot, deadtot, maltot, femtot); X fprintf(stdout, "\n"); X fclose(infp); X close_outfiles(); X exit(0); X} SHAR_EOF if test 22016 -ne "`wc -c < 'sortcount.c'`" then echo shar: error transmitting "'sortcount.c'" '(should have been 22016 characters)' fi fi # end of overwriting check # End of shell archive exit 0 --- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | Bob Loy | Life is the detour you take on the ...!sun!sunburn!gtx!loy | way to where you're really going. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~