home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Crawly Crypt Collection 1
/
crawlyvol1.bin
/
utility
/
misc
/
guideutl
/
stwmaker
/
stwmaker.c
next >
Wrap
C/C++ Source or Header
|
1994-01-23
|
3KB
|
168 lines
/* stwmaker - erzeugt eine Seite mit allen Stichworten aus dem Index
* written 22./23.01.1994 by Dirk Haun, Public Domain
*
* Vorgehensweise: Die Indexdatei wird eingelesen (read_file),
* ein Array mit Zeigern auf die einzelnen Zeilen
* aufgebaut (init_pointers). Anschließend werden
* die Zeilen sortiert und nach Buchstaben getrennt
* ausgegeben. That's all.
*
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#ifndef TRUE
# define TRUE (1)
# define FALSE (0)
#endif
#define MORELINES 256
int read_file(char *filename);
int cmp2(char **a,char **b);
int init_pointers(void);
unsigned char *mem, **array;
size_t len;
long maxlines, lines;
int main(int argc,char *argv[])
{
int ret, rest=FALSE;
char chr, newchr;
long i;
if(argc>1)
{
if(read_file(argv[1]))
{
if(init_pointers())
{
qsort(array,lines,sizeof(unsigned char*),cmp2);
printf("Stichwortverzeichnis\n"
"----------------------------------------------------------------------\n\n");
chr='A';
for(i=0;i<lines;i++)
if(toupper(array[i][1])>=chr) break;
if(i>0) rest=TRUE;
if(i<lines)
{
chr=toupper(array[i][1]);
printf(" %c...\n",chr);
for(;i<lines;i++)
{
newchr=toupper(array[i][1]);
if(newchr!=chr)
{
if(newchr<='Z')
{
chr=newchr;
printf("\n %c...\n",chr);
}
else
{
rest=TRUE;
break;
}
}
printf(" %s\n",array[i]);
}
if(rest) /* es gibt noch Einträge <'A' und/oder >'Z' */
{
printf("\n Sonstiges ...\n");
for(i=0;i<lines;i++)
{
chr=toupper(array[i][1]);
if(chr<'A' || chr>'Z') printf(" %s\n",array[i]);
}
}
}
fprintf(stderr,"stwmaker: Operation erfolgreich abgeschlossen.\n\n");
ret=0;
free(mem);
free(array);
}
else
{
fprintf(stderr,"stwmaker: Nicht genügend Speicher vorhanden.\n\n");
ret=3;
}
}
else
{
fprintf(stderr,"stwmaker: Fehler beim Lesen der Indexdatei.\n\n");
ret=2;
}
}
else
{
fprintf(stderr,"usage: stwmaker <indexdatei> [>ausgabedatei]\n\n");
ret=1;
}
return(ret);
}
int cmp2(char **a,char **b)
{
return(stricmp(*a,*b));
}
int init_pointers(void)
{
int ret=FALSE;
unsigned char *cp, *endadr;
long currlines;
maxlines=currlines=0L;
array=0L;
cp=mem;
endadr=mem+len;
while(cp<endadr)
{
while(*cp!=(unsigned char)'§' && cp<endadr) cp++;
if(cp<endadr)
{
if(maxlines<currlines+1)
{
array=(unsigned char**)realloc(array,(maxlines+MORELINES)*sizeof(unsigned char*));
if(array) maxlines+=MORELINES;
else break;
}
array[currlines]=cp;
currlines++;
}
while(*cp!=13 && *cp!=10 && cp<endadr) cp++;
*cp='\0'; /* Stringende */
}
if(cp>=endadr)
{
ret=TRUE;
lines=currlines;
}
return(ret);
}
int read_file(char *filename)
{
int fh, ret=FALSE;
fh=open(filename,O_RDONLY);
if(fh>0)
{
len=lseek(fh,0L,SEEK_END);
lseek(fh,0L,SEEK_SET);
if(len>0)
{
mem=malloc(len+2);
if(mem)
{
if(read(fh,mem,len)==len) ret=TRUE;
}
}
close(fh);
}
return(ret);
}