]> cygwin.com Git - cygwin-apps/setup.git/blob - filemanip.cc
Backport some changes from trunk.
[cygwin-apps/setup.git] / filemanip.cc
1 /*
2 * Copyright (c) 2000, 2001, Red Hat, Inc.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * A copy of the GNU General Public License can be found at
10 * http://www.gnu.org/
11 *
12 * Written by Robert Collins <rbtcollins@redhat.com>
13 *
14 */
15
16 /* The purpose of this file is to put all general purpose file manipulation
17 code in one place. */
18
19 #if 0
20 static const char *cvsid =
21 "\n%%% $Id$\n";
22 #endif
23
24 #include <stdio.h>
25 #include <unistd.h>
26 #include <ctype.h>
27
28 #include "filemanip.h"
29 #include <strings.h>
30 #include "io_stream.h"
31
32 /* legacy wrapper.
33 * Clients should use io_stream.get_size() */
34 size_t
35 get_file_size (String const &name)
36 {
37 io_stream *theFile = io_stream::open (name, "rb");
38 if (!theFile)
39 /* To consider: throw an exception ? */
40 return 0;
41 ssize_t rv = theFile->get_size();
42 delete theFile;
43 return rv;
44 }
45
46 String
47 base (String const &aString)
48 {
49 if (!aString.size())
50 return 0;
51 const char *t = aString.cstr();
52 const char *s = t;
53 String rv = s;
54 while (*s)
55 {
56 if ((*s == '/' || *s == ':' || *s == '\\') && s[1])
57 rv = s + 1;
58 s++;
59 }
60 delete[] t;
61 return rv;
62 }
63
64 /* returns the number of characters of path that
65 * precede the extension
66 */
67 int
68 find_tar_ext (const char *path)
69 {
70 char *end = strchr (path, '\0');
71 /* check in longest first order */
72 const char *ext;
73 if ((ext = trail (path, ".tar.bz2")) && (end - ext) == 8)
74 return ext - path;
75 if ((ext = trail (path, ".tar.gz")) && (end - ext) == 7)
76 return ext - path;
77 if ((ext = trail (path, ".tar")) && (end - ext) == 4)
78 return ext - path;
79 return 0;
80 }
81
82 /* Parse a filename into package, version, and extension components. */
83 int
84 parse_filename (String const &in_fn, fileparse & f)
85 {
86 char *p, *ver;
87 char *fn = in_fn.cstr ();
88 int n;
89
90 if (fn == 0 || !(n = find_tar_ext (fn)))
91 return 0;
92
93 f.tail = fn + n;
94 fn[n] = '\0';
95 f.pkg = f.what = String();
96 p = base (fn).cstr();
97 delete[] fn;
98 char const *ext;
99 /* TODO: make const and non-const trail variant. */
100 if ((ext = trail (p, "-src")))
101 {
102 f.what = "-src";
103 *(char *)ext = '\0';
104 }
105 else if ((ext = trail (p, "-patch")))
106 {
107 f.what = "-patch";
108 *(char *)ext = '\0';
109 }
110 for (ver = p; *ver; ver++)
111 if (*ver == '-')
112 if (isdigit (ver[1]))
113 {
114 *ver++ = 0;
115 f.pkg = p;
116 break;
117 }
118 else if (strcasecmp (ver, "-src") == 0 ||
119 strcasecmp (ver, "-patch") == 0)
120 {
121 *ver++ = 0;
122 f.pkg = p;
123 f.what = strlwr (ver);
124 ver = strchr (ver, '\0');
125 break;
126 }
127
128 if (!f.pkg.size())
129 f.pkg = p;
130
131 if (!f.what.size())
132 {
133 int n;
134 char *p1 = strchr (ver, '\0');
135 if ((p1 -= 4) >= ver && strcasecmp (p1, "-src") == 0)
136 n = 4;
137 else if ((p1 -= 2) >= ver && strcasecmp (p1, "-patch") == 0)
138 n = 6;
139 else
140 n = 0;
141 if (n)
142 {
143 // get the 'src' or 'patch'.
144 f.what = p1 + 1;
145 }
146 }
147
148 f.ver = *ver ? ver : "0.0";
149 delete[] p;
150 return 1;
151 }
152
153 const char *
154 trail (const char *haystack, const char *needle)
155 {
156 /* See if the path ends with a specific suffix.
157 Just return if it doesn't. */
158 unsigned len = strlen (haystack);
159 int prefix_len = len - strlen (needle);
160 if (prefix_len < 0
161 || strcasecmp (haystack += prefix_len, needle) != 0)
162 return NULL;
163 return haystack;
164 }
165
166 String
167 backslash (String const & aString)
168 {
169 return aString.replace ('/', '\\');
170 }
This page took 0.042881 seconds and 5 git commands to generate.