home *** CD-ROM | disk | FTP | other *** search
/ World of A1200 / World_Of_A1200.iso / programs / disk / misc / dcmp / source / source.lha / strfn.c < prev    next >
C/C++ Source or Header  |  1993-02-02  |  5KB  |  251 lines

  1. /*
  2. **  $RCSfile: strfn.c,v $
  3. **  $Release$
  4. **  $Revision: 1.4 $
  5. **  $Date: 92/08/31 15:43:20 $
  6. **  $Author: tf $
  7. **  $State: Exp $
  8. **
  9. **  File name support functions
  10. **
  11. **  (c) Copyright 1991,92 Tobias Ferber.  All Rights Reserved.
  12. */
  13.  
  14. #include "strfn.h"
  15.  
  16. /* check if a file exists */
  17.  
  18. BOOL fexist(char *name)
  19. { FILE *fp;
  20.   if(!(fp=fopen(name,"r")))
  21.     return(FALSE);
  22.   fclose(fp);
  23.   return(TRUE);
  24. }
  25.  
  26. extern struct DosLibrary *DOSBase;
  27.  
  28. /* get device list type */
  29.  
  30. long dltype(char *dname)
  31. { struct DeviceList *dlist;
  32.   int n;
  33.   char *t;
  34.   for(n=0;dname[n]!=_COLON && dname[n]!='\0'; n++)
  35.     ;
  36.   dlist=(struct DeviceList *)
  37.     BADDR(((struct DosInfo *)
  38.       BADDR(((struct RootNode *)(DOSBase->dl_Root))->rn_Info))->di_DevInfo);
  39.   while(dlist)
  40.   { t=(char *)(BADDR(dlist->dl_Name))+1;
  41.     if((strlen(t)==n) && (!strnicmp(t,dname,n)))
  42.       return(dlist->dl_Type);
  43.     else
  44.       dlist=(struct DeviceList *) BADDR(dlist->dl_Next);
  45.   }
  46.   return(DLT_UNKNOWN);
  47. }
  48.  
  49. /* make file name */
  50.  
  51. char *strmfn(name, drive, path, node, ext)
  52. char *name,*drive,*path,*node,*ext;
  53. { if(name)
  54.   { *name='\0';
  55.     if(drive && *drive!='\0')
  56.     { while((*name=*drive++)!='\0' && *name!=_COLON)
  57.         name++;
  58.       *name++=_COLON;
  59.     }
  60.     if(path && *path!='\0')
  61.     { while((*name=*path++)!='\0')
  62.         name++;
  63.       --name;
  64.       if(*name!=_SLASH)
  65.         *++name=_SLASH;
  66.       *++name='\0';
  67.     }
  68.     if(node && *node!='\0')
  69.     { while((*name=*node++)!='\0')
  70.         name++;
  71.     }
  72.     if(ext && *ext!='\0')
  73.     { if(*name!=_PERIOD && *ext!=_PERIOD)
  74.         *name++=_PERIOD;
  75.       while((*name=*ext++)!='\0')
  76.         name++;
  77.     }
  78.   }
  79.   return(name);
  80. }
  81.  
  82. /* split file name */
  83.  
  84. void strsfn(name, drive, path, node, ext)
  85. char *name,*drive,*path,*node,*ext;
  86. { if(name)
  87.   { char *f;
  88.     int p,n,e,x;
  89.     for(f=name,x=p=n=e=0; *f!='\0'; f++,x++)
  90.     { switch(*f)
  91.       { case _COLON:
  92.           if(drive)
  93.             strncpy(drive,name,x+1);
  94.           p=n=x+1;
  95.           break;
  96.         case _SLASH:
  97.           n=x+1;
  98.           break;
  99.         case _PERIOD:
  100.           e=x+1;
  101.           break;
  102.       }
  103.     }
  104.     if(path)
  105.     { if(p!=n)
  106.         strncpy(path,&name[p],n-p);
  107.       path[n-p]='\0';
  108.     }
  109.     if(node)
  110.     { if(e>0 && n!=e)
  111.       { strncpy(node,&name[n],e-1-n);
  112.         node[e-1-n]='\0';
  113.       }
  114.       else
  115.       { if(n!=x)
  116.           strncpy(node,&name[n],x-n);
  117.         node[x-n]='\0';
  118.       }
  119.     }
  120.     if(ext)
  121.     { if(e>0)
  122.         strcpy(ext,&name[e]);
  123.       else
  124.         *ext='\0';
  125.     }
  126.   }
  127. }
  128.  
  129. /* get file drive */
  130.  
  131. int stcgfd(drive,name)
  132. char *drive,*name;
  133. { if(name && *name!='\0')
  134.   { int x,n;
  135.     for(x=n=0; name[x]!='\0'; x++)
  136.     { if(name[x]==_COLON)
  137.         n=x+1;
  138.     }
  139.     if(drive && n>0)
  140.     { strncpy(drive,name,n);
  141.       drive[n]='\0';
  142.     }
  143.     return(n);
  144.   }
  145.   else return(0);
  146. }
  147.  
  148. /* get file path (incl. drive) */
  149.  
  150. int stcgfp(path,name)
  151. char *path, *name;
  152. { if(name && *name!='\0')
  153.   { int x,n;
  154.     for(x=n=0; name[x]!='\0'; x++)
  155.     { if(name[x]==_COLON || name[x]==_SLASH)
  156.         n=x+1;
  157.     }
  158.     if(n>0 && path)
  159.     { strncpy(path,name,n);
  160.       path[n]='\0';
  161.     }
  162.     return(n);
  163.   }
  164.   else return(0);
  165. }
  166.  
  167. /* get file name (incl. extension(s) ) */
  168.  
  169. int stcgfn(file,name)
  170. char *file,*name;
  171. { char *t;
  172.   if(name && *name!='\0')
  173.   { for(t=name; *name!='\0'; name++)
  174.     { if(*name==_COLON || *name==_SLASH)
  175.         t=&name[1];
  176.     }
  177.     if(file)
  178.       strcpy(file,t);
  179.     return strlen(t);
  180.   }
  181.   else if(file)
  182.     *file='\0';
  183.   return(0L);
  184. }
  185.  
  186. /* get file extension */
  187.  
  188. int stcgfe(ext,name)
  189. char *ext, *name;
  190. { if(name)
  191.   { char *t=NULL;
  192.     while(*name!='\0')
  193.     { if(*name++==_PERIOD)
  194.         t=name;
  195.     }
  196.     if(ext)
  197.     { if(t!=NULL)
  198.       { strcpy(ext,t);
  199.         return strlen(ext);
  200.       }
  201.       else *ext='\0';
  202.     }
  203.   }
  204.   return(0L);
  205. }
  206.  
  207. /* make file with (new) extension */
  208.  
  209. void strmfe(new,old,ext)
  210. char *new,*old,*ext;
  211. { if(new)
  212.   { char *t=NULL;
  213.     if(old)
  214.     { while((*new=*old++)!='\0')
  215.       { if(*new==_PERIOD)
  216.           t=new;
  217.         else if(*new==_SLASH || *new==_COLON)
  218.           t=NULL;
  219.         new++;
  220.       }
  221.     }
  222.     if(t!=NULL)
  223.       new=t;
  224.     if(ext)
  225.     { *new++ = _PERIOD;
  226.       strcpy(new,ext);
  227.     }
  228.     else *new='\0';
  229.   }
  230. }
  231.  
  232. /* make filename: path (+ _SLASH) + node */
  233.  
  234. void strmfp(name,path,node)
  235. char *name,*path,*node;
  236. { if(name)
  237.   { if(path)
  238.     { while((*name=*path++)!='\0')
  239.         name++;
  240.       --name;
  241.       if(*name!=_SLASH && *name!=_COLON)
  242.         *++name=_SLASH;
  243.       *++name='\0';
  244.     }
  245.     if(node)
  246.     { while((*name++ = *node++)!='\0')
  247.         ;
  248.     }
  249.   }
  250. }
  251.