diff --git a/usr.orca.bin/describe/README b/usr.orca.bin/describe/README new file mode 100644 index 0000000..e6fc761 --- /dev/null +++ b/usr.orca.bin/describe/README @@ -0,0 +1,125 @@ +$Id: README,v 1.1 1996/01/22 01:37:59 gdr Exp $ + +This is the README file for the describe package. This package is +designated as version 1.0.1, and consists of the following utilities: + + describe v1.0.1 - show database entries describing the current + status of programs + + descc v1.0.1 - the describe source compiler + + descu v1.0 - the describe source updater + +ABOUT DESCRIBE AND DESCC +======================== + + This is yet another project I've been sitting on for a while, but have +finally decided to release. The basic idea of the 'describe' package +(the descc "compiler" and describe itself) is to provide a quick, easy +way of accessing information related to the utilities which so many +different people are releasing these days. The reason it sat around on +my harddrive so long is I was having qualms about its designated role in +life. I wasn't sure exactly what I wanted it to do. Well, I've decided +to KISS for now: descc simply compiles the utility list, which I maintain, +into a (very) simple "database" located in /usr/local/lib/. The companion +utility 'describe' is used to fetch information about a particular utility +from this "database". + + descc is fairly limited, as is the "database" format itself. Part of the +KISS (or it wouldn't be out now) design philosophy ;). Usage is simple: +when you get a new listing (I'll provide monthly updates), simply "descc +" where is the name of the newly released update. +descc will simply write over the old database and replace it with the +new. (Note: No appendages are allowed by descc. See descu.) + + As always, coments are appreciated. And, moreso than on other projects, +I'd appreciate some comments about the direction I'm going in, suggestions +as to where to take this, etc. I have a feeling that some fields in the +format (eg, FTP:) are rather useless, and I'd like to know what you guys +out there think. + +James Brookes +jamesb@ecst.csuchico.edu + +ABOUT DESCU +=========== + +I think describe and descc were really good ideas; they sure beat the +text file list of Gno utilities that James used to keep. The one major +shortfall I found was having to manually update the describe database +source every time I wanted to include a new entry. + +I therefore wrote descu, the describe updater, which is also rather +limited due to following the KISS principle. + +For completeness, I have also added the man pages describe.1, descc.8, +and descu.8. I briefly pondered having a describe.5, but alas I was too +lazy; you can find the file formats as part of descc.8. + +Devin Reade +gdr@myrias.ab.ca + +INSTALLATION +============ + +You can either type "dmake install", or do the following: + + mkdir -p /usr/local/lib + cp ./describe /usr/local/bin + cp ./descc /usr/sbin + cp ./descu /usr/sbin + rm /usr/local/bin/descc + +You will also want to do the following, which is NOT done by dmake's +install target: + + rehash + descc ./describe.source + +CHANGES +======= + +This details changes to the entire distribution. + +v1.1 May 1995 + Initial release for descu. + Added -h and -v flags to describe and descc. + Common defines and typedefs were extracted to desc.h. + Descc now exits -1 on failure (vice 0). + In descc, some more error checking and flushing were added. Also, + mygets wasn't dereferencing one of its arguments properly. + Allocated stack size was increased from 512 to 768 bytes. + Describe and descc were modified not to be dependant on the size + of integers. + Ran source files through indent(1). + +v1.0 Feb 1994 + Initial release for describe and descc. + +AUTHORS +======= + +The original describe and descc utilities and the describe format were +written by James Brookes . + +The descu utility and v1.1 modifications to describe and descc were by +Devin Reade . + +LEGALESE +======== + +The describe and descc utilities are copyright (c) 1994-1995 by James +Brookes. The descu utility is copyright (c) 1995 by Devin Reade. + +These programs may be freely copied provided that the archive, including +source files and this README, remain intact. Modified versions of these +programs may not be distributed without the permission of the respective +authors. + +Contact the respective authors for permission to include these programs on +any commercial software collections. Permission is granted to Usenet sites +and GEnie Information Services for inclusion in software archives. + +The Apple IIGS executable files distributed with this archive contain +material from the ORCA/C Run-Time Libraries, copyright 1987-1995 by +Byte Works, Inc. Used with permission. diff --git a/usr.orca.bin/describe/README.FIRST b/usr.orca.bin/describe/README.FIRST deleted file mode 100644 index bde0861..0000000 --- a/usr.orca.bin/describe/README.FIRST +++ /dev/null @@ -1,20 +0,0 @@ -About Me -~~~~~~~~~ -Um. Not much to say right now. I'll get back to this part later. - -About My Source -~~~~~~~~~~~~~~~ -I guess I used to feel a bit propriatary about it, but a couple of things -have caused me to change my mind: - - 1) Losing over half of the eps source, may it rest in peace. - 2) Yes, people can profit by and sometimes even improve (gasp!) my - source. And I'd be a grumpy old coot if I didn't let them. - -So what this means is that most (not all) of my stuff will be released -with full source from now henceforth. I only ask of you, the humble masses -yearning to be free, please don't distribute modified versions of my programs -without first contacting me. I think this is only fair. - -James Brookes -jamesb@ecst.csuchico.edu diff --git a/usr.orca.bin/describe/basename.c b/usr.orca.bin/describe/basename.c new file mode 100644 index 0000000..5769980 --- /dev/null +++ b/usr.orca.bin/describe/basename.c @@ -0,0 +1,30 @@ +#pragma optimize -1 + +#include +#include +#include + +char *basename (char *name) { + char *p, brk; + + /* checking for ':' is GS-specific */ + brk = (strchr(name,':')) ? ':' : '/'; + p = strrchr(name,brk); + + return ((p) ? p+1 : name); +} + + +#ifdef SHELLCOMD + +int main (int argc, char **argv) { + + if (argc != 2) { + fprintf(stderr,"Usage: basename file_name\nVersion 1.0\n"); + return -1; + } + printf("%s\n",basename(argv[1])); + return 0; +} + +#endif /* SHELLCOMD */ diff --git a/usr.orca.bin/describe/desc.h b/usr.orca.bin/describe/desc.h new file mode 100644 index 0000000..15c63e2 --- /dev/null +++ b/usr.orca.bin/describe/desc.h @@ -0,0 +1,52 @@ +/* + * Header file for the describe package. This file is + * used by describe(1), descc(8), and descu(8). + */ + +#define QUOTE_CHAR '#' +#define DATABASE "/usr/local/lib/describe" + +#define FIELD_LEN 9 +#define NAME_LEN 34 +#define MAX_LINE_LENGTH 81 +#define FIELD_COUNT 6 /* number of fields below, not including comments */ + +#define NAME "Name: " +#define VERSION "Version: " +#define AUTHOR "Author: " +#define CONTACT "Contact: " +#define WHERE "Where: " +#define FTP "FTP: " + +#define NAME_SHORT "Name:" +#define VERSION_SHORT "Version:" +#define AUTHOR_SHORT "Author:" +#define CONTACT_SHORT "Contact:" +#define WHERE_SHORT "Where:" +#define FTP_SHORT "FTP:" + +#ifndef FALSE +# define FALSE 0 +# define TRUE 1 +#endif + +typedef short int2; +typedef long int4; + +typedef struct nameEntry_tag { + char name[NAME_LEN]; + long int offset; +} nameEntry; + +typedef struct descEntryTag { + char *name; + char *data; +} descEntry; + +extern int optind; +extern char *optarg; + +/* extern int getopt_restart(void); */ +extern void begin_stack_check(void); +extern int end_stack_check(void); +extern char *basename(char *); diff --git a/usr.orca.bin/describe/descc.8 b/usr.orca.bin/describe/descc.8 new file mode 100644 index 0000000..09cd33e --- /dev/null +++ b/usr.orca.bin/describe/descc.8 @@ -0,0 +1,86 @@ +.TH DESCC 8 "System Administration" "7 May 1995" "Version 1.0.1" +.SH NAME +descc \- the describe(1) source compiler +.SH SYNOPSIS +.BR descc " [" -hV ] +.I sourcefile +.SH DESCRIPTION +.BR descc +compiles the describe source file +.I sourcefile +and saves the result to the system describe database. +.SH OPTIONS +.nf +\fB-h\fR Show usage information. + +\fB-V\fR Show version information. +.fi +.SH "FILE FORMATS" +The describe source file consists of comments and records. A comment +is any line starting with the +.BR # +character. Each record consists of seven fields. The first +six consist of one line of text and begin with the following identifiers: +.nf + + Name: (The name of the program.) + Version: (The current version number.) + Author: (The author or maintainer of the program.) + Contact: (How to contact the Author, typically an + email address.) + Where: (Where the program should be installed.) + FTP: (An ftp site from which the program may be + obtained.) + +.fi +The last field consists of multiple lines of text. It should be +a brief description of the program. The following is an example of +a complete record: +.nf + + Name: descc + Version: 1.0.1 + Author: James Brookes + Contact: jamesb@ecst.csuchico.edu + Where: /usr/local/bin + FTP: ftp.cco.caltech.edu + + Print a multi-line description obtained from the compiled + 'describe' database; giving utility name, version, author, + author's contact, where the utility is, as well as where the + utility can be FTPd from on the InterNet. + +.fi +.LP +The describe database file consists of a +.BR Header , +a set of +.BR "Name Entries" , +and a set of +.BR Records , +in the following format: +.nf + + Header + 2 bytes: Short Int, number of \fBName Entries\fR + + Name Entries + 34 bytes: NULL-terminated string; name of the utility. + 4 bytes: Long Int, offset of the \fBrecord\fR in file. + + Records + 7 variable-length NULL-terminated strings. + +.fi +.SH FILES +/usr/local/lib/describe \- the system +.B describe +database. +.SH AUTHOR +James Brookes . +.SH "SEE ALSO" +.BR apropos (1), +.BR describe (1), +.BR man (1), +.BR whatis (1), +.BR descu (8). diff --git a/usr.orca.bin/describe/descc.c b/usr.orca.bin/describe/descc.c index 4b7138d..cf93f03 100644 --- a/usr.orca.bin/describe/descc.c +++ b/usr.orca.bin/describe/descc.c @@ -1,15 +1,11 @@ -#ifndef _ORCAC_ -#define _ORCAC_ -#endif - -#ifdef _ORCAC_ - #pragma optimize -1 - #pragma stacksize 512 -#endif /* _ORCAC_ */ - /* */ /* descc - compile info file into describe database file */ /* */ +/* v1.0.1 - Added -h and -V flags [Sat May 06 1995] */ +/* Extracted certain #defines to "desc.h" */ +/* Now uses getopt for command line parsing. */ +/* Fixed some potential bugs. */ +/* */ /* v1.0.0 - James Brookes [Sat Oct 23 1993] */ /* released [Thu Mar 31 1994] [!!!!!!!!!!!] */ /* */ @@ -33,199 +29,213 @@ /* 7 variable-length Null-terminated strings. */ /* */ +#pragma optimize 15 + #include #include #include +#include +#include +#include "desc.h" -#pragma lint -1 +#define _VERSION_ "v1.0.1" /* prototypes */ void usage(char *callname); +void version(char *callname); void puke(int error,int lines); -int mygets(char *buffer, int *lines, FILE *FInPtr); +int mygets(char *buffer, int2 *lines, FILE *FInPtr); -/* defines */ +int Vflag; -typedef struct nameEntry_tag +/* version - print it out */ - { - char name[34]; - long int offset; - }nameEntry; - -#define _VERSION_ "v1.0.0" -#define QUOTE_CHAR '#' -#define OUTFILE "/usr/local/lib/describe" - -#define FIELD_LEN 9 - -#define NAME "Name: " -#define VERSION "Version: " -#define AUTHOR "Author: " -#define CONTACT "Contact: " -#define WHERE "Where: " -#define FTP "FTP: " +void version (char *callname) { + Vflag++; + fprintf(stderr,"%s version %s\n",callname,_VERSION_); + return; +} /* */ /* usage - you know what to do */ /* */ -void usage (char *callname) - - { - fprintf(stderr,"%s %s\n",callname,_VERSION_); - fprintf(stderr,"usage: %s \n",callname); - exit(0); - } +void usage (char *callname) { + if (!Vflag) version(callname); + fprintf(stderr,"usage: %s [-hV] \n",callname); + exit(-1); +} /* */ /* puke - stdlib errors */ /* */ -void puke (int error,int lines) - - { - fprintf(stderr,"\nError $%x in line %d of script\n",error,lines); - fflush(stdout); - exit(error); - } +void puke (int error,int lines) { + fprintf(stderr,"\nError $%x in line %d of script\n",error,lines); + fflush(stdout); + exit(error); +} /* */ /* mygets - get a line (skipping commented lines) and increment line count */ /* */ -int mygets (char *buffer, int *lines, FILE *FInPtr) +int mygets (char *buffer, int2 *lines, FILE *FInPtr) { + char *p, c; - { - int i; - - do - - { - if (fgets(buffer,80,FInPtr)==NULL) - return(-1); - buffer[strlen(buffer)-1] = '\0'; /* remove trailing \n */ - lines++; - } - - while(buffer[0] == QUOTE_CHAR || buffer[0] == '\n'); - return(0); - } + do { + if (fgets(buffer,MAX_LINE_LENGTH,FInPtr)==NULL) { + return(-1); + } + p = buffer + strlen(buffer) - 1; /* remove trailing \n */ + if (*p == '\n') { + *p = '\0'; + } else { + fprintf(stderr,"Line %d exceeds %d characters. Remainder ignored.\n", + *lines,MAX_LINE_LENGTH-1); + do { + c = fgetc(FInPtr); + } while ((c!='\n') && !feof(FInPtr)); + } + (*lines)++; + } while(buffer[0] == QUOTE_CHAR || buffer[0] == '\n'); + return(0); +} /* */ /* Mainline */ /* */ -int main (int argc, char **argv) +int main (int argc, char **argv) { + FILE *FInPtr, *FOutPtr; + long int *record_locs, currLoc, endOfFile; + char *buffer; + int2 lines, namecount, i, j; + nameEntry nameStruct; + int c, errflag; - { - FILE *FInPtr, *FOutPtr; - long int *record_locs, currLoc, endOfFile; - char *tmpPtr, *buffer; - int lines, namecount, c, i, j; - nameEntry nameStruct; + /* initialize globals */ + Vflag=0; + errflag=0; +#ifdef STACK_CHECK + begin_stack_check(); +#endif - if (argc != 2) - usage(argv[0]); + assert(sizeof(int2)==2); + assert(sizeof(int4)==4); - /* open input and output files */ + /* parse command line */ + while ((c = getopt(argc, argv, "hV")) != EOF) { + switch (c) { + case 'V': + version(basename(argv[0])); + break; + case 'h': /*FALLTHROUGH*/ + default: + errflag++; + break; + } + } + if (errflag || (argc-optind != 1)) + usage(basename(argv[0])); - buffer = (char *) malloc (81); - if ((FInPtr = fopen(argv[1],"r")) == NULL) - - { - fprintf(stderr,"Error opening %s; exiting.\n",argv[1]); - free(buffer); - exit(1); - } + /* open input and output files */ - if ((FOutPtr = fopen(OUTFILE,"w+")) == NULL) + if ((buffer = malloc (MAX_LINE_LENGTH)) == NULL) { + fprintf(stderr,"couldn't allocate line buffer\n"); + exit (-1); + } + + if ((FInPtr = fopen(argv[argc-1],"r")) == NULL) { + fprintf(stderr,"Error opening %s; exiting.\n",argv[argc-1]); + free(buffer); + exit(1); + } - { - fprintf(stderr,"Error opening output file %s; exiting.\n",OUTFILE); - free(buffer); - exit(1); - } + if ((FOutPtr = fopen(DATABASE,"wb+")) == NULL) { + fprintf(stderr,"Error opening database file %s; exiting.\n",DATABASE); + free(buffer); + exit(1); + } - /* Compile array of names */ + /* Compile array of names */ + lines = 0; + namecount = 0; - lines = 0; - namecount = 0; - fseek(FOutPtr,2,SEEK_CUR); /* space for # of array entries */ + /* space for # of array entries */ + fwrite(&namecount,sizeof(namecount),1,FOutPtr); - while(mygets(buffer,&lines,FInPtr) != -1) - - { - if (!strncmp(buffer,NAME,FIELD_LEN)) /* found a match */ - - { - tmpPtr = &buffer[FIELD_LEN]; - strcpy(nameStruct.name,tmpPtr); - fwrite(&nameStruct,sizeof(nameStruct),1,FOutPtr); - namecount++; - } - - } - - record_locs = (long int *) malloc (namecount*sizeof(long int)); - rewind(FInPtr); - buffer[0] = '\0'; - lines = 0; - fprintf(FOutPtr,"\t"); - - /* Increment to first field */ - - while (strncmp(buffer,NAME,FIELD_LEN)) /* found a match! */ - mygets(buffer,&lines,FInPtr); - - for (i = 0; i < namecount; i++) - - { - record_locs[i] = ftell(FOutPtr); - for (j = 0; j < 5; j++) /* parse additional info */ - - { - mygets(buffer,&lines,FInPtr); - tmpPtr = &buffer[FIELD_LEN]; - fprintf(FOutPtr,"%s\n",tmpPtr); /* print out fields */ - } - - /* handle comment field */ - - while (1) - - { - if (mygets(buffer,&lines,FInPtr) == -1) - break; - if (!strncmp(buffer,NAME,FIELD_LEN)) /* until next field */ - break; - fprintf(FOutPtr,"%s ",buffer); - } - - fprintf(FOutPtr,"\n"); - } - - endOfFile = ftell(FOutPtr); - rewind(FOutPtr); - fwrite(&namecount,2,1,FOutPtr); - - /* time to go through the record_locs array and backpatch in */ - /* all the record locations. A little slower than necessary */ - /* perhaps, but it gets the job done. */ - - for (i = 0; i < namecount; i++) - - { - currLoc = ftell(FOutPtr); - fread(&nameStruct,sizeof(nameStruct),1,FOutPtr); - fseek(FOutPtr,-(sizeof(nameEntry)),SEEK_CUR); - nameStruct.offset = record_locs[i]; + while(mygets(buffer,&lines,FInPtr) != -1) { + if (!strncmp(buffer,NAME,FIELD_LEN)) { /* found a match */ + strncpy(nameStruct.name,&buffer[FIELD_LEN],NAME_LEN-1); + nameStruct.name[NAME_LEN-1] = '\0'; fwrite(&nameStruct,sizeof(nameStruct),1,FOutPtr); - } + namecount++; + } + } - fseek(FOutPtr,endOfFile,SEEK_SET); - fclose(FOutPtr); - free(record_locs); - free(buffer); - } + if ((record_locs = malloc (namecount*sizeof(long int)))==NULL) { + fprintf(stderr,"malloc of record_locs failed (%ld bytes); exiting\n", + (long) namecount*sizeof(long int)); + exit(-1); + } + rewind(FInPtr); + fflush(FInPtr); + buffer[0] = '\0'; + lines = 0; + fprintf(FOutPtr,"\t"); + + /* Increment to first field */ + + while (strncmp(buffer,NAME,FIELD_LEN)) /* found a match! */ + mygets(buffer,&lines,FInPtr); + + /* Write out records and keep track of their file offsets */ + for (i = 0; i < namecount; i++) { + record_locs[i] = ftell(FOutPtr); + + /* print out , , , , */ + for (j = 0; j < FIELD_COUNT-1; j++) { + buffer[FIELD_LEN] = '\0'; + mygets(buffer,&lines,FInPtr); + fprintf(FOutPtr,"%s\n",&buffer[FIELD_LEN]); + } + + /* handle field */ + for (;;) { + if (mygets(buffer,&lines,FInPtr) == -1) break; + if (!strncmp(buffer,NAME,FIELD_LEN)) break; + fprintf(FOutPtr,"%s ",buffer); + } + fprintf(FOutPtr,"\n"); + } + + endOfFile = ftell(FOutPtr); + fflush(FOutPtr); /*gdr 1*/ + rewind(FOutPtr); + fwrite(&namecount,sizeof(namecount),1,FOutPtr); + fflush(FOutPtr); /*gdr 1*/ + + /* time to go through the record_locs array and backpatch in */ + /* all the record locations. A little slower than necessary */ + /* perhaps, but it gets the job done. */ + + for (i = 0; i < namecount; i++) { + fread(&nameStruct,sizeof(nameStruct),1,FOutPtr); + fseek(FOutPtr,-(sizeof(nameStruct)),SEEK_CUR); + nameStruct.offset = record_locs[i]; + fwrite(&nameStruct,sizeof(nameStruct),(size_t) 1,FOutPtr); + fflush(FOutPtr); + } + + fseek(FOutPtr,endOfFile,SEEK_SET); + fclose(FOutPtr); + free(record_locs); + free(buffer); + +#ifdef STACK_CHECK + fprintf(stderr,"stack usage: %d bytes\n",end_stack_check()); +#endif + return 0; +} diff --git a/usr.orca.bin/describe/describe.1 b/usr.orca.bin/describe/describe.1 new file mode 100644 index 0000000..6d77a29 --- /dev/null +++ b/usr.orca.bin/describe/describe.1 @@ -0,0 +1,46 @@ +.TH DESCRIBE 1 "Commands and Applications" "7 May 1995" "Version 1.0.1" +.SH NAME +describe \- show information about a program +.SH SYNOPSIS +.BR describe " [" -hvV ] +.I program +.SH DESCRIPTION +.BR describe +will show current information about +.IR program . +This information includes: +.nf + + The name of the program; + The program version number; + The author (or the person currently maintaining the program); + Contact information for the author; + Where the utility should be installed; + An FTP site from which the program may be obtained, and; + A brief description of the program. + +.fi +.LP +.BR describe +uses a database compiled by +.BR descc (8). +.SH OPTIONS +.nf +\fB-h\fR Show usage information. + +\fB-v\fR Verbose debugging mode. + +\fB-V\fR Show version information. +.fi +.SH FILES +/usr/local/lib/describe \- the system +.B describe +database. +.SH AUTHOR +James Brookes . +.SH "SEE ALSO" +.BR apropos (1), +.BR man (1), +.BR whatis (1), +.BR descc (8), +.BR descu (8). diff --git a/usr.orca.bin/describe/describe.c b/usr.orca.bin/describe/describe.c index 5aa7ec5..e68503d 100644 --- a/usr.orca.bin/describe/describe.c +++ b/usr.orca.bin/describe/describe.c @@ -1,16 +1,22 @@ -#pragma optimize 15 -#pragma stacksize 512 +/* + * describe(1) -- Copyright 1993-1995 James Brookes. See the README and + * man page for details. + * + * We have to have this pragma in here; Orca/C's bit 5 optimization + * (loop invariant removal) kills code somewhere in this file, resulting + * in a system panic. + */ + +#pragma optimize 31 #include #include #include +#include +#include +#include "desc.h" -#pragma lint -1 - -#ifdef STACK_CHECK -void begin_stack_check(void); -int end_stack_check(void); -#endif +#define _VERSION_ "v1.0.1" /* prototypes */ @@ -18,188 +24,165 @@ void usage(char *callname); void print_entry(FILE *FInPtr, long int index); void myprintf(char *string, int wordwrap_size); -/* defines */ +int Vflag; -typedef struct nameEntry_tag +void version (char *callname) { + Vflag++; + fprintf(stderr,"%s version %s\n",callname,_VERSION_); + return; +} - { - char name[34]; - long int offset; - }nameEntry; +void usage(char *callname) { + if (!Vflag) version(callname); + fprintf(stderr,"usage: %s [-hv] \n",callname); + exit(-1); +} -#ifndef FALSE - #define FALSE 0 - #define TRUE 1 -#endif +void myprintf(char *string, int wordwrap_size) { + int length = 0; + char *headString, *tailString; + + headString = tailString = string; + printf("\n"); + while (1) { + tailString++; length++; + if (*tailString == '\0') { + printf("%s",headString); + return; + } else if (length == wordwrap_size) { + while (*tailString != ' ') + tailString--; + *tailString = '\0'; + printf("%s\n",headString); + headString = tailString+1; + length = 0; + } + } +} -#define _VERSION_ "v1.0" -#define INFILE "/usr/local/lib/describe" +void print_entry(FILE *FInPtr, long int index) { + char *buffer; + + buffer = (char *) malloc (1024); -#define NAME "Name: " -#define VERSION "Version: " -#define AUTHOR "Author: " -#define CONTACT "Contact: " -#define WHERE "Where: " -#define FTP "FTP: " - -void usage(char *callname) - - { - fprintf(stderr,"Describe %s\n",_VERSION_); - fprintf(stderr,"usage: %s -[v] \n",callname); - exit(0); - } - -void myprintf(char *string, int wordwrap_size) - - { - int length = 0; - char *headString, *tailString; - - headString = tailString = string; - printf("\n"); - while (1) - - { - tailString++; length++; - if (*tailString == '\0') - - { - printf("%s",headString); - return; - } - - else if (length == wordwrap_size) - - { - while (*tailString != ' ') - tailString--; - *tailString = '\0'; - printf("%s\n",headString); - headString = tailString+1; - length = 0; - } - - } - - } - -void print_entry(FILE *FInPtr, long int index) - - { - char *buffer; - - buffer = (char *) malloc (1024); - - fseek(FInPtr,index,SEEK_SET); - - printf("%s",VERSION); - fgets(buffer,80,FInPtr); - printf("%s",buffer); - - printf("%s",AUTHOR); - fgets(buffer,80,FInPtr); - printf("%s",buffer); - - printf("%s",CONTACT); - fgets(buffer,80,FInPtr); - printf("%s",buffer); - - printf("%s",WHERE); - fgets(buffer,80,FInPtr); - printf("%s",buffer); - - printf("%s",FTP); - fgets(buffer,80,FInPtr); - printf("%s",buffer); - - fgets(buffer,1024,FInPtr); - myprintf(buffer,75); - - free(buffer); + fseek(FInPtr,index,SEEK_SET); + + printf("%s",VERSION); + fgets(buffer,MAX_LINE_LENGTH,FInPtr); + printf("%s",buffer); + + printf("%s",AUTHOR); + fgets(buffer,MAX_LINE_LENGTH,FInPtr); + printf("%s",buffer); + + printf("%s",CONTACT); + fgets(buffer,MAX_LINE_LENGTH,FInPtr); + printf("%s",buffer); + + printf("%s",WHERE); + fgets(buffer,MAX_LINE_LENGTH,FInPtr); + printf("%s",buffer); + + printf("%s",FTP); + fgets(buffer,MAX_LINE_LENGTH,FInPtr); + printf("%s",buffer); + + fgets(buffer,1024,FInPtr); + myprintf(buffer,75); + + free(buffer); #ifdef STACK_CHECK - printf("Stack: %d\n",end_stack_check()); + printf("Stack: %d\n",end_stack_check()); #endif - exit(0); - } - -int main (int argc, char **argv) - - { - FILE *FInPtr; - char searchName[34]; - long int index; - int verbose, argind, numOfEntries, cmp, offset1, offset2, check, i; - nameEntry nameStruct; + exit(0); +} +int main (int argc, char **argv) { + FILE *FInPtr; + char searchName[NAME_LEN]; + int2 verbose, numOfEntries, cmp, offset1, offset2, check, i; + nameEntry nameStruct; + int c, errflag; + char *p; + #ifdef STACK_CHECK - begin_stack_check(); + begin_stack_check(); #endif - verbose = FALSE; - argind = 1; + verbose = FALSE; + Vflag = FALSE; + errflag = FALSE; - if ((argc == 3) && (!strcmp(argv[1],"-v"))) - - { + while ((c = getopt(argc,argv,"hvV")) != EOF) { + switch (c) { + case 'v': verbose = TRUE; - argind++; + break; + case 'V': + version(basename(argv[0])); + break; + case 'h': + default: + errflag = TRUE; + break; + } + } + if (errflag || (argc-optind != 1)) + usage(basename(argv[0])); + + + if ((FInPtr = fopen(DATABASE,"r")) == NULL) { + perror("couldn't open database"); + exit(-1); + } + fread(&numOfEntries,2,1,FInPtr); + offset1 = 0; + offset2 = numOfEntries-1; + + strcpy(searchName,argv[optind]); + i=0; + p = searchName; + while (*p) { + *p = tolower(*p); + p++; + } + + if (verbose) + printf("Searching...\n"); + + while (1) { + check = ((offset2-offset1)/2) + offset1; + fseek(FInPtr,2+(check*sizeof(nameEntry)),SEEK_SET); + fread(&nameStruct,sizeof(nameEntry),1,FInPtr); + + cmp = strcmp(nameStruct.name,searchName); + + if (verbose) + printf(" checked %s\n",nameStruct.name); + + if (cmp > 0) { + offset2 = check-1; + } else if (cmp < 0) { + offset1 = check+1; + } else { + if (verbose) { + printf("Found entry %s!\n",searchName); +#ifdef STACK_CHECK + printf("Stack: %d\n",end_stack_check()); +#endif + exit(0); } - else if (argc != 2) - usage(argv[0]); + printf("%s%s\n",NAME,searchName); + print_entry(FInPtr,nameStruct.offset); + } - FInPtr = fopen(INFILE,"r"); - fread(&numOfEntries,2,1,FInPtr); - offset1 = 0; - offset2 = numOfEntries-1; - - strcpy(searchName,argv[argind]); - i=0; - while(searchName[i] = tolower(searchName[i++])); - - if (verbose) - printf("Searching...\n"); - - while (1) - - { - check = ((offset2-offset1)/2) + offset1; - fseek(FInPtr,2+(check*sizeof(nameEntry)),SEEK_SET); - fread(&nameStruct,sizeof(nameEntry),1,FInPtr); - - cmp = strcmp(nameStruct.name,searchName); - - if (verbose) - printf(" checked %s\n",nameStruct.name); - - if (cmp > 0) - offset2 = check-1; - - else if (cmp < 0) - offset1 = check+1; - - else - - { - if (verbose) - - { - printf("Found entry %s!\n",searchName); - exit(0); - } - - printf("%s%s\n",NAME,searchName); - print_entry(FInPtr,nameStruct.offset); - } - - if (offset1 > offset2) - - { - printf("Entry '%s' not found in describe database.\n",searchName); - exit(1); - } - - } - - } + if (offset1 > offset2) { + printf("Entry '%s' not found in describe database.\n",searchName); +#ifdef STACK_CHECK + printf("Stack: %d\n",end_stack_check()); +#endif + exit(1); + } + } +} diff --git a/usr.orca.bin/describe/describe.source b/usr.orca.bin/describe/describe.source index 6800485..5fc58e7 100644 --- a/usr.orca.bin/describe/describe.source +++ b/usr.orca.bin/describe/describe.source @@ -1,6 +1,6 @@ -#=============================================================================== -# List of shell applications for GNO/ME Last revision: 11/2/93 -#=============================================================================== +#============================================================================= +# List of shell applications for GNO/ME Last revision: 07 May 95 +#============================================================================= # # About this file # ~~~~~~~~~~~~~~~ @@ -11,12 +11,18 @@ # sure the directory structure '/usr/local/lib/' exists first! Information # may be later culled from the file with the command 'describe '. # +# While this file may be updated manually, new entries and updates may +# also be merged through the use of 'descu'. +# +# This file is sorted lexicographically based on the Name field. This +# means that any names starting with capital letters will appear before +# those starting with lower case letters. +# # Send additions/corrections to: # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # James Brookes # -# jamesb@ecst.csuchico.edu <-- Preferred -# bb252@cleveland.freenet.edu +# jamesb@ecst.csuchico.edu # # To obtain the version number of a file: # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -24,9 +30,18 @@ # B) any usage or -v/V flag supplied by the utility author # # -# NB: "Author" may mean who is maintaing the current port, and may not actually -# mean the original author of the program. -#=============================================================================== +# NB: "Author" may mean who is maintaing the current port, and may not +# actually mean the original author of the program. +#============================================================================== + +Name: DRWM +Version: 2.01 +Author: Dave J. Roberts +Contact: dave@mary.iia.org +Where: /usr/X/bin +FTP: ftp.cco.caltech.edu, grind.isca.uiowa.edu + +Davis Rex Window Manager. A window manager for GNO. Name: argv0 Version: 1.0 @@ -49,6 +64,28 @@ FTP: ... most options--including underline, boldface, margins, centering--on all terminal types. +Name: bc +Version: 1.01 +Author: Frank Petroski +Contact: +Where: /usr/bin +FTP: ftp.cco.caltech.edu + +GNU bc is an arbitrary precision numeric processing language. Syntax is +similar to C, but differs in many substantial areas. It supports +interactive execution of statements. bc is a utility included in the +POSIX P1003.2/D11 draft standard. Copyright Free Software Foundation. + +Name: bed +Version: 1.1.1 +Author: Phil Vandry +Contact: vandry@cam.org +Where: /usr/local/bin +FTP: grind.isca.uiowa.edu + +A binary editor that can handle "infinitely" long lines and null bytes +in the file. Intended for editing binary files. + Name: binprint Version: 1.2 Author: Phillip Vandry @@ -59,19 +96,19 @@ FTP: Prints a hex dump of files or standard in Name: bison -Version: 1.03 +Version: 1.19 Author: Soenke Behrens -Contact: behrenss@informatik.tu-muenchen.de +Contact: schaf@meadow.muc.de Where: /usr/local/bin FTP: ... - A port of the FSF's yacc replacement. bison is part of the GNU project. yacc -is a parser generator (also known as "compiler compiler"). + A port of the FSF's yacc replacement. bison is part of the GNU project. +yacc is a parser generator (also known as "compiler compiler"). Name: booz Version: 2.0 Author: Soenke Behrens -Contact: behrenss@informatik.tu-muenchen.de +Contact: schaf@meadow.muc.de Where: /usr/local/bin FTP: ... @@ -87,34 +124,35 @@ FTP: Prints a calendar for the current month or any month. Name: calls -Version: 2.0 -Author: Devin Reade -Contact: glyn@cs.ualberta.ca, glyn@ersys.edm.ab.ca -Where: ?? -FTP: cco.caltech.edu and grind.isca.uiowa.edu. +Version: 2.0 (16 Dec 93) +Author: Ported by Devin Reade +Contact: gdr@myrias.ab.ca +Where: /usr/local/bin +FTP: ftp.cco.caltech.edu, grind.isca.uiowa.edu. A call chart generator, to show the sequence and calling dependancies of functions within a program. It's more flexible than Orca shell version. Requires cpp. -Name: cc -Version: 1.06 +Name: cclean +Version: 1.02 Author: Soenke Behrens -Contact: behrenss@informatik.tu-muenchen.de +Contact: sbehrens@contech.demon.co.uk Where: /usr/local/bin -FTP: ... +FTP: ftp.cco.caltech.edu, grind.isca.uiowa.edu - Unixish front-end for ORCA/C. Particularly useful in combination with dmake. + For use with occ. Remove the lines ccprep put into a source file from that +source file. Part of the occ 1.12 distribution. Name: ccprep -Version: 1.01 +Version: 1.1 Author: Soenke Behrens -Contact: behrenss@informatik.tu-muenchen.de +Contact: sbehrens@contech.demon.co.uk Where: /usr/local/bin -FTP: ... +FTP: ftp.cco.caltech.edu, grind.isca.uiowa.edu - For use with cc. Allows the use of a kludge file for specifying #pragma -statements from the command line. + For use with occ. Puts a "#line 2" statement into source files to +get around problems with occ 1.12 and ORCA/C 2.03. Name: chat Version: 1.0 @@ -155,6 +193,15 @@ FTP: ... Runs certain processes at certain times. cron is started by init. +Name: cu +Version: 1.0 +Author: Dave J. Roberts +Contact: daver@interactive.net +Where: /usr/local/bin +FTP: + +A simple dialup utility. + Name: date Version: 1.2 Author: Phillip Vandry @@ -165,25 +212,34 @@ FTP: ... Shows the date and time (optionally, continuously). Name: descc -Version: 1.0 +Version: 1.0.1 Author: James Brookes Contact: jamesb@ecst.csuchico.edu -Where: /usr/local/bin -FTP: ... +Where: /usr/sbin +FTP: ftp.cco.caltech.edu Compile a source file into a 'describe' database file. Name: describe -Version: 1.0 +Version: 1.0.1 Author: James Brookes Contact: jamesb@ecst.csuchico.edu Where: /usr/local/bin -FTP: ... +FTP: ftp.cco.caltech.edu Print a multi-line description obtained from the compiled 'describe' database; giving utility name, version, author, author's contact, where the utility is, as well as where the utility can be FTPd from on the InterNet. +Name: descu +Version: 1.0 +Author: Devin Reade +Contact: gdr@myrias.ab.ca +Where: /usr/sbin +FTP: ftp.cco.caltech.edu + + Update a 'describe' source file. + Name: dial Version: 1.0 Author: Phillip Vandry @@ -204,14 +260,35 @@ FTP: ... Run from inittab to handle modems on dialup lines. Name: dmake -Version: 0.4.3b (17 Jan 94) -Author: Devin Reade. -Contact: , -Where: /usr/bin -FTP: cco.caltech.edu,grind.isca.uiowa.edu. +Version: 1.0 (4 Jul 94) +Author: Ported by Devin Reade. +Contact: gdr@myrias.ab.ca +Where: /usr/local/bin +FTP: ftp.cco.caltech.edu, grind.isca.uiowa.edu. A Unix-style make utility for automated compilation. +Name: dsort +Version: 1.0 (14 Jun 94) +Author: Devin Reade. +Contact: gdr@myrias.ab.ca +Where: /usr/local/bin +FTP: ftp.cco.caltech.edu, grind.isca.uiowa.edu (in file sorts10.shk) + + Sort a text file on disk lexicographically. Archived together +with msort. + +Name: dsplit +Version: 1.0 (19 Dec 93) +Author: Ported by Devin Reade. +Contact: gdr@myrias.ab.ca +Where: /usr/local/bin +FTP: ftp.cco.caltech.edu, grind.isca.uiowa.edu + + A file splitter, with a default output size of 811520 bytes, suitable +for 800k 3.5" floppies. It will work with any type of regular (no +resource fork) file. + Name: eps Version: 1.0 Author: James Brookes @@ -231,30 +308,52 @@ FTP: Evaluates matehmatical expressions; prints result in normal and scientific notation. Uses C like syntax. +Name: finger +Version: 1.1 +Author: Leslie M. Barstow III +Contact: wdphoenix@delphi.com +Where: /usr/bin +FTP: ... + +finger is a re-write of the UNIX finger utility. Its purpose is to provide +information about a user or users. It shows their real name, home directory, +default shell, last login time, and two files that they may create to provide +further information. + Name: flex Version: 2.38 Author: Soenke Behrens -Contact: berenss@informatik.tu-muenchen.de +Contact: schaf@meadow.muc.de Where: /usr/local/bin FTP: ... - A port of the FSF's lex replacement. flex is part of the GNU project. lex -is a tokenizer generator, to be used in conjunction with yacc. Note that due -to the way the FSF writes their code (yuck), flex has some problems with ints -being 16-bit instead of 32-bit on the GS. A version that fixes these problems -will be released as soon as the more annoying bugs are out of ORCA/C 2.0.1. + A port of the FSF's lex replacement. flex is part of the GNU project. +lex is a tokenizer generator, to be used in conjunction with yacc. Note +that due to the way the FSF writes their code (yuck), flex has some problems +with ints being 16-bit instead of 32-bit on the GS. A version that fixes +these problems will be released as soon as the more annoying bugs are out +of ORCA/C 2.0.1. Name: fmake Version: 1.0 Author: Felix Blank -Contact: behrenss@informatik.tu-muenchen.de +Contact: schaf@meadow.muc.de Where: /usr/local/bin FTP: ... fmake is Unixish make utility. It only understands a small subset of make commands, though, barely enough to maintain small projects. Written originally by Felix Blank, now "maintained" by Soenke Behrens. The need for this utility -will vanish with the advent of dmake. +vanished with the advent of dmake. + +Name: ftn +Version: 1.1 (11 Oct 94) +Author: Dave J. Roberts. Version 1.1 changes by Devin Reade. +Contact: daver@rush.cc.edu, droberts@chaos.bsu.edu +Where: /usr/local/bin +FTP: ftp.cco.caltech.edu, grind.isca.uiowa.edu + + A utility to display Apple's DTS File Type Notes. Name: getvers Version: 1.2 @@ -266,6 +365,16 @@ FTP: pindarus.cs.uiuc.edu Gets the rVersion information on a EXE, including name, version, and any other information the author wishes to include, printing it to standard out. +Name: gzip +Version: 1.2.4 (Gno) +Author: Joseph Lee +Contact: eaiu410@ea.oac.uci.edu +Where: /usr/local/bin +FTP: ftp.cco.caltech.edu, grind.isca.uiowa.edu + +GNU zip -- compress or expand files. Ported from the Free Software +Foundation's gzip. Also has functionality of gunzip and gzcat. + Name: init Version: 1.0 Author: Phillip Vandry @@ -286,25 +395,25 @@ FTP: ... syslogd (log daemon) Name: joinpara -Version: 1.0 +Version: 1.0 (16 Dec 93) Author: Devin Reade -Contact: glyn@cs.ualberta.ca, glyn@ersys.edm.ab.ca -Where: /usr/bin -FTP: cco.caltech.edu, grind.isca.uiowa.edu. +Contact: gdr@myrias.ab.ca +Where: /usr/local/bin +FTP: ftp.cco.caltech.edu, grind.isca.uiowa.edu. A filter to strip newlines from the middle of paragraphs, but not elsewhere. Written to ease the importing of text files into word processor documents. Name: last -Version: 1.0 +Version: 1.1 Author: Steve Reeves -Contact: reevess@cse.fau.edu +Contact: Internet: reevess@cse.fau.edu, GEnie: S.REEVES2 Where: /usr/bin FTP: grind.isca.uiowa.edu - last indicates last logins by user or terminal. It searches -through the login accounting file "/etc/wtmp" for this information. + Displays last logins for specified users or terminals. It searches +through the login accounting file "/var/adm/wtmp" for this information. It is only useful with GNO's Multi-User package. Name: machtype @@ -318,24 +427,33 @@ FTP: pindarus.cs.uiuc.edu memory, versions of GNO, GS/OS, and the ROM, accelerator type if any, and more. Name: makedmake -Version: 1.1.1 -Author: Devin Reade -Contact: , -Where: /usr/bin -FTP: cco.caltech.edu,grind.isca.uiowa.edu,pindarus.cs.uiuc.edu +Version: 1.1.1 (16 Jan 94) +Author: Ported by Devin Reade +Contact: gdr@myrias.ab.ca +Where: /usr/local/bin +FTP: ftp.cco.caltech.edu, grind.isca.uiowa.edu. Calculates program dependencies and generates makefiles for dmake. This is a particularily brain-dead port that will likely be superceded. (By mkmf?) Suitable for simple dependancies. +Name: makewhatis +Version: 1.1 (29 May 94) +Author: Devin Reade. +Contact: gdr@myrias.ab.ca +Where: /usr/sbin +FTP: ftp.cco.caltech.edu, grind.isca.uiowa.edu + + Generates the whatis database used by apropos(1) and whatis(1). + Name: martian Version: ?? Author: Soenke Behrens -Contact: behrenss@informatik.tu-muenchen.de +Contact: schaf@meadow.muc.de Where: /usr/local/bin or /usr/local/games FTP: ... - Creates martian poetry in nroff format. The source is, alas, lost, it seems. + Creates martian poetry in nroff format. Name: mem Version: 1.2 @@ -346,6 +464,15 @@ FTP: ... Shows memory usage statistics in different formats. +Name: mkdir +Version: 1.2 +Author: James Brookes +Contact: jamesb@ecst.csuchico.edu +Where: /bin +FTP: ... + + Make a directory. + Name: mkfs Version: 1.0 Author: Phillip Vandry @@ -355,14 +482,15 @@ FTP: ... Formats or erases physical devices and creates file systems on them. -Name: mkdir -Version: 1.2 -Author: James Brookes -Contact: jamesb@ecst.csuchico.edu -Where: /bin -FTP: ... +Name: msort +Version: 1.0 (14 Jun 94) +Author: Devin Reade. +Contact: gdr@myrias.ab.ca +Where: /usr/local/bin +FTP: ftp.cco.caltech.edu, grind.isca.uiowa.edu (in file sorts10.shk) - Make a directory. + Sort a text file in memory lexicographically. Archived together +with dsort. Name: mugs Version: 3.0 @@ -395,6 +523,16 @@ FTP: ... Create a home directory with basic gshrc for new user, and add user to /var/adm/newuser/newusers file for validation by the system operator. +Name: occ +Version: 1.12 +Author: Soenke Behrens +Contact: sbehrens@contech.demon.co.uk +Where: /usr/local/bin +FTP: ftp.cco.caltech.edu, grind.isca.uiowa.edu + + Unixish front-end for ORCA/C. Particularly useful in combination with +dmake. Requires ORCA/C 2.0.3 (compiler version 2.0.2). + Name: parent Version: 1.0 Author: Phillip Vandry @@ -415,10 +553,28 @@ FTP: ... Based on talk, phone allows two users to interactively chat in a split-screen format. +Name: rdial +Version: 1.1 (28 Feb 95) +Author: Jeremy Rand. +Contact: +Where: /usr/local/bin +FTP: grind.isca.uiowa.edu + +Auto redial a system with a login script. + +Name: rmdir +Version: 1.0 (28 Nov 94) +Author: Devin Reade. +Contact: gdr@myrias.ab.ca +Where: /bin +FTP: ftp.cco.caltech.edu, grind.isca.uiowa.edu + + Remove empty directories. + Name: rndname Version: 4.0 Author: Soenke Behrens -Contact: behrenss@informatik.tu-muenchen.de +Contact: schaf@meadow.muc.de Where: /usr/local/bin or /usr/local/games FTP: ... @@ -435,6 +591,17 @@ FTP: ... Converts RTF (Rich Text Format) files to text. +Name: scpp +Version: 1.1 (15 Feb 94) +Author: Ported by Devin Reade +Contact: gdr@myrias.ab.ca +Where: /usr/bin +FTP: ftp.cco.caltech.edu, grind.isca.uiowa.edu. + + A selective C preprocessor. It will only interpret directives that it +is told to interpret. This makes scpp useful for making source files easier +to read by removing unnecessary code (such as that for other architectures). + Name: sendmail Version: 1.1 Author: Phillip Vandry @@ -473,30 +640,59 @@ FTP: ... Causes GS/OS to commit all pending data to disk. -Name: timelimit -Version: 1.1 +Name: tee +Version: 1.1 (23 Nov 93) Author: Devin Reade -Contact: glyn@cs.ualberta.ca, glyn@ersys.edm.ab.ca +Contact: gdr@myrias.ab.ca +Where: /bin +FTP: ftp.cco.caltech.edu, grind.isca.uiowa.edu. + + Pipe fitting: copies stdin to stdout while making copies of the stream +in one or more text files. + +Name: timelimit +Version: 1.1 (16 Dec 93) +Author: Ported by Devin Reade +Contact: gdr@myrias.ab.ca Where: /usr/bin -FTP: cco.caltech.edu, grind.isca.uiowa.edu. +FTP: ftp.cco.caltech.edu, grind.isca.uiowa.edu. Limits the run time of a process; when the time is up, it sends the specified process a series of SIGINTs. -Name: udl -Version: 1.03 -Author: Soenke Behrens -Contact: behrenss@informatik.tu-muenchen.de +Name: tn +Version: 1.1 (11 Oct 94) +Author: Dave J. Roberts. Version 1.1 changes by Devin Reade. +Contact: daver@rush.cc.edu, droberts@chaos.bsu.edu Where: /usr/local/bin -FTP: ... +FTP: ftp.cco.caltech.edu, grind.isca.uiowa.edu - Converts text between the CR, LF and CR/LF forms. Somewhat on the slow side, -so don't use it. + A utility to display Apple's DTS Technical Notes. + +Name: udl +Version: 1.14 +Author: Soenke Behrens, Devin Reade +Contact: sbehrens@contech.demon.co.uk, gdr@myrias.ab.ca +Where: /usr/local/bin +FTP: ftp.cco.caltech.edu, grind.isca.uiowa.edu + + Converts text between the CR, LF and CR/LF forms. Also available for Unix +machines, reasonably fast yet secure. + +Name: uname +Version: 2.0.2 +Author: Ian Schmidt +Contact: irsman@drift.winternet.com +Where: /bin/ +FTP: grind.isca.uiowa.edu + + Prints the name of the UNIX system (in this case GNO/ME) plus various +other information such as your hostname if you are running the MU package. Name: unarj -Version: 2.41 +Version: 2.42 Author: Soenke Behrens -Contact: behrenss@informatik.tu-muenchen.de +Contact: schaf@meadow.muc.de Where: /usr/local/bin FTP: ... @@ -505,7 +701,7 @@ FTP: ... Name: unpp Version: 1.1 Author: Soenke Behrens -Contact: behrenss@informatik.tu-muenchen.de +Contact: schaf@meadow.muc.de Where: /usr/local/bin FTP: ... @@ -531,6 +727,16 @@ FTP: ... Keeps track of system load averages for the uptime utility over the last 1, 5 and 15 minutes. +Name: whereis +Version: v1.1 (2 Jan 93) +Author: v1.1 update by Devin Reade +Contact: gdr@myrias.ab.ca +Where: /usr/bin +FTP: ftp.cco.caltech.edu,grind.isca.uiowa.edu. + +whereis searches certain directories (/bin, /usr/bin, /usr/man, et cetera) and +reports the location of source, executables, and man pages. + Name: wrap Version: 1.1 Author: Phillip Vandry @@ -541,6 +747,27 @@ FTP: ... Word wraps text to a certain length (79 default). Also filters binary data and is very fast. +Name: write +Version: 2.1 +Author: Leslie M. Barstow III +Contact: wdphoenix@delphi.com +Where: /usr/bin +FTP: ... + +write is a simple utility which writes a message to a user, no matter what +terminal he or she is on. The format is: write username [message] +If you do not input a message, you will be prompted for message lines until +you enter a blank line. + +Name: xargs +Version: 0.9 (3 Mar 95) +Author: Jeremy Rand. +Contact: +Where: /usr/local/bin +FTP: grind.isca.uiowa.edu + +Pass parameters to a command through standard input. + Name: xbiff Version: 1.0 Author: James Brookes @@ -553,13 +780,28 @@ aurally and visibly when the user has mail. OA-clicking on the window's content region causes a title bar to appear, allowing the window to be moved. Name: xclock -Version: 1.0 -Author: James Brookes -Contact: jamesb@ecst.csuchico.edu -Where: */system/desk.accs/ -FTP: ... +Version: 1.12 +Author: Dave J. Roberts +Contact: dave@mary.iia.org +Where: /usr/X/bin +FTP: ftp.cco.caltech.edu, grind.isca.uiowa.edu + +graphical analog time display unit - XClock is an NDA analog clock, similar to xclock -analog under XWindows. -OA-clicking on the window's content region causes a title bar to appear, -allowing the window to be moved and/or resized. +Name: xlogin +Version: 2.21 +Author: Dave J. Roberts +Contact: dave@mary.iia.org +Where: /usr/X/bin +FTP: ftp.cco.caltech.edu, grind.isca.uiowa.edu + +Name: zsh +Version: 2.0 +Author: Leslie M. Barstow III +Contact: wdphoenix@delphi.com +Where: /bin +FTP: + +zsh is a program used to put a user's account in suspension. +It prints a message and then exits. diff --git a/usr.orca.bin/describe/descu.8 b/usr.orca.bin/describe/descu.8 new file mode 100644 index 0000000..a73b05c --- /dev/null +++ b/usr.orca.bin/describe/descu.8 @@ -0,0 +1,57 @@ +.TH DESCU 8 "System Administration" "7 May 1995" "Version 1.0" +.SH NAME +descu \- the describe(1) source updater +.SH SYNOPSIS +.BR descu " [" -hV ] +.I sourcefile +.I patchfile1 +[ +.IR patchfile2 " ..." +] +.SH DESCRIPTION +.BR descu +updates the describe source file +.I sourcefile +by applying the new and updated records from the \fIpatchfile\fRs +and prints the result to standard output. +.LP +.IR Patchfile s +are just one or more describe source entries as defined in +.BR descc (8). +(They have nothing to do with +.BR patch (1).) +.LP +.IR Patchfile s +are assumed to contain at most one entry (in all listed +.IR patchfile s) +for a given program, keyed on the +.BR Name: +field. If an entry in +.IR patchfile +is already in +.IR sourcefile , +it replaces the original; otherwise the entry is appended. In both +cases, the output is sorted lexicographically, based on the +.BR Name: +field. +.LP +.BR descu +will create the file +.B describe.rej +in the current directory. This contains all records that were removed +from +.IR sourcefile . +.SH OPTIONS +.nf +\fB-h\fR Show usage information. + +\fB-V\fR Show version information. +.fi +.SH AUTHOR +Devin Reade +.SH "SEE ALSO" +.BR apropos (1), +.BR describe (1), +.BR man (1), +.BR whatis (1), +.BR descc (8). diff --git a/usr.orca.bin/describe/descu.c b/usr.orca.bin/describe/descu.c new file mode 100644 index 0000000..ed93e12 --- /dev/null +++ b/usr.orca.bin/describe/descu.c @@ -0,0 +1,497 @@ +/* + * descu - describe(1) update utility for maintaining describe source files + * + * Usage: descu [-hV] sourcefile patchfile1 [patchfile2 ...] + * + * Options: + * -h show usage information and exit. + * -V show version information + * + * Copyright 1995 by Devin Reade for James Brookes' describe(1) utility. + * See the included README file and man page for details. + * + * $Id: descu.c,v 1.1 1996/01/22 01:38:05 gdr Exp $ + */ + +#pragma optimize -1 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "desc.h" + +#define _VERSION_ "v1.0.1" +#define MAX_BUFFER 65534 +#define SLOTS_QUANTUM 20 +#define REJECT_FILE "descu.rej" + +#ifndef __ORCAC__ +ssize_t read(int, void *, size_t); +#endif +char *strerror(int); +void convert (char *); + +char *versionStr = _VERSION_; +static char *header=NULL; /* comments before the first describe entry */ +static char *trailer=NULL; /* comments after the last describe entry */ + +short oflag; +short Vflag; +short errflag; + +descEntry **entryArray1=NULL; +descEntry **entryArray2=NULL; +int array1SlotsAlloced=0; +int array2SlotsAlloced=0; +int array1SlotsUsed=0; +int array2SlotsUsed=0; + +/* + * inhale - read file into buffer + * + * Pre: is the path name of the file to read in + * + * Post: returns a malloc'd NULL-terminated buffer containing the contents + * of file . On error, returns NULL and prints a suitable + * message. + * + * On the Apple IIgs, CR's are also converted to LF's + */ + +char *inhale (char *pathname) { + char *buffer; + long bytecount, bytes_read; + ssize_t i; + int fd; + + /* open the file */ + if ((fd = open(pathname,O_RDONLY))==-1) { + fprintf(stderr,"inhale: open of %s failed: %s\n", + pathname,strerror(errno)); + return NULL; + } + + /* create the buffer */ + bytecount = lseek(fd,(off_t) 0,SEEK_END); + if (bytecount > MAX_BUFFER) { + fprintf(stderr,"descu internal error: cannot handle files greater" + "than %d bytes\n due to a compiler bug. Sorry.\n", + MAX_BUFFER); + exit(-1); + } + lseek(fd,(off_t) 0, SEEK_SET); + if ((buffer = malloc(bytecount+1))==NULL) { + fprintf(stderr,"inhale: malloc of %ld-byte buffer failed for file %s:%s\n", + bytecount+1,pathname,strerror(errno)); + close(fd); + return NULL; + } + + /* read file into the buffer */ + bytes_read=0; + while (bytes_read < bytecount) { + i = read(fd,&buffer[bytes_read],(size_t)bytecount-bytes_read); + if (i==-1) { + fprintf(stderr,"inhale: read failed on file %s:%s\n", + pathname,strerror(errno)); + free(buffer); + close(fd); + return NULL; + } + bytes_read += i; + } + + /* clean up and return buffer */ + close(fd); + buffer[bytecount] = '\0'; + +#ifdef __ORCAC__ + /* convert CR to LF */ + { + char *p; + + for (p=buffer; *p ; p++) { + if (*p == 0x0D) *p = 0x0A; + } + } +#endif + + return buffer; +} + + +/* + * extract_info -- take a string buffer containing the describe information + * and return a malloc'd descEntry structure containing + * pointers into the buffer of the various parts. Also + * modifies the buffer so that there is a '\0' character + * between the parts. + */ + +descEntry *extract_info(char *source) { + + char *p; + descEntry *entry; + + if ((entry = malloc(sizeof(descEntry))) == NULL) { + perror("add_entry: couldn't allocate new entry"); + exit(1); + } + + /* extract out name */ + if (((entry->name = strstr(source,NAME_SHORT))==NULL) || + ((p = strchr(source,'\n'))==NULL)) { + fprintf(stderr,"bad or missing describe field: \"%s\"\n" + "describe entry is:\n%s\n",NAME,source); + free(entry); + return NULL; + } + + + /* extract out data */ + entry->data = p+1; + + /* terminate the name, dropping trailing space */ + do { --p; } while (isspace(*p)); + *(p+1) = '\0'; + + return entry; +} + + +/* + * add_entry -- add entry to the descTable, even if it already exists. + */ + +void add_entry(descEntry *entry, int initial_buffer) { + descEntry **e, ***array; + int *slotsAlloced, *slotsUsed; + + if (initial_buffer) { + array = &entryArray1; + slotsAlloced = &array1SlotsAlloced; + slotsUsed = &array1SlotsUsed; + } else { + array = &entryArray2; + slotsAlloced = &array2SlotsAlloced; + slotsUsed = &array2SlotsUsed; + } + + /* grow array if necessary */ + if (*slotsAlloced == *slotsUsed) { + *slotsAlloced += SLOTS_QUANTUM; + if (*array) { + e = realloc(*array,(*slotsAlloced) * sizeof(descEntry *)); + } else { + e = malloc((*slotsAlloced) * sizeof(descEntry *)); + } + if (e == NULL) { + perror("couldn't grow describe array"); + exit(1); + } + *array = e; + } + + /* add in the entry */ + (*array)[*slotsUsed] = entry; + (*slotsUsed)++; + return; +} + + +/* + * insert - insert all entries contained in buffer into the descTable. + * If initial_buffer is non-zero, then use any comments preceeding + * the first entry as the output file header, and any comments + * following the last entry as the output file trailer. If + * initial_buffer is zero, then the respective comment blocks are + * ignored, effectively deleting them from the output. + */ + +void insert(char *buffer, int initial_buffer) { + char *p, *q; + descEntry *entry; + + /* pull out the header (if nec) and init p */ + if (initial_buffer) header = buffer; + p = strstr(buffer,NAME_SHORT); + if(!p) return; /* buffer doesn't have any describe entries! */ + *(p-1)='\0'; + + /* add all but the last entry */ + while ((q=strstr(p+1,NAME_SHORT))!=NULL) { + *(q-1)='\0'; + entry = extract_info(p); + if (entry) add_entry(entry, initial_buffer); + p=q; + } + + /* extract out the trailer and add the last entry */ + if ((q = strstr(p,"\n#"))==NULL) { + if (initial_buffer) trailer=""; + } else { + if (initial_buffer) trailer=q+1; + *q = '\0'; + } + + entry = extract_info(p); + if (entry) add_entry(entry,initial_buffer); + return; +} + + +/* + * sortArray - do a heapsort on consisting of elements. + * The sort is based on the field array[i]->name, sorted + * lexicographically. + */ + +void sortArray(descEntry **array, int slotsUsed) { + + int l, j, ir, i; + descEntry *rra; + + if (slotsUsed==1) return; /* no need to sort one element */ + --array; /* fudge since the algorithm was designed */ + /* for a unit-indexing */ + + l = (slotsUsed>>1) + 1; + ir = slotsUsed; + + /* + * The index l will be decremented from its initial value down to 0 during + * the heap creation phase. Once it reaches 0, the index ir will be + * decremented from its initial value down to 0 during the heap selection + * phase. + */ + for (;;) { + if (l > 1) /* still in creation phase */ + rra = array[--l]; + else { /* in selection phase */ + rra= array[ir]; /* clear a space at the end of array */ + array[ir] = array[1]; /* retire the top of the heap into it */ + if (--ir == 1) { /* done with the last promotion */ + array[1] = rra; + return; + } + } + i = l; /* set up to sift down element rra to its proper place */ + j = l << 1; + while (j<=ir) { + if (jname,array[j+1]->name)<0)) ++j; + if (strcmp(rra->name,array[j]->name)<0) { /* demote rra */ + array[i] = array[j]; + i = j; + j += i; + } else j = ir + 1; /* this is rra's level; set j to terminate */ + } /* the sift-down */ + array[i] = rra; + } +} + + +/* + * ns_strcmp (no-space string compare) -- compare two strings, ignoring + * a leading NAME_SHORT and whitespace, and ignoring trailing + * whitespace. + * + * Returns zero if strings are equal, -1 if ab. + * The following are therefore equal: + * "Name: test " + * "Name: test " + * The following are inequal: + * "Name: one" + * "Name: One" + */ + +int ns_strcmp (char *a, char *b) { + char *p; + size_t len; + + /* strip NAME_SHORT and leading space */ + len = strlen(NAME_SHORT); + a+=len; + b+=len; + while (isspace(*a)) a++; + while (isspace(*b)) b++; + + /* strip trailing space */ + p = a + strlen(a); + do { + --p; + } while (isspace(*p)); + *(p+1) = '\0'; + + p = b + strlen(b); + do { + --p; + } while (isspace(*p)); + *(p+1) = '\0'; + + /* do the string comparison */ + while (*a && *b) { + if (*a < *b) return -1; + if (*a > *b) return 1; + a++; b++; + } + if (*a == *b) return 0; + else if (*a) return -1; + else return 1; +} + + +void version (char *progName) { + fprintf(stderr, + "%s version %s Copyright 1995 Devin Reade\n" + "Freeware. See the manual page for copying restrictions.\n", + progName,versionStr); + return; +} + + +/* + * Usage -- print usage info and exit + */ + + +void usage(char *progName) { + + if (!Vflag || errflag) { + fprintf(stderr, + "%s -- describe(1) source update utility\n" + "Usage: %s [-hV] sourcefile patchfile1 [patchfile2 ...]\n" + "\t-h\tshow usage information\n" + "\t-V\tshow version information\n\n", + progName,progName); + } + version(progName); + exit(1); +} + +/* + * need I say it? + */ + +int main(int argc, char **argv) { + char *buffer; + int i, j; + FILE *outfp, *rejfp; + int c; + char *outputfile=NULL; + int compare; + +#ifdef STACK_CHECK + begin_stack_check(); +#endif + + /* initialize */ + errflag=0; + oflag=0; + + /* parse command line */ + while ((c=getopt(argc,argv,"ho:V"))!=EOF) { + switch (c) { + case 'o': + outputfile = optarg; + oflag++; + break; + + case 'V': + Vflag++; + break; + + case 'h': + default: + errflag++; + } + } + + /* error and exit if necessary */ + if (errflag || (argc-optind<2)) usage(basename(argv[0])); + + /* show version info */ + if (Vflag) version(basename(argv[0])); + + /* open output (if nec) and reject file */ + if (oflag) { + if ((outfp = fopen(outputfile,"w+"))==NULL) { + perror("main: couldn't open output file"); + exit(1); + } + } else { + outfp = stdout; + } + if ((rejfp = fopen(REJECT_FILE,"w+"))==NULL) { + perror("main: couldn't open rejects file"); + exit(1); + } + + /* read in original describe source file */ + buffer = inhale(argv[optind]); + insert(buffer,1); + + /* insert describe patch files */ + for (optind++; optindname, entryArray2[j]->name); + if (compare < 0) { + fprintf(outfp,"%s\n%s\n",entryArray1[i]->name,entryArray1[i]->data); + i++; + } else if (compare > 0) { + fprintf(outfp,"%s\n%s\n",entryArray2[j]->name,entryArray2[j]->data); + j++; + } else { + fprintf(rejfp,"%s\n%s\n",entryArray1[i]->name,entryArray1[i]->data); + fprintf(outfp,"%s\n%s\n",entryArray2[j]->name,entryArray2[j]->data); + i++; j++; + } + } + + /* second stage; print out remaining list */ + while (iname,entryArray1[i]->data); + i++; + } + while (jname,entryArray2[j]->data); + j++; + } + + /* print the trailer */ + fprintf(outfp,"%s",trailer); + + /* close the files and exit */ + fclose(rejfp); + if (oflag) fclose(outfp); + +#ifdef STACK_CHECK + fprintf(stderr,"stack usage: %d bytes\n",end_stack_check()); +#endif + + return 0; +} diff --git a/usr.orca.bin/describe/makefile.mk b/usr.orca.bin/describe/makefile.mk new file mode 100644 index 0000000..ba24de5 --- /dev/null +++ b/usr.orca.bin/describe/makefile.mk @@ -0,0 +1,49 @@ +# +# This is the makefile for the describe(1) package. It is for use +# with dmake(1). +# + +# Use -DSTACK_CHECK in CFLAGS to show stack usage. + +CFLAGS += -O -w -v -I/usr/include -s768 +LDFLAGS += -v +LDLIBS += -l/usr/lib/lgetopt -l/usr/lib/stack +BINDIR = /usr/local/bin +SBINDIR = /usr/sbin +MANDIR = /usr/man +INSTALL = /bin/cp + +build: describe descc descu + +descc: descc.o basename.o + @purge + $(CC) $(LDFLAGS) $< -o $@ $(LDLIBS) + +describe: describe.o basename.o + @purge + $(CC) $(LDFLAGS) $< -o $@ $(LDLIBS) + +descu: descu.o basename.o + @purge + $(CC) $(LDFLAGS) $< -o $@ $(LDLIBS) + +basename.o: basename.c + $(CC) -c $(CFLAGS) basename.c + +descc.o: descc.c desc.h + $(CC) -c $(CFLAGS) descc.c + +describe.o: describe.c desc.h + $(CC) -c $(CFLAGS) describe.c + +descu.o: descu.c desc.h + $(CC) -c $(CFLAGS) descu.c + +install: + $(RM) -f /usr/local/bin/descc + $(INSTALL) describe $(BINDIR) + $(INSTALL) descc $(SBINDIR) + $(INSTALL) descu $(SBINDIR) + $(INSTALL) describe.1 $(MANDIR)/man1 + $(INSTALL) descc.8 $(MANDIR)/man8 + $(INSTALL) descu.8 $(MANDIR)/man8 diff --git a/usr.orca.bin/describe/readme b/usr.orca.bin/describe/readme deleted file mode 100644 index dc8f8f1..0000000 --- a/usr.orca.bin/describe/readme +++ /dev/null @@ -1,31 +0,0 @@ -About Describe -~~~~~~~~~~~~~~ - First off: make sure the directory /usr/local/lib exists!!! - - This is yet another project I've been sitting on for a while, but have -finally decided to release. The basic idea of the 'describe' package -(the descc "compiler" and describe itself) is to provide a quick, easy -way of accessing information related to the utilities which so many -different people are releasing these days. The reason it sat around on -my harddrive so long is I was having qualms about its designated role in -life. I wasn't sure exactly what I wanted it to do. Well, I've decided -to KISS for now: descc simply compiles the utility list, which I maintain, -into a (very) simple "database" located in /usr/local/lib/. The companion -utility 'describe' is used to fetch information about a particular utility -from this "database". - - descc is fairly limited, as is the "database" format itself. Part of the -KISS (or it wouldn't be out now) design philosophy ;). Usage is simple: -when you get a new listing (I'll provide monthly updates), simply "descc -" where is the name of the newly released update. -descc will simply write over the old database and replace it with the -new (note: no appendages allowed). - - As always, coments are appreciated. And, moreso than on other projects, -I'd appreciate some comments about the direction I'm going in, suggestions -as to where to take this, etc. I have a feeling that some fields in the -format (eg, FTP:) are rather useless, and I'd like to know what you guys -out there think. - -James Brookes -jamesb@ecst.csuchico.edu