Subversion Repositories DevTools

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
313 dpurdie 1
/***************************************************************************
2
* Module name   : dosify.c
3
* Module type   : CMDFILE source file
4
* Environment(s): n/a
5
*
6
* Description:
7
*
8
    Dosify --- convert PATH for DOS
9
*
10
* Version   Who      Date        Description
11
            APY      02/03/00    Created
12
            APY      14/03/00    Handle .. correctly
13
*
14
* $Source: /cvsroot/device/DEVL/UTILS/CMDFILE/dosify.c,v $            
15
* $Revision: 1.3 $ $Date: 2004/10/08 03:07:37 $ $State: Exp $ 
16
* $Author: ayoung $ $Locker:  $
17
*.........................................................................*/
18
/*
19
*     Include Files
20
*     ---------------
21
*/
22
#include <ctype.h>
23
#include <unistd.h>
24
#include "cmdfile.h"
25
 
26
#undef  CONVERTDOTS     /* Convert multiple '.' to '_' */
27
 
28
#ifndef isblank
29
#define isblank(c)      ((c) == ' ' || (c) == '\t')
30
#endif
31
static  const char *    file_to_dos(const char *filename, char *buf);
32
 
33
int
34
dosify(
35
    String_t *str, const char *s )
36
{
37
    char  name[ PATH_MAX ], buf[ PATH_MAX ];
38
    int   len;
39
 
40
    if (expected(s++, ',') > 0 &&
41
            (len = pathargument(s, name, PATH_MAX)) > 0)
42
    {
43
        const char *p;
44
 
45
        p = file_to_dos(name, buf);
46
        verbose( " dosify(%s) = %s", name, p );
47
        StringCat(str, p);
48
        return (1+len);
49
    }
50
    return (-1);
51
}
52
 
53
 
54
static const char *
55
file_to_dos(
56
    const char *filename, char *buf)
57
{
58
    const   char *fname;
59
    int     dots, dots8, i;
60
    char    *dp, *sep;
61
 
62
/* NULL and special characters */
63
    if (filename == NULL ||
64
            strpbrk(filename, "\"*+,;<=>?[]|") != 0)
65
        return (filename);
66
    dp = buf, fname = filename;
67
 
68
/* Skip drive */
69
    if (isalpha(fname[0]) && fname[1] == ':') 
70
    {
71
        *dp++ = toupper(fname[0]), *dp++ = ':';
72
        fname += 2;
73
    }
74
 
75
/* Convert each directory/fname slashs */
76
    while (*fname)
77
    {
78
    /* File or directory name */
79
        if ((sep = strchr(fname, '/')) == (char *)NULL)
80
            sep = strchr(fname, '\\');
81
 
82
    /* Handle .. */
83
        if (!strncmp(fname, "../", 3) || !strncmp(fname, "..\\", 3)) 
84
        {
85
            (void) strcpy(dp, "..\\");
86
            fname += 3;
87
            dp += 3;
88
            continue;
89
        }
90
 
91
    /* Count dots,
92
        *   Check what filenames which violate 8+3 constraints,
93
        *   like "config.h.in", or ".emacs"?
94
        */
95
        for (dots=dots8=0, i=0;; i++) 
96
        {
97
            if (fname[i] == '\0' || fname[i] == '/' || fname[i] == '\\')
98
                break;
99
            if (fname[i] == '.') {
100
#if !defined(CONVERTDOTS)
101
                if (dots && sep == NULL)
102
                    return (filename);      /* reject */
103
#endif
104
                if (i < 8)
105
                dots8++;
106
                dots++;                     /* '.' count */
107
            }
108
        }
109
 
110
    /* First, transform the name part */
111
        for (i=0; *fname != '\0' && i < 8; i++)
112
        {
113
            if (*fname == '.') 
114
            {
115
                dots--;
116
                if (dots8-- <= 1)
117
                    break;
118
#if !defined(CONVERTDOTS)
119
                if (i < 7)
120
                    *dp++ = '_';            /* convert to '_' */
121
#endif
122
                fname++;
123
            } else if (*fname == '/' || *fname == '\\')
124
                break;
125
            else 
126
            {
127
                *dp++ = tolower(*fname++);
128
            }
129
        }
130
 
131
    /* Now skip to the last dot */
132
         while (*fname != '\0') {
133
               if (*fname == '.') {
134
                  if (dots-- <= 1)          /* consume additional dots */
135
                     break;
136
               } else if (*fname == '/' || *fname == '\\')
137
                  break;
138
               fname++;
139
        }
140
 
141
    /* Extension */
142
        if (fname && *fname == '.') {
143
            *dp++ = *fname++;               /* append '.' */
144
            for (i = 0; *fname != '\0' && i < 3; ++i) 
145
            {
146
                if (*fname == '/' || *fname == '\\')
147
                    break;
148
                *dp++ = tolower(*fname++);
149
            }
150
        }
151
 
152
    /* Look for next dir/file, consuming addition characters */
153
        while (*fname) 
154
        {
155
            if (*fname == '\\' || *fname == '/') 
156
            {
157
                fname++;
158
                *dp++ = '\\';               /* convert to DOS */
159
                break;
160
            }
161
            fname++;
162
        }
163
    }
164
    *dp = 0;                                /* terminate name */
165
    return buf;
166
}
167
 
168