home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Professional / OS2PRO194.ISO / os2 / prgramer / unix / emx / test / sort.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-01-02  |  2.4 KB  |  106 lines

  1. /* sort.c (emx+gcc) */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6.  
  7. #define FALSE 0
  8. #define TRUE  1
  9.  
  10. static int qcmp (const void *p1, const void *p2)
  11. {
  12.   return (strcmp (*(char **)p1, *(char **)p2));
  13. }
  14.  
  15. static void usage (void)
  16. {
  17.   fputs ("Usage: sort [-c] [-v] [<input_file>]\n", stderr);
  18.   exit (1);
  19. }
  20.  
  21. static int elements;
  22. static int allocated;
  23. static char **vector;
  24.  
  25. int main (int argc, char *argv[])
  26. {
  27.   char buffer[512], *p;
  28.   char check, verbose;
  29.   FILE *f;
  30.   int i;
  31.  
  32.   check = verbose = FALSE;
  33.   for (i = 1; i < argc; ++i)
  34.     {
  35.       if (argv[i][0] != '-')
  36.         break;
  37.       if (strcmp (argv[i]+1, "c") == 0)
  38.         check = TRUE;
  39.       else if (strcmp (argv[i]+1, "v") == 0)
  40.         verbose = TRUE;
  41.       else
  42.         usage ();
  43.     }
  44.   if (i == argc)
  45.     f = stdin;
  46.   else if (i+1 == argc)
  47.     {
  48.       f = fopen (argv[i], "rt");
  49.       if (f == NULL)
  50.         {
  51.           fputs ("Cannot open input file\n", stderr);
  52.           return (1);
  53.         }
  54.     }
  55.   else
  56.     usage();
  57.   elements = 0; allocated = 0; vector = NULL;
  58.   while (!feof (f))
  59.     {
  60.       if (fgets (buffer, sizeof (buffer), f) == NULL)
  61.         break;
  62.       p = strchr (buffer, '\n');
  63.       if (p != NULL) *p = 0;
  64.       if (elements >= allocated)
  65.         {
  66.           allocated += 1000;
  67.           vector = (char **)realloc (vector, allocated * sizeof (char *));
  68.           if (vector == NULL)
  69.             {
  70.               fputs ("Out of memory\n", stderr);
  71.               return (2);
  72.             }
  73.         }
  74.       p = strdup (buffer);
  75.       if (p == NULL)
  76.         {
  77.           fputs ("Out of memory\n", stderr);
  78.           return (2);
  79.         }
  80.       vector[elements++] = p;
  81.     }
  82.   if (ferror (f))
  83.     {
  84.       fputs ("Error reading input file\n", stderr);
  85.       return (2);
  86.     }
  87.   if (verbose)
  88.     fprintf (stderr, "%d line%s read\n", elements, (elements == 1 ? "" : "s"));
  89.   qsort (vector, elements, sizeof (char *), qcmp);
  90.   for (i = 0; i < elements; ++i)
  91.     if (puts (vector[i]) == EOF)
  92.       {
  93.         fputs ("Error writing output file\n", stderr);
  94.         return (2);
  95.       }
  96.   if (check)
  97.     {
  98.       for (i = 1; i < elements; ++i)
  99.         if (strcmp (vector[i-1], vector[i]) > 0)
  100.           fprintf (stderr, "Internal error, i=%d\n", i);
  101.       if (verbose)
  102.         fputs ("OK\n", stderr);
  103.     }
  104.   return (0);
  105. }
  106.