home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-387-Vol-3of3.iso / d / djdev108.zip / SAMPLES / SORT / SORT.CC
C/C++ Source or Header  |  1992-07-06  |  3KB  |  151 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. typedef struct ENTRY {
  6.   ENTRY *before, *after;
  7.   ENTRY *same;
  8.   unsigned char *line;
  9.   unsigned char *sort_ptr;
  10.   ENTRY();
  11.   ~ENTRY();
  12. };
  13.  
  14. ENTRY::ENTRY()
  15. {
  16.   before = after = same = 0;
  17.   line = sort_ptr = 0;
  18. }
  19.  
  20. ENTRY::~ENTRY()
  21. {
  22.   if (before) delete before;
  23.   if (after) delete after;
  24.   if (same) delete same;
  25.   if (line) delete line;
  26. }
  27.  
  28. int column_flag = 0;
  29. int uniq_flag = 0;
  30. int num_flag = 0;
  31. int rev_flag = 0;
  32. ENTRY *eroot=0;
  33.  
  34. void read_one_data(unsigned char *s)
  35. {
  36.   ENTRY *e, **eptr;
  37.  
  38.   e = new ENTRY;
  39.   e->line = strdup(s);
  40.   e->sort_ptr = e->line;
  41.   for (int i=0; i<column_flag; i++)
  42.   {
  43.     while ((*e->sort_ptr <= ' ') && *e->sort_ptr)
  44.       e->sort_ptr++;
  45.     while (*e->sort_ptr > ' ')
  46.       e->sort_ptr++;
  47.     while ((*e->sort_ptr <= ' ') && *e->sort_ptr)
  48.       e->sort_ptr++;
  49.   }
  50.   
  51.   eptr = &eroot;
  52.   while (*eptr)
  53.   {
  54.     int cmp;
  55.     if (num_flag)
  56.       cmp = atoi(e->sort_ptr) - atoi((*eptr)->sort_ptr);
  57.     else
  58.       cmp = strcmp(e->sort_ptr, (*eptr)->sort_ptr);
  59.     if (cmp == 0)
  60.     {
  61.       while (*eptr)
  62.         eptr = &((*eptr)->same);
  63.       *eptr = e;
  64.       return;
  65.     }
  66.     else if (cmp < 0)
  67.     {
  68.       eptr = &((*eptr)->before);
  69.     }
  70.     else
  71.     {
  72.       eptr = &((*eptr)->after);
  73.     }
  74.   }
  75.   *eptr = e;
  76. }
  77.  
  78. void read_data(FILE *f)
  79. {
  80.   unsigned char buf[1024];
  81.   while (fgets(buf, 1024, f) != NULL)
  82.   {
  83.     buf[strlen(buf)-1] = 0;
  84.     read_one_data(buf);
  85.   }
  86. }
  87.  
  88. void print_data(ENTRY *e)
  89. {
  90.   if (!e) return;
  91.   if (rev_flag)
  92.     print_data(e->after);
  93.   else
  94.     print_data(e->before);
  95.   puts(e->line);
  96.   if (!uniq_flag)
  97.     print_data(e->same);
  98.   if (rev_flag)
  99.     print_data(e->before);
  100.   else
  101.     print_data(e->after);
  102. }
  103.  
  104. main(int argc, char **argv)
  105. {
  106.   int i;
  107.   while (argc > 1)
  108.   {
  109.     if (argv[1][0] == '+')
  110.     {
  111.       column_flag = atoi(argv[1]+1);
  112.       argc--;
  113.       argv++;
  114.     }
  115.     else if (argv[1][0] == '-')
  116.     {
  117.       switch (argv[1][1])
  118.       {
  119.         case 'u':
  120.           uniq_flag = 1;
  121.           break;
  122.         case 'n':
  123.           num_flag = 1;
  124.           break;
  125.         case 'r':
  126.           rev_flag = 1;
  127.           break;
  128.       }
  129.       argc--;
  130.       argv++;
  131.     }
  132.     else
  133.       break;
  134.   }
  135.   if (argc > 1)
  136.   {
  137.     FILE *f;
  138.     f = fopen(argv[1], "r");
  139.     if (!f)
  140.     {
  141.       printf("Can't open file %s\n", argv[1]);
  142.       exit(1);
  143.     }
  144.     read_data(f);
  145.     fclose(f);
  146.   }
  147.   else
  148.     read_data(stdin);
  149.   print_data(eroot);
  150. }
  151.