return atoi(nstr);
}
-/* convert integer into string
- nstr must be a 11 characters table
-*/
-gchar *itos_buf(gchar nstr[], gint n)
+/* convert integer into string,
+ nstr must be not lower than 11 characters length */
+gchar *itos_buf(gchar *nstr, gint n)
{
g_snprintf(nstr, 11, "%d", n);
return nstr;
}
-/* convert integer into string
- use an internal static buffer */
+/* convert integer into string */
gchar *itos(gint n)
{
static gchar nstr[11];
- g_snprintf(nstr, 11, "%d", n);
- return nstr;
+ return itos_buf(nstr, n);
}
gchar *to_human_readable(off_t size)
return str;
}
+/* remove trailing character */
+gchar *strtailchomp(gchar *str, gchar tail_char)
+{
+ register gchar *s;
+
+ if (!*str) return str;
+ if (tail_char == '\0') return str;
+
+ for (s = str + strlen(str) - 1; s >= str && *s == tail_char; s--)
+ *s = '\0';
+
+ return str;
+}
+
+
/* Similar to `strstr' but this function ignores the case of both strings. */
gchar *strcasestr(const gchar *haystack, const gchar *needle)
{
*destp = '\0';
}
+void extract_one_parenthesis_with_skip_quote(gchar *str, gchar quote_chr,
+ gchar op, gchar cl)
+{
+ register gchar *srcp, *destp;
+ gint in_brace;
+ gboolean in_quote = FALSE;
+
+ srcp = destp = str;
+
+ if ((srcp = strchr_with_skip_quote(destp, quote_chr, op))) {
+ memmove(destp, srcp + 1, strlen(srcp));
+ in_brace = 1;
+ while(*destp) {
+ if (*destp == op && !in_quote)
+ in_brace++;
+ else if (*destp == cl && !in_quote)
+ in_brace--;
+ else if (*destp == quote_chr)
+ in_quote ^= TRUE;
+
+ if (in_brace == 0)
+ break;
+
+ destp++;
+ }
+ }
+ *destp = '\0';
+}
+
void extract_parenthesis_with_skip_quote(gchar *str, gchar quote_chr,
gchar op, gchar cl)
{
srcp = destp = str;
- while ((srcp = strchr_with_skip_quote(destp, '"', op))) {
+ while ((srcp = strchr_with_skip_quote(destp, quote_chr, op))) {
if (destp > str)
*destp++ = ' ';
memmove(destp, srcp + 1, strlen(srcp));
return 0;
}
-gint remove_all_numbered_files(const gchar *dir)
+gint remove_numbered_files(const gchar *dir, guint first, guint last)
{
DIR *dp;
struct dirent *d;
gchar *prev_dir;
+ gint fileno;
prev_dir = g_get_current_dir();
}
while ((d = readdir(dp)) != NULL) {
- if (to_number(d->d_name) < 0) continue;
-
- if (unlink(d->d_name) < 0)
- FILE_OP_ERROR(d->d_name, "unlink");
+ fileno = to_number(d->d_name);
+ if (fileno >= 0 && first <= fileno && fileno <= last) {
+ if (unlink(d->d_name) < 0)
+ FILE_OP_ERROR(d->d_name, "unlink");
+ }
}
closedir(dp);
return 0;
}
+gint remove_all_numbered_files(const gchar *dir)
+{
+ return remove_numbered_files(dir, 0, UINT_MAX);
+}
+
gint remove_dir_recursive(const gchar *dir)
{
struct stat s;
return 0;
}
+gint move_file(const gchar *src, const gchar *dest)
+{
+ if (is_file_exist(dest)) {
+ g_warning(_("move_file(): file %s already exists."), dest);
+ return -1;
+ }
+
+ if (rename(src, dest) == 0) return 0;
+
+ if (EXDEV != errno) {
+ FILE_OP_ERROR(src, "rename");
+ return -1;
+ }
+
+ if (copy_file(src, dest) < 0) return -1;
+
+ unlink(src);
+
+ return 0;
+}
+
gint change_file_mode_rw(FILE *fp, const gchar *file)
{
#if HAVE_FCHMOD