home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / icon / dos / src / common / filepart.c < prev    next >
C/C++ Source or Header  |  1992-02-10  |  2KB  |  119 lines

  1. /*
  2.  * This file contains fparse(), makename(), and smatch().
  3.  */
  4. #include <ctype.h>
  5. #include "../h/gsupport.h"
  6.  
  7. /*
  8.  * The following code is operating-system dependent [@filepart.01].  Define the
  9.  *  characters that terminate a file name prefix.
  10.  */
  11.  
  12. #if PORT
  13. #define Prefix "/"
  14. Deliberate Syntax Error
  15. #endif                    /* PORT */
  16.  
  17. #if AMIGA
  18. #define Prefix "/:"
  19. #endif                    /* AMIGA */
  20.  
  21. #if ATARI_ST
  22. #define Prefix "/:\\"
  23. #endif                    /* ATARI_ST */
  24.  
  25. #if MSDOS || OS2
  26. #define Prefix "/:\\"
  27. #endif                    /* MSDOS || OS2 */
  28.  
  29. #if MACINTOSH
  30. #define Prefix ":"
  31. #endif                    /* MACINTOSH */
  32.  
  33. #if MVS || VM
  34. #define Prefix ""
  35. #endif                    /* MVS || VM */
  36.  
  37. #if UNIX
  38. #define Prefix "/"
  39. #endif                    /* UNIX */
  40.  
  41. #if VMS
  42. #define Prefix "]:"
  43. #endif                    /* VMS */
  44.  
  45. /*
  46.  * End of operating-system specific code.
  47.  */
  48.  
  49. /*
  50.  * fparse - break a file name down into component parts.
  51.  *  Result is a pointer to a struct of static pointers good until the next call.
  52.  */
  53. struct fileparts *fparse(s)
  54. char *s;
  55.    {
  56.    static char buf[MaxFileName+2];
  57.    static struct fileparts fp;
  58.    int n;
  59.    char *p, *q;
  60.  
  61.    q = s;
  62.    fp.ext = p = s + strlen(s);
  63.    while (--p >= s) {
  64.       if (*p == '.' && *fp.ext == '\0')
  65.          fp.ext = p;
  66.       else if (index(Prefix,*p)) {
  67.          q = p+1;
  68.          break;
  69.          }
  70.       }
  71.    fp.dir = buf;
  72.    n = q - s;
  73.    strncpy(fp.dir,s,n);
  74.    fp.dir[n] = '\0';
  75.    fp.name = buf + n + 1;
  76.    n = fp.ext - q;
  77.    strncpy(fp.name,q,n);
  78.    fp.name[n] = '\0';
  79.    return &fp;
  80.    }
  81.  
  82. /*
  83.  * makename - make a file name, optionally substituting a new dir and/or ext
  84.  */
  85. char *makename(dest,d,name,e)
  86. char *dest, *d, *name, *e;
  87.    {
  88.    struct fileparts fp;
  89.    fp = *fparse(name);
  90.    if (d != NULL)
  91.       fp.dir = d;
  92.    if (e != NULL)
  93.       fp.ext = e;
  94.    sprintf(dest,"%s%s%s",fp.dir,fp.name,fp.ext);
  95.    return dest;
  96.    }
  97.  
  98. /*
  99.  * smatch - case-insensitive string match - returns nonzero if they match
  100.  */
  101. int smatch(s,t)
  102. char *s, *t;
  103.    {
  104.    char a, b;
  105.    for (;;) {
  106.       while (*s == *t)
  107.          if (*s++ == '\0')
  108.             return 1;
  109.          else
  110.             t++;
  111.       a = *s++;
  112.       b = *t++;
  113.       if (isupper(a))  a = tolower(a);
  114.       if (isupper(b))  b = tolower(b);
  115.       if (a != b)
  116.          return 0;
  117.       }
  118.    }
  119.