source: git/src/filename.c @ bd283cf6

RELEASE/1.0RELEASE/1.1RELEASE/1.2debug-cidebug-ci-sanitisersfaster-cavernloglog-selectstereostereo-2025walls-datawalls-data-hanging-as-warningwarn-only-for-hanging-survey
Last change on this file since bd283cf6 was 9af1d7a9, checked in by Olly Betts <olly@…>, 27 years ago

Initial revision

git-svn-id: file:///home/survex-svn/survex/trunk@63 4b37db11-9a0c-4f06-9ece-9ab7cdaee568

  • Property mode set to 100644
File size: 3.9 KB
RevLine 
[9af1d7a9]1/* OS dependent filename manipulation routines */
2#include "filename.h"
3#include <string.h>
4
5extern FILE *safe_fopen( const char *fnm, const char *mode ) {
6   return ( fDirectory(fnm) ? (FILE *)NULL : fopen( fnm, mode ) );
7}
8
9extern char * FAR PthFromFnm( const char *fnm ) {
10   char *pth;
11   const char *lf;
12   int lenpth = 0;
13
14   lf = strrchr( fnm, FNM_SEP_LEV );
15#ifdef FNM_SEP_LEV2
16   if (!lf) lf = strrchr( fnm, FNM_SEP_LEV2 );
17#endif
18#ifdef FNM_SEP_DRV
19   if (!lf) lf = strrchr( fnm, FNM_SEP_DRV );
20#endif
21   if (lf) lenpth = lf - fnm + 1;
22
23   pth = osmalloc( lenpth + 1 );
24   strncpy( pth, fnm, lenpth );
25   pth[lenpth] = '\0';
26
27   return pth;
28}
29
30extern char * FAR LfFromFnm( const char *fnm ) {
31   char *lf;
32   if ((lf = strrchr( fnm, FNM_SEP_LEV )) != NULL
33#ifdef FNM_SEP_LEV2
34       || (lf = strrchr( fnm, FNM_SEP_LEV2)) != NULL
35#endif
36#ifdef FNM_SEP_DRV
37       || (lf = strrchr( fnm, FNM_SEP_DRV )) != NULL
38#endif
39       ) {
40      return osstrdup(lf + 1);
41   }
42   return osstrdup(fnm);
43}
44
45/* Make fnm from pth and lf, inserting an FNM_SEP_LEV if appropriate */
46extern char * FAR UsePth( const char *pth, const char *lf ) {
47   char *fnm;
48   int len, len_total;
49   bool fAddSep = fFalse;
50
51   len = strlen(pth);
52   len_total = len + strlen(lf) + 1;
53
54   /* if there's a path and it doesn't end in a separator, insert one */
55   if (len != 0 && pth[len-1] != FNM_SEP_LEV) {
56#ifdef FNM_SEP_LEV2
57      if (pth[len-1] != FNM_SEP_LEV2) {
58#endif
59#ifdef FNM_SEP_DRV
60         if (pth[len-1] != FNM_SEP_DRV) {
61#endif
62            fAddSep = fTrue;
63            len_total++;
64#ifdef FNM_SEP_DRV
65         }
66#endif
67#ifdef FNM_SEP_LEV2
68      }
69#endif
70   }
71
72   fnm = osmalloc(len_total);
73   strcpy( fnm, pth );
74   if (fAddSep) fnm[len++] = FNM_SEP_LEV;
75   strcpy( fnm+len, lf );
76   return fnm;
77}
78
79/* Add ext to fnm, inserting an FNM_SEP_EXT if appropriate */
80extern char * FAR AddExt( const char *fnm, const char *ext ) {
81   char * fnmNew;
82   int len, len_total;
83#ifdef FNM_SEP_EXT
84   bool fAddSep = fFalse;
85#endif
86
87   len = strlen(fnm);
88   len_total = len + strlen(ext) + 1;
89#ifdef FNM_SEP_EXT
90   if (ext[0] != FNM_SEP_EXT) {
91      fAddSep = fTrue;
92      len_total++;
93   }
94#endif
95
96   fnmNew = osmalloc(len_total);
97   strcpy( fnmNew, fnm );
98#ifdef FNM_SEP_EXT
99   if (fAddSep) fnmNew[len++] = FNM_SEP_EXT;
100#endif
101   strcpy( fnmNew+len, ext );
102   return fnmNew;
103}
104
105/* fopen file, found using pth and fnm
106 * pfnmUsed used to return filename used to open file (ignored if NULL)
107 * or NULL if file didn't open
108 */
109extern FILE FAR * fopenWithPthAndExt( const char * pth, const char * fnm, const char * szExt, const char * szMode,
110                                      char **pfnmUsed ) {
111  char *fnmFull = NULL;
112  FILE *fh = NULL;
113  bool fAbs;
114  /* if no pth treat fnm as absolute */
115  fAbs = (pth == NULL || *pth == '\0' || fAbsoluteFnm(fnm));
116
117  /* if appropriate, try it without pth */
118  if (fAbs || fAmbiguousFnm(fnm)) {
119    fh = safe_fopen(fnm, szMode);
120    if (fh) {
121      if (pfnmUsed) fnmFull = osstrdup(fnm);
122    } else {
123      if (szExt && *szExt) { /* szExt!="" => got an extension to try */
124        fnmFull = AddExt( fnm, szExt );
125        fh = safe_fopen( fnmFull, szMode );
126      }
127    }
128  }
129
130  /* if filename could be relative, and file not opened yet */
131  if (!fAbs && fh == NULL) {
132    osfree(fnmFull);
133    /* try using path given - first of all without the extension */
134    fnmFull = UsePth( pth, fnm );
135    fh = safe_fopen( fnmFull, szMode );
136    if (!fh) {
137      if (szExt && *szExt) {
138        /* we've been given an extension so try using it */
139        char *fnmTmp;
140        fnmTmp = fnmFull;
141        fnmFull = AddExt( fnmFull, szExt );
142        osfree(fnmTmp);
143        fh = safe_fopen( fnmFull, szMode );
144      }
145    }
146  }
147
148  /* either it opened or didn't. If not, fh==NULL from safe_fopen() */
149  if (fh == NULL || pfnmUsed == NULL)
150    osfree(fnmFull); /* free name if it didn't open or name isn't wanted */
151  if (pfnmUsed) *pfnmUsed = (fh ? fnmFull : NULL);
152  return fh;
153}
Note: See TracBrowser for help on using the repository browser.