home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / utility / misc / guideutl / stwmaker / stwmaker.c next >
C/C++ Source or Header  |  1994-01-23  |  3KB  |  168 lines

  1. /* stwmaker - erzeugt eine Seite mit allen Stichworten aus dem Index
  2.  *            written 22./23.01.1994 by Dirk Haun, Public Domain
  3.  *
  4.  * Vorgehensweise: Die Indexdatei wird eingelesen (read_file),
  5.  *                 ein Array mit Zeigern auf die einzelnen Zeilen
  6.  *                 aufgebaut (init_pointers). Anschließend werden
  7.  *                 die Zeilen sortiert und nach Buchstaben getrennt
  8.  *                 ausgegeben. That's all.
  9.  *
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include <string.h>
  14. #include <stdlib.h>
  15. #include <ctype.h>
  16.  
  17. #ifndef TRUE
  18. # define TRUE        (1)
  19. # define FALSE       (0)
  20. #endif
  21.  
  22. #define MORELINES    256
  23.  
  24. int read_file(char *filename);
  25. int cmp2(char **a,char **b);
  26. int init_pointers(void);
  27.  
  28. unsigned char *mem, **array;
  29. size_t len;
  30. long maxlines, lines;
  31.  
  32. int main(int argc,char *argv[])
  33. {
  34.  int ret, rest=FALSE;
  35.  char chr, newchr;
  36.  long i;
  37.  
  38.  if(argc>1)
  39.  {
  40.   if(read_file(argv[1]))
  41.   {
  42.    if(init_pointers())
  43.    {
  44.     qsort(array,lines,sizeof(unsigned char*),cmp2);
  45.     printf("Stichwortverzeichnis\n"
  46.            "----------------------------------------------------------------------\n\n");
  47.     chr='A';
  48.     for(i=0;i<lines;i++)
  49.       if(toupper(array[i][1])>=chr) break;
  50.     if(i>0) rest=TRUE;
  51.     if(i<lines)
  52.     {
  53.      chr=toupper(array[i][1]);
  54.      printf(" %c...\n",chr);
  55.      for(;i<lines;i++)
  56.      {
  57.       newchr=toupper(array[i][1]);
  58.       if(newchr!=chr)
  59.       {
  60.        if(newchr<='Z')
  61.        {
  62.         chr=newchr;
  63.         printf("\n %c...\n",chr);
  64.        }
  65.        else
  66.        {
  67.         rest=TRUE;
  68.         break;
  69.        }
  70.       }
  71.       printf("    %s\n",array[i]);
  72.      }
  73.      if(rest) /* es gibt noch Einträge <'A' und/oder >'Z' */
  74.      {
  75.       printf("\n Sonstiges ...\n");
  76.       for(i=0;i<lines;i++)
  77.       {
  78.        chr=toupper(array[i][1]);
  79.        if(chr<'A' || chr>'Z') printf("    %s\n",array[i]);
  80.       }
  81.      }
  82.     }
  83.     fprintf(stderr,"stwmaker: Operation erfolgreich abgeschlossen.\n\n");
  84.     ret=0;
  85.     free(mem);
  86.     free(array);
  87.    }
  88.    else
  89.    {
  90.     fprintf(stderr,"stwmaker: Nicht genügend Speicher vorhanden.\n\n");
  91.     ret=3;
  92.    }
  93.   }
  94.   else 
  95.   {
  96.    fprintf(stderr,"stwmaker: Fehler beim Lesen der Indexdatei.\n\n");
  97.    ret=2;
  98.   }
  99.  }
  100.  else
  101.  {
  102.   fprintf(stderr,"usage: stwmaker <indexdatei> [>ausgabedatei]\n\n");
  103.   ret=1;
  104.  }
  105.  return(ret);
  106. }
  107.  
  108. int cmp2(char **a,char **b)
  109. {
  110.  return(stricmp(*a,*b));
  111. }
  112.  
  113. int init_pointers(void)
  114. {
  115.  int ret=FALSE;
  116.  unsigned char *cp, *endadr;
  117.  long currlines;
  118.  
  119.  maxlines=currlines=0L;
  120.  array=0L;
  121.  cp=mem;
  122.  endadr=mem+len;
  123.  while(cp<endadr)
  124.  {
  125.   while(*cp!=(unsigned char)'§' && cp<endadr) cp++;
  126.   if(cp<endadr)
  127.   {
  128.    if(maxlines<currlines+1)
  129.    {
  130.     array=(unsigned char**)realloc(array,(maxlines+MORELINES)*sizeof(unsigned char*));
  131.     if(array) maxlines+=MORELINES;
  132.     else break;
  133.    }
  134.    array[currlines]=cp;
  135.    currlines++;
  136.   }
  137.   while(*cp!=13 && *cp!=10 && cp<endadr) cp++;
  138.   *cp='\0'; /* Stringende */
  139.  }
  140.  if(cp>=endadr)
  141.  {
  142.   ret=TRUE;
  143.   lines=currlines;
  144.  }
  145.  return(ret);
  146. }
  147.  
  148. int read_file(char *filename)
  149. {
  150.  int fh, ret=FALSE;
  151.  
  152.  fh=open(filename,O_RDONLY);
  153.  if(fh>0)
  154.  {
  155.   len=lseek(fh,0L,SEEK_END);
  156.   lseek(fh,0L,SEEK_SET);
  157.   if(len>0)
  158.   {
  159.    mem=malloc(len+2);
  160.    if(mem)
  161.    {
  162.     if(read(fh,mem,len)==len) ret=TRUE;
  163.    }
  164.   }
  165.   close(fh);
  166.  }
  167.  return(ret);
  168. }