home *** CD-ROM | disk | FTP | other *** search
/ RISC DISC 1 / RISC_DISC_1.iso / pd_share / code / unixlib / !UnixLib / src / unix / c / uname < prev    next >
Encoding:
Text File  |  1994-09-30  |  5.9 KB  |  345 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_control = 4;
  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. #define LONG_MAXNAMLEN       55
  67.  
  68. char *
  69. __uname (char *name, int cflag)
  70. {
  71.   static char *_name;
  72.   register char *s1, *s2, *e1, *e2;
  73.   register int h, i, j, k;
  74.   int r[6];
  75.   char *s2_[1];
  76.   int maxnamlen;
  77.  
  78.   if (!name)
  79.     return ("");
  80.  
  81.   if (!__unbuf)
  82.     if (!(__unbuf = malloc (MAXPATHLEN << 1)))
  83.       return (0);
  84.  
  85.   _name = (_name == __unbuf) ? (__unbuf + MAXPATHLEN) : __unbuf;
  86.   if (__uname_control & 1)
  87.     {
  88.       return (strcpy (_name, name));
  89.     }
  90.  
  91.   s1 = name;
  92.   s2 = _name;
  93.  
  94.   if (!(k = *s1))
  95.     {
  96.       *s2++ = 0;
  97.       return (_name);
  98.     }
  99.  
  100.   maxnamlen = (__uname_control & 2) ? LONG_MAXNAMLEN : MAXNAMLEN;
  101.  
  102.   if (k == '/')
  103.     s1++, i = s1[0];
  104.   else
  105.     i = k;
  106.  
  107.   h = s1[1];
  108.  
  109.   if (i == '$' || i == '@' || i == '%' || i == '^' || i == '&' || i == '\\')
  110.     {
  111.       while ((j = *s1++) && j != '/')
  112.     *s2++ = j;
  113.       s1--;
  114.       i = j;
  115.       k = '.';
  116.       goto main;
  117.     }
  118.  
  119.   if (i == ':' && h && h != '.' && h != ':')
  120.     {
  121.       *s2++ = ':';
  122.       *s2++ = h;
  123.       s1 += 2;
  124.       while ((j = *s1++) && j != '/')
  125.     *s2++ = j;
  126.       s1--;
  127.       i = j;
  128.       k = '.';
  129.       goto main;
  130.     }
  131.  
  132.   if (i && i != ':' && h)
  133.     {
  134.       e1 = s1;
  135.       while ((j = *++e1) && j != '/' && j != '.' && j != ':');
  136.       if (j == ':')
  137.     {
  138.       /* we know its of the format abc: Now see if its an FS spec or path spec */
  139.       e1++;
  140.       while ((*s2++ = *s1), ++s1 < e1)
  141.         continue;
  142.       if (e1[0] == ':' || e1[0] == '/')
  143.         {
  144.           while ((j = *s1++) && j != '/')
  145.         *s2++ = j;
  146.           s1--;
  147.           i = j;
  148.           k = (s1 == e1) ? 0 : '.';
  149.         }
  150.       else
  151.         {
  152.           i = j = '/';
  153.           k = 0;
  154.           s1--;
  155.         }
  156.       goto main;
  157.     }
  158.     }
  159.  
  160.   if (k != '/')
  161.     {
  162.       if (i == '.' && (!h || h == '/'))
  163.     {
  164.       *s2++ = '@';
  165.       s1 += 1;
  166.       i = h;
  167.       k = '.';
  168.     }
  169.       else
  170.     k = 0;
  171.       goto main;
  172.     }
  173.  
  174.   if (i == 'd' && h == 'e' && s1[2] == 'v' && s1[3] == '/')
  175.     {
  176.       s1 += 4;
  177.       while (*s2++ = *s1++);
  178.       s2[-1] = ':';
  179.       s2[0] = 0;
  180.       return (_name);
  181.     }
  182.  
  183.   if (i == 'u' && h == 's' && s1[2] == 'r' && s1[3] == '/' &&
  184.       (*s2_ = s2, e1 = __sdirseg (s1 + 4, s2_)))
  185.     {
  186.       s1 = e1;
  187.       s2 = *s2_;
  188.       i = *s1;
  189.       k = '.';
  190.       goto main;
  191.     }
  192.  
  193.   if (i == 'v' && h == 'a' && s1[2] == 'r' && s1[3] == '/' &&
  194.       (*s2_ = s2, e1 = __sdirseg (s1 + 4, s2_)))
  195.     {
  196.       s1 = e1;
  197.       s2 = *s2_;
  198.       i = *s1;
  199.       k = '.';
  200.       goto main;
  201.     }
  202.  
  203.   if (*s2_ = s2, e1 = __sdirseg (s1, s2_))
  204.     {
  205.       s1 = e1;
  206.       s2 = *s2_;
  207.       i = *s1;
  208.       k = '.';
  209.       goto main;
  210.     }
  211.  
  212.   *s2++ = '$';
  213.   k = '.';
  214.  
  215. main:
  216.  
  217.   if (i == '/')
  218.     {
  219.       while ((i = *++s1) == '/');
  220.       h = s1[1];
  221.     }
  222.  
  223.   if (i && k)
  224.     *s2++ = k;
  225.  
  226.   if (i)
  227.     for (;;)
  228.       {
  229.     if (i == '.' && (h == '/' || !h))
  230.       {
  231.         --s2;
  232.         s1 += 1;
  233.         goto loop;
  234.       }
  235.  
  236.     if (i == '.' && h == '.' && ((j = s1[2]) == '/' || !j))
  237.       {
  238.         *s2++ = '^';
  239.         s1 += 2;
  240.         goto loop;
  241.       }
  242.  
  243.     if (i == '<' && h)
  244.       {
  245.         e1 = s1;
  246.         while ((j = *++e1) && j != '>');
  247.         if (j == '>')
  248.           {
  249.         while ((*s2++ = *s1), ++s1 <= e1);
  250.         while ((j = *s1++) && j && j != '/')
  251.           *s2++ = j;
  252.         s1--;
  253.         goto loop;
  254.           }
  255.       }
  256.  
  257.     e1 = s1;
  258.     while ((i = *++e1) && i != '/' && i != '.');
  259.  
  260.     if (i == '.')
  261.       {
  262.         e2 = e1;
  263.         while ((j = *++e2) && j != '/')
  264.           if (j == '.')
  265.         e1 = e2;
  266.         if (e2 > ++e1 && __sfixseg (e1))
  267.           {
  268.         k = e2 - e1;
  269.         while ((*s2++ = *e1), ++e1 < e2);
  270.         if (cflag)
  271.           {
  272.             *s2 = 0;
  273.             if (!os_file (0x05, _name, r) && !r[0])
  274.               os_file (0x08, _name, r);
  275.           }
  276.         *s2++ = '.';
  277.         e1 -= k + 1;
  278.           }
  279.         else
  280.           {
  281.         register char *e3;
  282.  
  283.         e1--;
  284.         e3 = s1;
  285.         while ((*s2++ = *e3), ++e3 < e1);
  286.         *s2 = 0;
  287.         s2 -= (e1 - s1);
  288.         if (!os_file (0x05, _name, r) && r[0] == 2)
  289.           {
  290.             while ((j = *s1++) && j != '/')
  291.               *s2++ = j;
  292.             s1--;
  293.             goto loop;
  294.           }
  295.         e1 = e2;
  296.           }
  297.       }
  298.     else
  299.       e2 = e1;
  300.  
  301.     i = maxnamlen;
  302.     j = (e1 - s1) - i;
  303.     while (s1 < e1 && i)
  304.       {
  305.         k = *s1++;
  306.         if (k == '.')
  307.           k = '/';
  308.         /*
  309.            else if (k == '@' || k == '#' || k == '$' || k == '%' || k == '^' || \
  310.            k == '&' || k == '*' || k == ':' || k == '"' || !isgraph (k))
  311.          */
  312.         else if (k == '@' || k == '$' || k == '%' || k == '^' || \
  313.              k == '&' || k == ':' || k == '"' || !isgraph (k))
  314.           k = '_';
  315.         if (((__uname_control & 4) == 4) && j > 0 && i < maxnamlen)
  316.           if (k == 'a' || k == 'e' || k == 'i' || k == 'o' || k == 'u')
  317.         {
  318.           j--;
  319.           continue;
  320.         }
  321.         *s2++ = k;
  322.         i--;
  323.       }
  324.     s1 = e2;
  325.  
  326.       loop:
  327.  
  328.     if ((i = *s1) == '/')
  329.       while ((i = *++s1) == '/');
  330.  
  331.     if (!i || (s2 - _name) > (MAXPATHLEN - maxnamlen - 2))
  332.       break;
  333.  
  334.     h = s1[1];
  335.     *s2++ = '.';
  336.       }
  337.  
  338.   if ((s2 - _name) <= MAXPATHLEN)
  339.     *s2 = 0;
  340.   else
  341.     _name[MAXPATHLEN - 1] = 0;
  342.  
  343.   return (_name);
  344. }
  345.