2 * Copyright (C) 2007 Neverball contributors
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of the
7 * License, or (at your option) any later version.
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 GNU
12 * General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
34 /*---------------------------------------------------------------------------*/
36 int read_line(char **dst, fs_file fin)
45 while (fs_gets(buff, sizeof (buff), fin))
47 /* Append to data read so far. */
51 new = concat_string(line, buff, NULL);
60 /* Strip newline, if any. */
68 /* We hit a newline, clean up and break. */
69 line = realloc(line, len1 + 1);
74 return (*dst = line) ? 1 : 0;
77 char *strip_newline(char *str)
79 char *c = str + strlen(str) - 1;
81 while (c >= str && (*c == '\n' || *c =='\r'))
87 char *dupe_string(const char *src)
91 if (src && (dst = malloc(strlen(src) + 1)))
97 char *concat_string(const char *first, ...)
101 if ((full = strdup(first)))
108 while ((part = va_arg(ap, const char *)))
112 if ((new = realloc(full, strlen(full) + strlen(part) + 1)))
131 char *trunc_string(const char *src, char *dst, int len)
133 static const char ell[] = "...";
135 assert(len > sizeof (ell));
137 if (dst[len - 1] = '\0', strncpy(dst, src, len), dst[len - 1] != '\0')
138 strcpy(dst + len - sizeof (ell), ell);
143 time_t make_time_from_utc(struct tm *tm)
145 struct tm local, *utc;
150 local = *localtime(&t);
153 local.tm_year += local.tm_year - utc->tm_year;
154 local.tm_mon += local.tm_mon - utc->tm_mon ;
155 local.tm_mday += local.tm_mday - utc->tm_mday;
156 local.tm_hour += local.tm_hour - utc->tm_hour;
157 local.tm_min += local.tm_min - utc->tm_min ;
158 local.tm_sec += local.tm_sec - utc->tm_sec ;
160 return mktime(&local);
163 const char *date_to_str(time_t i)
165 static char str[sizeof ("YYYY-mm-dd HH:MM:SS")];
166 strftime(str, sizeof (str), "%Y-%m-%d %H:%M:%S", localtime(&i));
170 int file_exists(const char *name)
174 if ((fp = fopen(name, "r")))
182 int file_rename(const char *src, const char *dst)
185 if (file_exists(dst))
188 return rename(src, dst);
191 void file_copy(FILE *fin, FILE *fout)
196 while ((size = fread(buff, 1, sizeof (buff), fin)) > 0)
197 fwrite(buff, 1, size, fout);
200 /*---------------------------------------------------------------------------*/
202 int path_is_sep(int c)
205 return c == '/' || c == '\\';
211 int path_is_abs(const char *path)
213 if (path_is_sep(path[0]))
217 if (isalpha(path[0]) && path[1] == ':' && path_is_sep(path[2]))
224 static char *path_last_sep(const char *path)
228 sep = strrchr(path, '/');
233 sep = strrchr(path, '\\');
239 if ((tmp = strrchr(sep, '\\')))
247 char *base_name(const char *name, const char *suffix)
249 static char buf[MAXSTR];
255 /* Remove the directory part. */
257 base = path_last_sep(name);
259 strncpy(buf, base ? base + 1 : name, sizeof (buf) - 1);
261 /* Remove the suffix. */
265 int l = strlen(buf) - strlen(suffix);
267 if (l >= 0 && strcmp(buf + l, suffix) == 0)
274 const char *dir_name(const char *name)
276 static char buff[MAXSTR];
280 strncpy(buff, name, sizeof (buff) - 1);
282 if ((sep = path_last_sep(buff)))
296 * Given a path to a file REF and another path REL relative to REF,
297 * construct and return a new path that can be used to refer to REL
300 char *path_resolve(const char *ref, const char *rel)
302 static char new[MAXSTR * 2];
304 if (path_is_abs(rel))
306 strncpy(new, rel, sizeof (new) - 1);
310 strncpy(new, dir_name(ref), sizeof (new) - 1);
311 strncat(new, "/", sizeof (new) - strlen(new) - 1);
312 strncat(new, rel, sizeof (new) - strlen(new) - 1);
317 /*---------------------------------------------------------------------------*/
319 int rand_between(int low, int high)
321 return low + rand() / (RAND_MAX / (high - low + 1) + 1);
324 /*---------------------------------------------------------------------------*/