home *** CD-ROM | disk | FTP | other *** search
/ APDL Public Domain 1 / APDL_PD1A.iso / program / assembler / as / src / c / uname < prev    next >
Encoding:
Text File  |  1992-09-08  |  4.6 KB  |  160 lines

  1.  
  2. /* uname.c (c) Copyright 1992 Niklas Röjemo */
  3.  
  4. #include <ctype.h>
  5. #include <string.h>
  6. #include <stdlib.h>
  7.  
  8. #define EXTRA(x) ((x)<<1)  /* Reserve double space */
  9.  
  10. char *special1(char const *dotpos, char const *end)
  11. {
  12.   int s = end - dotpos;
  13.   if(s == 1)
  14.     switch(*dotpos) {
  15.       case 'c': return "c";
  16.       case 'h': return "h";
  17.       case 'p': return "p";
  18.       case 'o': return "o";
  19.       case 's': return "s";
  20.       case 'm': return "m";
  21.       case 't': return "t";
  22.       case 'M': return "mc";
  23.     }
  24.   else {
  25.     if(!strncmp(dotpos,"mc",s)) return "mc";
  26.   }
  27.   return 0;
  28. }
  29.  
  30. char *special2(char const *dotpos, char const *end)
  31. {
  32.   int s = end - dotpos;
  33.   if(s == 1)
  34.     switch(*dotpos) {
  35.       case 'l': return "l";
  36.       case 'y': return "y";
  37.     }
  38.   else {
  39.     if(!strncmp(dotpos,"tt",s)) return "tt";
  40.   }
  41.   return 0;
  42. }
  43.     
  44.  
  45. static int  sizeName;   /* Length of buffer */
  46. static char *newName;   /* Name buffer */
  47.  
  48. char *uname(const char *name, int PrefixDir)
  49. {
  50.   char const *src;
  51.   char *dst;
  52.   char const *dotpos,*end,*pre;
  53.   int  c;
  54.  
  55.   if (!name) return("");                        /* What no filename ! */
  56.  
  57.   if (EXTRA(c = strlen(name)) > sizeName) {     /* Reserve space */
  58.     if(sizeName)
  59.       free(newName);
  60.       sizeName = c+100;            /* Add 100 increases chance we don't need to allocate again */
  61.     if((newName = malloc(sizeName))==0) {
  62.       sizeName = 0;
  63.       return 0;
  64.     } 
  65.   }
  66.  
  67.   src = name;
  68.   dst = newName;
  69.  
  70.   if ((c=*src)==0) {        /* name == "" */ 
  71.     *dst++ = 0;
  72.     return newName;
  73.   }
  74.  
  75.   if(  c == '<'  || c ==':'               /* No sane unixfiles start with < or : */
  76.     || (src[1] == '.' &&                  /* $. @. %. ^. &. is not a unixfile    */
  77.        (c == '$' || c == '@' || c == '%' || c == '^' || c == '&')) ) {
  78.     if(PrefixDir && c == '@' && getenv("Prefix$Dir")) {
  79.       strcpy(newName,"<Prefix$Dir>");
  80.       strcat(newName,name+1);
  81.     } else
  82.       strcpy(newName,name);
  83.     return newName;
  84.   }
  85.  
  86.   if (c == '/') {                   /* Probably a unixfile */
  87.     *dst++ = '$';                        /* change / to $. The dot is set in the while loop below */
  88.   } else {
  89.     if(PrefixDir && getenv("Prefix$Dir")) {
  90.       strcpy(newName,"<Prefix$Dir>");
  91.       dst += strlen("<Prefix$Dir>");
  92.     } else
  93.       *dst++ = '@';                        /* insert current dir */
  94.   }
  95.  
  96.   while (*src) {
  97.     while (*src == '/')               /* change multiple / to . */
  98.       src++;
  99.     *dst++ = '.';
  100.  
  101.     if (src[0] == '.' && src[1] == '.' && (src[2] == '/' || !src[2])) {
  102.       *dst++ = '^';                      /* change .. to ^ */
  103.       src += 2;
  104.       continue;
  105.     }
  106.     if (src[0] == '.' && (src[1] == '/' || !src[1])) {
  107.       dst--;                             /* remove the previous . in newName */
  108.       src++;                             /* and skip . in name */ 
  109.       continue;
  110.     }
  111.  
  112.     end = dotpos = src;                 /* locate end of this filename */
  113.     while ((c = *end)!=0 && c != '/') {    /* and the position of the last dot in the name */
  114.       if (c == '.')
  115.         dotpos = end;
  116.       end++;
  117.     }
  118.     if((pre = special2(src,end))!=0) {          /* This is a /-prefix  ! */
  119.       if(dst>newName)
  120.         dst[-1] = '/';
  121.       while((*dst++=*pre++)!=0)
  122.         ;
  123.       dst--;
  124.       src = end;
  125.     } else {
  126.       if (dotpos++ > src && dotpos < end) { /* We have a base.suffix */
  127.         if((pre = special1(dotpos,end))!=0) {
  128.           while((*dst++ = *pre++)!=0)        /* This is a special suffix */
  129.             ;                                /* now prefix */
  130.           dst[-1] = '.';
  131.           dotpos --;                         /* point to dot */
  132.           while(src<dotpos)                  /* Change all other dots into _ */
  133.             if((*dst++ = *src++) == '.')     /* when copying */
  134.               dst[-1] = '_';
  135.           src = end;
  136.         } else {                             /* is it a /prefix? */
  137.           if((pre = special1(src,--dotpos))!=0) { /* But the prefix is special ! */
  138.             while(src<end)                       /* Copy as is  */
  139.               *dst++ = *src++;
  140.           } else {
  141.             while(src<dotpos)                  /* Change all dots except the last into _ */
  142.               if((*dst++ = *src++) == '.')
  143.                 dst[-1] = '_';
  144.             *dst++ = '/';
  145.              src++;
  146.             while(src<end)                     /* And now the suffix */
  147.               *dst++ = *src++;
  148.           }
  149.         }
  150.       } else {       /* No dot or .base or base. */
  151.           while(src<end)                     /* Change all dots into _ */
  152.             if((*dst++ = *src++) == '.')
  153.               dst[-1] = '_';
  154.       }
  155.     }
  156.   }
  157.   *dst = 0;
  158.   return newName;
  159. }
  160.