ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/porting.C
Revision: 1.10
Committed: Thu Dec 14 22:45:40 2006 UTC (17 years, 5 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.9: +10 -207 lines
Log Message:
- implement event watcher autoncancellation on reload
- used it everywhere
- removed lots of compatibility cruft
  - configure does no longer check for mandatory unix functionality/headers
  - confgiure now runs much faster

File Contents

# Content
1 /*
2 CrossFire, A Multiplayer game for X-windows
3
4 Copyright (C) 2002 Mark Wedel & Crossfire Development Team
5 Copyright (C) 1992 Frank Tore Johansen
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20
21 The authors can be reached via e-mail at <crossfire@schmorp.de>
22 */
23
24 /* This file contains various functions that are not really unique for
25 * crossfire, but rather provides what should be standard functions
26 * for systems that do not have them. In this way, most of the
27 * nasty system dependent stuff is contained here, with the program
28 * calling these functions.
29 */
30
31
32 /* Need to pull in the HAVE_... values somehow */
33
34 #include <autoconf.h>
35
36 #include <cstdio>
37 #include <cstdlib>
38 #include <cstdarg>
39
40 #include <cctype>
41
42 #include <sys/stat.h>
43 #include <sys/wait.h>
44
45 #include <sys/param.h>
46
47 #include <unistd.h>
48
49 /* Has to be after above includes so we don't redefine some values */
50 #include "global.h"
51
52 static unsigned int curtmp = 0;
53
54 /* This function removes everything in the directory. */
55 void
56 remove_directory (const char *path)
57 {
58 DIR *dirp;
59 char buf[MAX_BUF];
60 struct stat statbuf;
61 int status;
62
63 if ((dirp = opendir (path)) != NULL)
64 {
65 struct dirent *de;
66
67 for (de = readdir (dirp); de; de = readdir (dirp))
68 {
69 /* Don't remove '.' or '..' In theory we should do a better
70 * check for .., but the directories we are removing are fairly
71 * limited and should not have dot files in them.
72 */
73 if (de->d_name[0] == '.')
74 continue;
75
76 /* Linux actually has a type field in the dirent structure,
77 * but that is not portable - stat should be portable
78 */
79 status = stat (de->d_name, &statbuf);
80 if ((status != -1) && (S_ISDIR (statbuf.st_mode)))
81 {
82 sprintf (buf, "%s/%s", path, de->d_name);
83 remove_directory (buf);
84 continue;
85 }
86 sprintf (buf, "%s/%s", path, de->d_name);
87 if (unlink (buf))
88 {
89 LOG (llevError, "Unable to remove directory %s\n", path);
90 }
91 }
92 closedir (dirp);
93 }
94 if (rmdir (path))
95 {
96 LOG (llevError, "Unable to remove directory %s\n", path);
97 }
98 }
99
100 #define DIGIT(x) (isdigit(x) ? (x) - '0' : \
101 islower (x) ? (x) + 10 - 'a' : (x) + 10 - 'A')
102 #define MBASE ('z' - 'a' + 1 + 10)
103
104 char *
105 strcasestr_local (const char *s, const char *find)
106 {
107 char c, sc;
108 size_t len;
109
110 if ((c = *find++) != 0)
111 {
112 c = tolower (c);
113 len = strlen (find);
114 do
115 {
116 do
117 {
118 if ((sc = *s++) == 0)
119 return NULL;
120 }
121 while (tolower (sc) != c);
122 }
123 while (strncasecmp (s, find, len) != 0);
124 s--;
125 }
126 return (char *) s;
127 }
128
129 /*
130 * Based on (n+1)^2 = n^2 + 2n + 1
131 * given that 1^2 = 1, then
132 * 2^2 = 1 + (2 + 1) = 1 + 3 = 4
133 * 3^2 = 4 + (4 + 1) = 4 + 5 = 1 + 3 + 5 = 9
134 * 4^2 = 9 + (6 + 1) = 9 + 7 = 1 + 3 + 5 + 7 = 16
135 * ...
136 * In other words, a square number can be express as the sum of the
137 * series n^2 = 1 + 3 + ... + (2n-1)
138 */
139 int
140 isqrt (int n)
141 {
142 int result, sum, prev;
143
144 result = 0;
145 prev = sum = 1;
146 while (sum <= n)
147 {
148 prev += 2;
149 sum += prev;
150 ++result;
151 }
152 return result;
153 }
154
155 /*
156 * returns a char-pointer to a static array, in which a representation
157 * of the decimal number given will be stored.
158 */
159 char *
160 ltostr10 (signed long n)
161 {
162 static char buf[12]; /* maximum size is n=-2 billion, i.e. 11 characters+1
163 character for the trailing nul character */
164 snprintf (buf, sizeof (buf), "%ld", n);
165 return buf;
166 }
167
168 char *
169 doubletostr10 (double v)
170 {
171 static char tbuf[200];
172
173 sprintf (tbuf, "%f", v);
174 return tbuf;
175 }
176
177 /**
178 * open_and_uncompress() first searches for the original filename. If it exist,
179 * then it opens it and returns the file-pointer.
180 */
181 FILE *
182 open_and_uncompress (const char *name, int flag, int *compressed)
183 {
184 *compressed = 0;
185 return fopen (name, "r");
186 }
187
188 /*
189 * See open_and_uncompress().
190 */
191
192 void
193 close_and_delete (FILE * fp, int compressed)
194 {
195 fclose (fp);
196 }
197
198 /*
199 * If any directories in the given path doesn't exist, they are created.
200 */
201
202 void
203 make_path_to_file (char *filename)
204 {
205 char buf[MAX_BUF], *cp = buf;
206 struct stat statbuf;
207
208 if (!filename || !*filename)
209 return;
210 strcpy (buf, filename);
211
212 while ((cp = strchr (cp + 1, (int) '/')))
213 {
214 *cp = '\0';
215 if (stat (buf, &statbuf) || !S_ISDIR (statbuf.st_mode))
216 {
217 if (mkdir (buf, SAVE_DIR_MODE))
218 {
219 LOG (llevError, "Cannot mkdir %s: %s\n", buf, strerror (errno));
220 return;
221 }
222 }
223 *cp = '/';
224 }
225 }