comparison netinstall/concat.cc @ 448:3078fd1074e8 r21-2-39

Import from CVS: tag r21-2-39
author cvs
date Mon, 13 Aug 2007 11:38:25 +0200
parents
children
comparison
equal deleted inserted replaced
447:4fc5f13f3bd3 448:3078fd1074e8
1 /*
2 * Copyright (c) 2000, 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 DJ Delorie <dj@cygnus.com>
13 *
14 */
15
16 /* See concat.h. Note that we canonicalize the result, this avoids
17 multiple slashes being interpreted as UNCs. */
18
19 #include "win32.h"
20 #include <stdarg.h>
21 #include <stdlib.h>
22 #include <string.h>
23
24 char * CDECL
25 concat (char *s, ...)
26 {
27 int len;
28 char *rv, *arg;
29 va_list v;
30
31 if (!s)
32 return 0;
33
34 len = strlen (s);
35
36 va_start (v, s);
37 while (1)
38 {
39 arg = va_arg (v, char *);
40 if (arg == 0)
41 break;
42 len += strlen (arg);
43 }
44 va_end (v);
45
46 rv = (char *) malloc (len+1);
47 strcpy (rv, s);
48 va_start (v, s);
49 while (1)
50 {
51 arg = va_arg (v, char *);
52 if (arg == 0)
53 break;
54 strcat (rv, arg);
55 }
56 va_end (v);
57
58 /* concat is only used for urls and files, so we can safely
59 canonicalize the results */
60 char *d;
61 for (s=rv; *s; s++)
62 if (*s == '\\')
63 *s = '/';
64 for (s=d=rv; *s; s++)
65 {
66 *d++ = *s;
67 /* special case for URLs */
68 if (*s == ':' && s[1] == '/' && s[2] == '/' && s > rv+1)
69 {
70 *d++ = *++s;
71 *d++ = *++s;
72 }
73 else if (*s == '/')
74 while (s[1] == '/')
75 s++;
76 }
77 *d = 0;
78
79 return rv;
80 }
81
82 char *
83 backslash (char *s)
84 {
85 for (char *t = s; *t; t++)
86 if (*t == '/')
87 *t = '\\';
88 return s;
89 }