home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_100 / 143_01 / sortm.c < prev    next >
Text File  |  1985-11-14  |  5KB  |  254 lines

  1. /*
  2. %CC1 $1.C -X -E4300
  3. %CLINK $1 DIO  -S
  4. %DELETE    $1.CRL 
  5. */
  6. /*********************************************************************
  7. *                SORTM                     *
  8. **********************************************************************
  9. *           COPYRIGHT 1983 EUGENE H. MALLORY             *
  10. *********************************************************************/
  11.  
  12. #include "bdscio.h"
  13. #include "DIO.H"
  14.  
  15.  
  16. struct tnode
  17.     BEGIN
  18.     struct tnode *left;
  19.     struct tnode *right;
  20.     char text[MAXLINE];
  21.     END;
  22.         
  23. int nocase,reverse,col_pos,len;
  24. int bot,top,dif,try,next;
  25. int rctr,lctr;
  26. #ifdef C80
  27. FILE *fcb, fcb1;
  28. #else
  29. FILE fcb;
  30. #endif
  31.     
  32. main(argc,argv)
  33. char **argv;
  34. int argc;
  35.  
  36. BEGIN
  37.     
  38. int i,j,linectr;
  39. struct tnode *root,*space;
  40. char line_buf[MAXLINE],fname[MAXLINE];
  41. int ii,jj,optionerr;
  42. char *ss;
  43.  
  44. #ifdef C80
  45. fcb = &fcb1;
  46. #endif
  47.  
  48.     dioinit(&argc,argv);
  49.     
  50. /*********************************************************************
  51. ***          ARGUMENT PROCESSING                   ***
  52. *********************************************************************/
  53.  
  54.     nocase = reverse = col_pos = len = 0;
  55.  
  56.     optionerr = 0;
  57.     
  58.     for (ii=argc-1;ii>0;ii--)
  59.         if (argv[ii][0] == '-')
  60.         BEGIN
  61.             for    (ss = &argv[ii][1]; *ss    != '\0';)
  62.             BEGIN
  63.                 switch (toupper(*ss++))
  64.                 BEGIN
  65.                     case 'L':
  66.                     len = atoi(ss);
  67.                     break;
  68.                     case 'U':
  69.                     nocase = 1;
  70.                     break;
  71.                     case 'R':
  72.                     reverse    = 1;
  73.                     break;
  74.                     case 'C':
  75.                     col_pos    = atoi(ss);
  76.                     break;
  77.                     case 'H':
  78.                     optionerr = TRUE;
  79.                     break;
  80.                     default:
  81.                     typef("SORTM: Illegal option %c.\n"
  82.                         ,*--ss);
  83.                     ss++;
  84.                     optionerr = TRUE;
  85.                     break;
  86.                 END
  87.                 while (isdigit(*ss)) ss++;
  88.             END
  89.             for    (jj=ii;jj<(argc-1);jj++) argv[jj] = argv[jj+1];
  90.             argc--;
  91.         END
  92.     
  93.         
  94.     if (optionerr) 
  95.         BEGIN
  96.         typef("SORTM: Sorts files replacing original with result.\n");
  97.         typef("Ex. B:SORTM <filelist\nLegal options are:\n");
  98.         typef("-R   Reverse order sort.\n-U   Upper case compare.\n");
  99.         typef("-Cn  Column to begin compare.\n");
  100.         typef("-Ln  Length of string to    compare.\n");
  101.         exit(0);
  102.         END
  103.         
  104.     if (len == 0) len =    MAXLINE;
  105.     if (col_pos    > 0) col_pos--;
  106.     
  107. /*********************************************************************
  108. ***             END OF ARGUMENT PROCESSING               ***
  109. *********************************************************************/
  110.  
  111.     rsvstk(2000);
  112. #ifndef    C80
  113.     _allocp = NULL;
  114. #endif
  115.     
  116.     while (!getstring(fname))
  117.     BEGIN
  118.         root = NULL;
  119.         linectr = 0;
  120.         
  121.         fname[strlen(fname)-1] = 0;
  122.         if (fopen(fname,fcb) == ERROR)
  123.         THEN
  124.             typef("SORTM: Unable to open file %s.",fname);
  125.             bios(1);
  126.         END
  127.         
  128.         while (TRUE)
  129.         BEGIN
  130.             if (!fgets(line_buf,fcb)) break;
  131.             linectr++;
  132.             space = alloc(strlen(line_buf) + 1+2+2);
  133.             if (space == -1)
  134.             THEN
  135.                 typef("SORTM: Out of space at line %d.",linectr);
  136.                 exit(0);
  137.             END
  138.             strcpy(space->text,line_buf);
  139.             space->left    = NULL;
  140.             space->right = NULL;
  141.             rctr = lctr    = 0;
  142.             install(&root,&space,&root);
  143.         END
  144.         
  145.         fclose(fcb);
  146.         if (fcreat(fname,fcb) == ERROR)
  147.         THEN
  148.             typef("SORTM: Unable to create file    %s.",fname);
  149.             bios(1);
  150.         END
  151.         
  152.         if (root !=    NULL)
  153.         treeprint(root);
  154.         
  155.         putc(0x1A,fcb);
  156.         fflush(fcb);
  157.         fclose(fcb);
  158.         printf("%s\n",fname);
  159.     END
  160.     
  161.     dioflush();    
  162. END
  163.         
  164. install(nodeptr,spaceptr,rootptr)
  165. struct tnode **nodeptr,**spaceptr,**rootptr;
  166. BEGIN
  167. int state;
  168.     if (*nodeptr == NULL)
  169.     BEGIN
  170.         if (rctr ==    0 && lctr > 30)
  171.         BEGIN
  172.             (*spaceptr)->right = (*rootptr);
  173.             *rootptr = *spaceptr;
  174.         END
  175.         else if (lctr == 0 && rctr > 30)
  176.         BEGIN
  177.             (*spaceptr)->left =    (*rootptr);
  178.             *rootptr = *spaceptr;
  179.         END
  180.         else
  181.         BEGIN
  182.             *nodeptr = *spaceptr;
  183.         END
  184.         return;
  185.     END
  186.     else
  187.     BEGIN
  188.         state = str_comp((*nodeptr)->text,(*spaceptr)->text);
  189.         if (state >    0)
  190.         BEGIN
  191. left:             
  192.             lctr++;
  193.             install(&((*nodeptr)->left),spaceptr,rootptr);
  194.             return;
  195.         END
  196.         else
  197.         BEGIN
  198. right:              
  199.             rctr++;
  200.             install(&((*nodeptr)->right),spaceptr,rootptr);
  201.             return;
  202.         END
  203.     END
  204. END
  205.             
  206. treeprint(nodeptr)
  207. struct tnode *nodeptr;
  208. BEGIN
  209.     if (nodeptr->left != NULL)
  210.     treeprint(nodeptr->left);
  211.  
  212.     fputs(nodeptr->text,fcb);
  213.  
  214.     if (nodeptr->right != NULL)
  215.     treeprint(nodeptr->right);
  216.     free(nodeptr);
  217. END
  218.  
  219. int str_comp(s1,t1)
  220. char *s1,*t1;
  221. BEGIN
  222. int i,j;
  223.  
  224.     if ((strlen(s1) <= col_pos)    && (strlen(t1) <= col_pos)) return 0;
  225.     if (strlen(s1)<=col_pos) 
  226.     if (!reverse) return -1;
  227.     else return 1;
  228.     if (strlen(t1)<=col_pos) 
  229.     if (!reverse) return 1;
  230.     else return -1;
  231.     if (nocase)
  232.     BEGIN
  233.     for (i=col_pos;i<col_pos+len;i++)
  234.         BEGIN
  235.         if (toupper(s1[i]) != toupper(t1[i])) 
  236.             if (!reverse) return toupper(s1[i])-toupper(t1[i]);
  237.             else return toupper(t1[i])-toupper(s1[i]);
  238.         if (s1[i] == '\0')  return 0;
  239.         END
  240.     return 0;
  241.     END
  242.     else
  243.     BEGIN
  244.     for (i=col_pos;i<col_pos+len;i++)
  245.         BEGIN
  246.         if (s1[i] != t1[i]) 
  247.             if (!reverse) return s1[i] - t1[i];
  248.             else return t1[i]-s1[i];
  249.         if (s1[i] == '\0')  return 0;
  250.         END
  251.     return 0;
  252.     END
  253. END
  254.