Mercurial > hg > octave-jordi > gnulib-hg
annotate lib/concat-filename.c @ 18070:d460ec17f09f
autoupdate
author | Karl Berry <karl@freefriends.org> |
---|---|
date | Tue, 28 Jul 2015 13:57:32 -0700 |
parents | ab58d4870664 |
children |
rev | line source |
---|---|
10390
247990850251
Split module 'filename' into 'filename' and 'concat-filename'.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
1 /* Construct a full filename from a directory and a relative filename. |
17848 | 2 Copyright (C) 2001-2004, 2006-2015 Free Software Foundation, Inc. |
8249 | 3 |
9309
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
8251
diff
changeset
|
4 This program is free software: you can redistribute it and/or modify it |
8249 | 5 under the terms of the GNU General Public License as published by the |
9309
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
8251
diff
changeset
|
6 Free Software Foundation; either version 3 of the License, or any |
8249 | 7 later version. |
8 | |
9 This program is distributed in the hope that it will be useful, | |
10 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 GNU General Public License for more details. | |
13 | |
14 You should have received a copy of the GNU General Public License | |
9309
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
8251
diff
changeset
|
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
8249 | 16 |
17 /* Written by Bruno Haible <haible@clisp.cons.org>. */ | |
18 | |
19 #include <config.h> | |
20 | |
21 /* Specification. */ | |
10390
247990850251
Split module 'filename' into 'filename' and 'concat-filename'.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
22 #include "concat-filename.h" |
8249 | 23 |
10391
f0a681493fa6
New module 'xconcat-filename', split off from module 'concat-filename'.
Bruno Haible <bruno@clisp.org>
parents:
10390
diff
changeset
|
24 #include <errno.h> |
f0a681493fa6
New module 'xconcat-filename', split off from module 'concat-filename'.
Bruno Haible <bruno@clisp.org>
parents:
10390
diff
changeset
|
25 #include <stdlib.h> |
8249 | 26 #include <string.h> |
27 | |
10390
247990850251
Split module 'filename' into 'filename' and 'concat-filename'.
Bruno Haible <bruno@clisp.org>
parents:
9309
diff
changeset
|
28 #include "filename.h" |
8249 | 29 |
8251
1e16373508e1
Rename module 'pathname' to 'filename'.
Bruno Haible <bruno@clisp.org>
parents:
8249
diff
changeset
|
30 /* Concatenate a directory filename, a relative filename and an optional |
8249 | 31 suffix. The directory may end with the directory separator. The second |
32 argument may not start with the directory separator (it is relative). | |
10391
f0a681493fa6
New module 'xconcat-filename', split off from module 'concat-filename'.
Bruno Haible <bruno@clisp.org>
parents:
10390
diff
changeset
|
33 Return a freshly allocated filename. Return NULL and set errno |
f0a681493fa6
New module 'xconcat-filename', split off from module 'concat-filename'.
Bruno Haible <bruno@clisp.org>
parents:
10390
diff
changeset
|
34 upon memory allocation failure. */ |
8249 | 35 char * |
8251
1e16373508e1
Rename module 'pathname' to 'filename'.
Bruno Haible <bruno@clisp.org>
parents:
8249
diff
changeset
|
36 concatenated_filename (const char *directory, const char *filename, |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10391
diff
changeset
|
37 const char *suffix) |
8249 | 38 { |
39 char *result; | |
40 char *p; | |
41 | |
42 if (strcmp (directory, ".") == 0) | |
43 { | |
44 /* No need to prepend the directory. */ | |
10391
f0a681493fa6
New module 'xconcat-filename', split off from module 'concat-filename'.
Bruno Haible <bruno@clisp.org>
parents:
10390
diff
changeset
|
45 result = (char *) malloc (strlen (filename) |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10391
diff
changeset
|
46 + (suffix != NULL ? strlen (suffix) : 0) |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10391
diff
changeset
|
47 + 1); |
10391
f0a681493fa6
New module 'xconcat-filename', split off from module 'concat-filename'.
Bruno Haible <bruno@clisp.org>
parents:
10390
diff
changeset
|
48 if (result == NULL) |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10391
diff
changeset
|
49 return NULL; /* errno is set here */ |
8249 | 50 p = result; |
51 } | |
52 else | |
53 { | |
54 size_t directory_len = strlen (directory); | |
55 int need_slash = | |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10391
diff
changeset
|
56 (directory_len > FILE_SYSTEM_PREFIX_LEN (directory) |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10391
diff
changeset
|
57 && !ISSLASH (directory[directory_len - 1])); |
10391
f0a681493fa6
New module 'xconcat-filename', split off from module 'concat-filename'.
Bruno Haible <bruno@clisp.org>
parents:
10390
diff
changeset
|
58 result = (char *) malloc (directory_len + need_slash |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10391
diff
changeset
|
59 + strlen (filename) |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10391
diff
changeset
|
60 + (suffix != NULL ? strlen (suffix) : 0) |
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10391
diff
changeset
|
61 + 1); |
10391
f0a681493fa6
New module 'xconcat-filename', split off from module 'concat-filename'.
Bruno Haible <bruno@clisp.org>
parents:
10390
diff
changeset
|
62 if (result == NULL) |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10391
diff
changeset
|
63 return NULL; /* errno is set here */ |
8249 | 64 memcpy (result, directory, directory_len); |
65 p = result + directory_len; | |
66 if (need_slash) | |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
10391
diff
changeset
|
67 *p++ = '/'; |
8249 | 68 } |
69 p = stpcpy (p, filename); | |
70 if (suffix != NULL) | |
71 stpcpy (p, suffix); | |
72 return result; | |
73 } |