/****************************************************************************** SIMSERCH: This program facilitates searching through the SIMIBM.IDX file available from the SIMTEL archives. It supports keyword searches within selectable fields, starting and ending date boundaries, and user specified index files. It can also create (or append to) a SIMTEL request file which is suitable for e-mailing to the SIMTEL list servers. This program will compile and run under Turbo-C 2.0 and VAX/VMS C. This program is FREEWARE, and comes with NO WARRANTEES, expressed or implied. Author: Richard W. Hull Acknowledgements: Ed. Mueller and Larry Johnson for providing valuable inputs and for insisting that I submit the results to SIMTEL. Usage: simserch [?] [-s[fdnx] search-string] [-d[se] start/end date] [-i index-file] [-r[a] simtel-request-file] ******************************************************************************/ #include #include #ifdef VAX11C char *strlwr( char *arg ) { char *arg_save = arg; while( *arg ) { *arg = tolower( *arg ); arg++; } return( arg_save ); } #endif int main( int argc, char *argv[] ) { FILE *index_file, *simreq_file; /* input file */ char fs[10],dir[60],name[15],descr[60]; /* input variables */ char inputline[257]; /* for initial read */ int rev,bits; /* input variables */ long length,date,sdate,edate; /* input variables */ char lfs[10],ldir[60]; /* stores last filesystem/directory */ char type; /* output variable for 'A' or 'B' */ char searchstr[40]; /* string to qualify entries */ int search_fs, search_dir, search_name, search_desc; /* indicates which fields to search */ char teststr[257]; /* combo of fs,dir,name,descr */ char ndxfilnam[100]; /* name of input index file */ char reqfilnam[100]; /* SIMTEL request file */ int append_to_req; /* Flag for opening SIMTEL req file */ long tot_files, sel_files; /* total, selected files */ long tot_ldate, sel_ldate; /* total, selected last date */ char c; /* picks off EOF,",linefeed */ int i,j; sdate = 0; edate = 999999; searchstr[0] = '\0'; #ifdef VAX11C strcpy( ndxfilnam, "USER2:[HULL]SIMIBM.IDX" ); #else strcpy( ndxfilnam, "simibm.idx" ); #endif reqfilnam[0] = '\0'; tot_files = sel_files = tot_ldate = sel_ldate = 0; if (argc > 1 && strstr( argv[1], "?" )) { printf( "Usage: simserch [?]\n" ); printf( " [-s[fdnx] search-string]\n" ); printf( " [-i index-file-name]\n" ); printf( " [-d[se] start/end date]\n" ); printf( " [-r[a] simtel-request-file]\n" ); printf( "\n" ); printf( " -s [f search FILE-SYSTEM\n" ); printf( " d DIRECTORY\n" ); printf( " n NAME\n" ); printf( " x DESCRIPTION]\n" ); printf( " Default is to search ALL fields.\n" ); printf( "\n" ); printf( " -d [s starting date\n" ); printf( " e ending date]\n" ); printf( " Default is Starting-Date\n" ); printf( " Date format is YYMMDD.\n" ); printf( "\n" ); printf( " -r [a append to Request File]\n" ); printf( " Default is to Overwrite Request File.\n" ); exit(0); } if (!(argc % 2)) { printf( "Invalid number of parameters\n\n" ); exit(0); } printf("WSMR-SIMTEL20.ARMY.MIL PUBLIC DOMAIN LISTING\n\n"); for (i=1; i 0) printf( "Starting Date: %ld\n", sdate ); if (edate < 999999) printf( "Ending Date: %ld\n", edate ); printf( "Index File to be searched is: %s\n", ndxfilnam ); if (!(index_file = fopen( ndxfilnam, "r" ))) { printf( "\nCould not open Index File: %s\n", ndxfilnam ); exit(0); } if (reqfilnam[0]) { char open_mode[4]; if (append_to_req) { strcpy( open_mode, "a" ); printf( "Selected Files will be appended to: %s\n", reqfilnam ); } else { strcpy( open_mode, "w" ); printf( "Selected Files will be written to: %s\n", reqfilnam ); } if (!(simreq_file = fopen( reqfilnam, open_mode ))) { printf( "\nCould not open Request File: %s\n", reqfilnam ); exit(0); } } printf("\nNOTE: Type B is Binary; Type A is ASCII\n"); inputline[256] = 0; while (fgets(inputline, 256, index_file) != NULL) { sscanf(inputline, "\"%[^\"]\",\"%[^\"]\",\"%[^\"]\",%d,%ld,%d,%ld,\"%[^\"]\"", fs, dir, name, &rev, &length, &bits, &date, descr); tot_files++; if (date > tot_ldate) tot_ldate = date; if (date < sdate) continue; if (date > edate) continue; teststr[0] = '\0'; if (search_fs) { strcat( teststr, fs ); strcat( teststr, " " ); } if (search_dir) { strcat( teststr, dir ); strcat( teststr, " " ); } if (search_name) { strcat( teststr, name ); strcat( teststr, " " ); } if (search_desc) { strcat( teststr, descr ); strcat( teststr, " " ); } /* sprintf( teststr, "%s %s %s %s", fs, dir, name, descr ); */ strlwr( teststr ); if ( (searchstr[0]) && !( strstr( teststr, searchstr ) ) ) continue; sel_files++; if (date > sel_ldate) sel_ldate = date; type = 'B'; /* Binary 8-bit */ if (bits == 7) type = 'A'; /* ASCII 7-bit */ if (strcmp(ldir,dir) || strcmp(lfs,fs)) { /* New Directory */ printf("\nDirectory %s%s\n",fs,dir); printf(" Filename Type Length Date Description\n"); printf("==============================================\n"); strcpy(ldir, dir); /* Remember last directory with ldir */ strcpy(lfs,fs); /* Remember last file system with lfs */ } /* End of the New Directory routine */ printf("%-12.12s %c %7ld %6ld %s\n",name,type,length,date,descr); if (reqfilnam[0]) fprintf( simreq_file, "/PDGET %s%s%s UUENCODE\n", fs, dir, name ); } if (reqfilnam[0]) fclose( simreq_file ); printf( "\n\nNumber of Files (Total/Processed): %ld / %ld\n", tot_files, sel_files ); printf( "Last Date for Files (Total/Processed): %ld / %ld\n", tot_ldate, sel_ldate ); return (1) ; } /* end of main() */