home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 14 / CD_ASCQ_14_0694.iso / maj / 653 / dossort.c < prev    next >
C/C++ Source or Header  |  1994-04-03  |  3KB  |  119 lines

  1. /*
  2.  
  3.     cl /AL sortit.c
  4.  
  5. ===========================================================
  6.    sort.c       7-31-91  Robert Mashlan
  7.  
  8.    This filter is almost compatible with the MS-DOS filter of the same name.
  9.  
  10.    This filter sorts each line of standard input, disregarding case,
  11.    and sends it to standard output.
  12.  
  13.    optional parameters:  /R    Output in reverse order
  14.                          /+n   Compare at column n, 1 based
  15.  
  16.    example usage:  sort < unsorted.txt > sorted.txt
  17.  
  18.    note: compile in a far data model for maximum capacity ( compact or large )
  19.  
  20. */
  21.  
  22. #include <stdlib.h>
  23. #include <stdio.h>
  24. #include <string.h>
  25.  
  26. #define MAXLINES 10000        /* maximum number of lines to sort */
  27. #define MAXLINE  80           /* maximum line length             */
  28.  
  29. unsigned col     = 0;  /* column to start sort at ( zero based here ) */
  30. int      reverse = 0;  /* reverse order flag                          */
  31.  
  32. /*
  33. **  compare function for qsort
  34. */
  35.  
  36. int cmp( const void *a, const void *b)
  37. {
  38.       int result;
  39.       const char *_a = *(const char **)a;
  40.       const char *_b = *(const char **)b;
  41.  
  42.       /* compare at col if other than zero */
  43.  
  44.       if (col > 0)
  45.       {
  46.             if (strlen(_a) > col)
  47.                   _a += col;
  48.             else  _a = "";
  49.             if (strlen(_b) > col)
  50.                   _b += col;
  51.             else  _b = "";
  52.       }
  53.       result = stricmp(_a,_b);
  54.       return reverse ? -result : result;
  55. }
  56.  
  57. int main(int argc, char *argv[])
  58. {
  59.       static char *lines[MAXLINES];
  60.       int i, nlines=0, no_match;
  61.       char buf[MAXLINE];
  62.  
  63.       /* scan for command line options */
  64.  
  65.       for(i=1;i<argc;i++)
  66.       {
  67.             if(!stricmp(argv[i],"/R"))  /* reverse order option */
  68.                   reverse=1;
  69.             else if (!strnicmp(argv[i],"/+",2))  /* column number option */
  70.             {
  71.                   col=atoi(argv[i]+1)-1;
  72.                   if (col<0)
  73.                         col=0;
  74.             }
  75.             else
  76.             {
  77.                   fputs("Invalid Parameter",stderr);
  78.                   return 1;
  79.             }
  80.       }
  81.       while(1)
  82.       {
  83.             /* read the line */
  84.  
  85.             if(fgets(buf,MAXLINE,stdin)==NULL)
  86.                   break;
  87.  
  88.             /* Check for duplicates here */
  89.  
  90.             no_match = 1;
  91.             for ( i=0; i< nlines; i++ )
  92.             {
  93.                   if (0 == (no_match = memicmp(buf, lines[i],
  94.                         (unsigned int)12)))
  95.                   {
  96.                         break;
  97.                   }
  98.             }
  99.  
  100.             if (no_match)                 /* make a duplicate on the heap */
  101.             {
  102.                   if((lines[nlines++]=strdup(buf))==NULL)
  103.                   {
  104.                         fputs("SORT: Insufficent memory",stderr);
  105.                         return 2;
  106.                   }
  107.             }
  108.       }
  109.       /* sort the lot */
  110.       
  111.       qsort((void *)lines,nlines,sizeof(char *),cmp);
  112.  
  113.       /* display the sorted output */
  114.       
  115.       for (i=0;i<nlines;i++)
  116.             fputs(lines[i],stdout); /* send it to standard output */
  117.       return 0;
  118. }
  119.