home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 2 / DATAFILE_PDCD2.iso / utilities2 / unixlib36d / UnixLib36d / src / unix / c / uname < prev    next >
Encoding:
Text File  |  1994-03-08  |  5.4 KB  |  322 lines

  1. /* uname.c (c) Copyright 1990 H.Rogers */
  2.  
  3. #include <ctype.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6.  
  7. #include "sys/unix.h"
  8. #include "sys/param.h"
  9. #include "sys/os.h"
  10.  
  11. /* I know this is fucking incomprehensible code - it's fast. ;-) */
  12.  
  13. int __uname_dont_pack__ = 0;    /* SJC for CCP */
  14.  
  15. static char *__unbuf;        /* the name buffer */
  16.  
  17. /* __sdirseg(s1,&s2) checks s1 to see if it is a special directory name
  18.  * if it is, it copies the translation into s2, returning the next segment
  19.  * if not, it returns 0 */
  20.  
  21. static char *
  22. __sdirseg (register char *s1, char **s2_)
  23. {
  24.   register char *s2 = *s2_, *s3, *s4;
  25.   register int i, j;
  26.  
  27.   for (j = 0; j < MAXSDIR; j++)
  28.     {
  29.       if (!(s3 = __sdir[j].name))
  30.     break;
  31.       s3--, s4 = s1 - 1;
  32.       while (++s4, ((i = *++s3) && i == *s4));
  33.       if (!i && (!(i = *s4) || i == '/'))
  34.     {
  35.       s3 = __sdir[j].riscos_name;
  36.       while (*s2++ = *s3++);
  37.       s2--;
  38.       *s2_ = s2;
  39.       return (s4);
  40.     }
  41.     }
  42.   return (0);
  43. }
  44.  
  45. /* __sfixseg(s1) returns -1 if s1 is a special suffix, 0 if not */
  46.  
  47. static int
  48. __sfixseg (register char *s1)
  49. {
  50.   register char *s3, *s4;
  51.   register int i, j;
  52.  
  53.   for (j = 0; j < MAXSFIX; j++)
  54.     {
  55.       if (!(s3 = __sfix[j]))
  56.     break;
  57.       s3--, s4 = s1 - 1;
  58.       while (++s4, ((i = *++s3) && i == *s4));
  59.       if (!i && (!(i = *s4) || i == '/'))
  60.     return (-1);
  61.     }
  62.   return (0);
  63. }
  64.  
  65. #define MAXNAMLEN    10
  66.  
  67. char *
  68. __uname (char *name, int cflag)
  69. {
  70.   static char *_name;
  71.   register char *s1, *s2, *e1, *e2;
  72.   register int h, i, j, k;
  73.   int r[6];
  74.   char *s2_[1];
  75.  
  76.   if (!name)
  77.     return ("");
  78.  
  79.   if (!__unbuf)
  80.     if (!(__unbuf = malloc (MAXPATHLEN << 1)))
  81.       return (0);
  82.  
  83.   _name = (_name == __unbuf) ? (__unbuf + MAXPATHLEN) : __unbuf;
  84.  
  85.   s1 = name;
  86.   s2 = _name;
  87.  
  88.   if (!(k = *s1))
  89.     {
  90.       *s2++ = 0;
  91.       return (_name);
  92.     }
  93.  
  94.   if (k == '/')
  95.     s1++, i = s1[0];
  96.   else
  97.     i = k;
  98.  
  99.   h = s1[1];
  100.  
  101.   if (i == '$' || i == '@' || i == '%' || i == '^' || i == '&' || i == '\\')
  102.     {
  103.       while ((j = *s1++) && j != '/')
  104.     *s2++ = j;
  105.       s1--;
  106.       i = j;
  107.       k = '.';
  108.       goto main;
  109.     }
  110.  
  111.   if (i == ':' && h && h != '.' && h != ':')
  112.     {
  113.       *s2++ = ':';
  114.       *s2++ = h;
  115.       s1 += 2;
  116.       while ((j = *s1++) && j != '/')
  117.     *s2++ = j;
  118.       s1--;
  119.       i = j;
  120.       k = '.';
  121.       goto main;
  122.     }
  123.  
  124.   if (i && i != ':' && h)
  125.     {
  126.       e1 = s1;
  127.       while ((j = *++e1) && j != '/' && j != '.' && j != ':');
  128.       if (j == ':')
  129.     {
  130.       e1++;
  131.       while ((*s2++ = *s1), ++s1 < e1);
  132.       while ((j = *s1++) && j != '/')
  133.         *s2++ = j;
  134.       s1--;
  135.       i = j;
  136.       k = (s1 == e1) ? 0 : '.';
  137.       goto main;
  138.     }
  139.     }
  140.  
  141.   if (k != '/')
  142.     {
  143.       if (i == '.' && (!h || h == '/'))
  144.     {
  145.       *s2++ = '@';
  146.       s1 += 1;
  147.       i = h;
  148.       k = '.';
  149.     }
  150.       else
  151.     k = 0;
  152.       goto main;
  153.     }
  154.  
  155.   if (i == 'd' && h == 'e' && s1[2] == 'v' && s1[3] == '/')
  156.     {
  157.       s1 += 4;
  158.       while (*s2++ = *s1++);
  159.       s2[-1] = ':';
  160.       s2[0] = 0;
  161.       return (_name);
  162.     }
  163.  
  164.   if (i == 'u' && h == 's' && s1[2] == 'r' && s1[3] == '/' &&
  165.       (*s2_ = s2, e1 = __sdirseg (s1 + 4, s2_)))
  166.     {
  167.       s1 = e1;
  168.       s2 = *s2_;
  169.       i = *s1;
  170.       k = '.';
  171.       goto main;
  172.     }
  173.  
  174.   if (i == 'v' && h == 'a' && s1[2] == 'r' && s1[3] == '/' &&
  175.       (*s2_ = s2, e1 = __sdirseg (s1 + 4, s2_)))
  176.     {
  177.       s1 = e1;
  178.       s2 = *s2_;
  179.       i = *s1;
  180.       k = '.';
  181.       goto main;
  182.     }
  183.  
  184.   if (*s2_ = s2, e1 = __sdirseg (s1, s2_))
  185.     {
  186.       s1 = e1;
  187.       s2 = *s2_;
  188.       i = *s1;
  189.       k = '.';
  190.       goto main;
  191.     }
  192.  
  193.   *s2++ = '$';
  194.   k = '.';
  195.  
  196. main:
  197.  
  198.   if (i == '/')
  199.     {
  200.       while ((i = *++s1) == '/');
  201.       h = s1[1];
  202.     }
  203.  
  204.   if (i && k)
  205.     *s2++ = k;
  206.  
  207.   if (i)
  208.     for (;;)
  209.       {
  210.     if (i == '.' && (h == '/' || !h))
  211.       {
  212.         --s2;
  213.         s1 += 1;
  214.         goto loop;
  215.       }
  216.  
  217.     if (i == '.' && h == '.' && ((j = s1[2]) == '/' || !j))
  218.       {
  219.         *s2++ = '^';
  220.         s1 += 2;
  221.         goto loop;
  222.       }
  223.  
  224.     if (i == '<' && h)
  225.       {
  226.         e1 = s1;
  227.         while ((j = *++e1) && j != '>');
  228.         if (j == '>')
  229.           {
  230.         while ((*s2++ = *s1), ++s1 <= e1);
  231.         while ((j = *s1++) && j && j != '/')
  232.           *s2++ = j;
  233.         s1--;
  234.         goto loop;
  235.           }
  236.       }
  237.  
  238.     e1 = s1;
  239.     while ((i = *++e1) && i != '/' && i != '.');
  240.  
  241.     if (i == '.')
  242.       {
  243.         e2 = e1;
  244.         while ((j = *++e2) && j != '/')
  245.           if (j == '.')
  246.         e1 = e2;
  247.         if (e2 > ++e1 && __sfixseg (e1))
  248.           {
  249.         k = e2 - e1;
  250.         while ((*s2++ = *e1), ++e1 < e2);
  251.         if (cflag)
  252.           {
  253.             *s2 = 0;
  254.             if (!os_file (0x05, _name, r) && !r[0])
  255.               os_file (0x08, _name, r);
  256.           }
  257.         *s2++ = '.';
  258.         e1 -= k + 1;
  259.           }
  260.         else
  261.           {
  262.         register char *e3;
  263.  
  264.         e1--;
  265.         e3 = s1;
  266.         while ((*s2++ = *e3), ++e3 < e1);
  267.         *s2 = 0;
  268.         s2 -= (e1 - s1);
  269.         if (!os_file (0x05, _name, r) && r[0] == 2)
  270.           {
  271.             while ((j = *s1++) && j != '/')
  272.               *s2++ = j;
  273.             s1--;
  274.             goto loop;
  275.           }
  276.         e1 = e2;
  277.           }
  278.       }
  279.     else
  280.       e2 = e1;
  281.  
  282.     i = MAXNAMLEN;
  283.     j = (e1 - s1) - i;
  284.     while (s1 < e1 && i)
  285.       {
  286.         k = *s1++;
  287.         if (k == '.')
  288.           k = '/';
  289.         else if (k == '@' || k == '#' || k == '$' || k == '%' || k == '^' || \
  290.            k == '&' || k == '*' || k == ':' || k == '"' || !isgraph (k))
  291.           k = '_';
  292.         if (!__uname_dont_pack__ && j > 0 && i < MAXNAMLEN)
  293.           if (k == 'a' || k == 'e' || k == 'i' || k == 'o' || k == 'u')
  294.         {
  295.           j--;
  296.           continue;
  297.         }
  298.         *s2++ = k;
  299.         i--;
  300.       }
  301.     s1 = e2;
  302.  
  303.       loop:
  304.  
  305.     if ((i = *s1) == '/')
  306.       while ((i = *++s1) == '/');
  307.  
  308.     if (!i || (s2 - _name) > (MAXPATHLEN - MAXNAMLEN - 2))
  309.       break;
  310.  
  311.     h = s1[1];
  312.     *s2++ = '.';
  313.       }
  314.  
  315.   if ((s2 - _name) <= MAXPATHLEN)
  316.     *s2 = 0;
  317.   else
  318.     _name[MAXPATHLEN - 1] = 0;
  319.  
  320.   return (_name);
  321. }
  322.