+static bool
+get_bytes_size (unsigned long bytes, struct bytes_size *bytes_size)
+{
+ const char *unit, units[] = { '0', 'K', 'M', 'G', '\0' };
+ unsigned long size = bytes;
+ if (bytes < 1024)
+ return false;
+ unit = units;
+ while (size >= 1024 && *(unit + 1))
+ {
+ size /= 1024;
+ unit++;
+ }
+ bytes_size->size = (unsigned int)size;
+ bytes_size->unit = *unit;
+ return true;
+}
+
+static char *
+get_file_type (mode_t mode)
+{
+ if (S_ISREG (mode))
+ return "file";
+ else if (S_ISDIR (mode))
+ return "directory";
+ else if (S_ISCHR (mode))
+ return "character device";
+ else if (S_ISBLK (mode))
+ return "block device";
+ else if (S_ISFIFO (mode))
+ return "named pipe";
+ else if (S_ISLNK (mode))
+ return "symbolic link";
+ else if (S_ISSOCK (mode))
+ return "socket";
+ else
+ return "file";
+}
+
+static bool
+has_color_name (const char *str, const char *name)
+{
+ char *p;
+
+ assert (strlen (str));
+ assert (strlen (name));
+
+ if (!(*str == *name || *str == toupper (*name)))
+ return false;
+ else if (*(name + 1) != '\0'
+ && !((p = strstr (str + 1, name + 1)) && p == str + 1))
+ return false;
+
+ return true;
+}
+
+static FILE *
+open_file (const char *file, const char *mode)
+{
+ FILE *stream;
+
+ errno = 0;
+ stream = fopen (file, mode);
+ if (!stream)
+ vfprintf_fail (formats[FMT_FILE], file, strerror (errno));
+
+ return stream;
+}
+