home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 4 / DATAFILE_PDCD4.iso / utilities / utilsp / psh / c / autoconv next >
Text File  |  1995-05-08  |  3KB  |  155 lines

  1. /* vi:tabstop=4:shiftwidth=4:smartindent
  2.  *
  3.  * autoconv.c - Add a command name to the list for automatic
  4.  *              uname() argument conversions.
  5.  */
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <ctype.h>
  10. #include <unistd.h>
  11. #include "psh.h"
  12.  
  13. struct    cmd_list
  14. {
  15.     char            *command;
  16.     struct cmd_list    *next;
  17. } *convs = NULL;
  18.  
  19. int sh_autoconv(int argc, char **argv)
  20. {
  21.     struct cmd_list    *ptr, *new, *old;
  22.  
  23.     if (argc == 1)
  24.     {
  25.         int    len = 0, i;
  26.  
  27.         printf("Commands for auto-conversion:\n");
  28.         for (ptr=convs; ptr!=NULL; ptr=ptr->next)
  29.         {
  30.             if ((i = strlen(ptr->command)) > len)
  31.             {
  32.                 len = i;
  33.             }
  34.         }
  35.         len = 8*((len+8)/8)-1;
  36.  
  37.         i = 0;
  38.         for (ptr=convs; ptr!=NULL; ptr=ptr->next)
  39.         {
  40.             printf("%-*s ", len, ptr->command);
  41.             if ((i+=len+1) > 79-len)
  42.             {
  43.                 putchar('\n');
  44.                 i = 0;
  45.             }
  46.         }
  47.         if (i)
  48.         {
  49.             putchar('\n');
  50.         }
  51.     }
  52.     else
  53.     {
  54.         while (++argv, --argc)
  55.         {
  56.             new = (struct cmd_list *) malloc(sizeof(struct cmd_list));
  57.             if (new == NULL)
  58.             {
  59.                 fprintf(stderr, "Out of memory!\n");
  60.                 return 0;
  61.             }
  62.             new->command = strdup(*argv);
  63.             if (new->command == NULL)
  64.             {
  65.                 fprintf(stderr, "Out of memory!\n");
  66.                 return 0;
  67.             }
  68.  
  69.             if ((convs == NULL) || (strcmp(convs->command, *argv) > 0))
  70.             {
  71.                 new->next = convs;
  72.                 convs = new;
  73.             }
  74.             else
  75.             {
  76.                 for (ptr = convs; 
  77.                         (ptr->next!=NULL) && (strcmp(ptr->command, *argv) < 0);
  78.                         ptr=ptr->next) old=ptr;
  79.  
  80.                 if (strcmp(ptr->command, *argv) == 0)
  81.                 {
  82.                     fprintf(stderr, "%s already in the list\n", *argv);
  83.                     free(new->command);
  84.                     free(new);
  85.                 }
  86.                 else
  87.                 {
  88.                     if (ptr->next == NULL)
  89.                     {
  90.                         new->next = NULL;
  91.                         ptr->next = new;
  92.                     }
  93.                     else
  94.                     {
  95.                         new->next = old->next;
  96.                         old->next = new;
  97.                     }
  98.                 }
  99.             }
  100.         }
  101.     }
  102.     return 0;
  103. }
  104.  
  105. char    *autoconv(char    *line)
  106. {
  107.     static char            new_line[MAXLEN];
  108.     char                *optr = new_line;
  109.     char                *iptr = line;
  110.     char                *sptr, tmp;
  111.     struct    cmd_list    *ptr;
  112.  
  113.     for (ptr=convs; ptr!=NULL; ptr=ptr->next)
  114.     {
  115.         if (!strncmp(line, ptr->command, strlen(ptr->command)))
  116.         {
  117.             break;
  118.         }
  119.     }
  120.  
  121.     if (ptr == NULL)
  122.     {
  123.         return line;
  124.     }
  125.  
  126.     while (!isspace(*iptr) && (*iptr != '\0'))
  127.     {
  128.         *optr++ = *iptr++;
  129.     }
  130.     while (*iptr != '\0')
  131.     {
  132.         while (isspace(*iptr))
  133.         {
  134.             *optr++ = *iptr++;
  135.         }
  136.         if (*iptr != '\0')
  137.         {
  138.             sptr = iptr;
  139.             while (!isspace(*iptr) && (*iptr != '\0'))
  140.             {
  141.                 iptr++;
  142.             }
  143.             tmp = *iptr;
  144.             *iptr = '\0';
  145.             strcpy(optr, __uname(sptr, 0));
  146.             *iptr = tmp;
  147.             optr += strlen(optr);
  148.         }
  149.     }
  150.     *optr = '\0';
  151.  
  152.     puts(new_line);
  153.     return new_line;
  154. }
  155.