use BLI_strncpy and BLI_snprintf when the size of the string is known.
[blender-staging.git] / source / blender / blenlib / intern / storage.c
index b3caeb71822f54a0cd963401cd6925d977ebcbd4..df0634e4fcff59076935b622bc86a7735442fffa 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * $Id$
- *
  * ***** BEGIN GPL LICENSE BLOCK *****
  *
  * This program is free software; you can redistribute it and/or
@@ -56,7 +54,7 @@
 #include <sys/mount.h>
 #endif
 
-#if defined(linux) || defined(__CYGWIN32__) || defined(__hpux)
+#if defined(linux) || defined(__CYGWIN32__) || defined(__hpux) || defined(__GNU__) || defined(__GLIBC__)
 #include <sys/vfs.h>
 #endif
 
@@ -182,7 +180,7 @@ double BLI_dir_free_space(const char *dir)
                if (slash) slash[1] = 0;
        } else strcpy(name,"/");
 
-#if defined (__FreeBSD__) || defined (linux) || defined (__OpenBSD__) || defined (__APPLE__) 
+#if defined (__FreeBSD__) || defined (linux) || defined (__OpenBSD__) || defined (__APPLE__) || defined(__GNU__) || defined(__GLIBC__)
        if (statfs(name, &disk)) return(-1);
 #endif
 
@@ -205,7 +203,7 @@ static void bli_builddir(const char *dirname, const char *relname)
        char buf[256];
        DIR *dir;
 
-       strcpy(buf,relname);
+       BLI_strncpy(buf, relname, sizeof(buf));
        rellen=strlen(relname);
 
        if (rellen){
@@ -222,7 +220,7 @@ static void bli_builddir(const char *dirname, const char *relname)
                while ((fname = (struct dirent*) readdir(dir)) != NULL) {
                        dlink = (struct dirlink *)malloc(sizeof(struct dirlink));
                        if (dlink){
-                               strcpy(buf+rellen,fname->d_name);
+                               BLI_strncpy(buf + rellen ,fname->d_name, sizeof(buf) - rellen);
                                dlink->name = BLI_strdup(buf);
                                BLI_addhead(dirbase,dlink);
                                newnum++;
@@ -345,8 +343,8 @@ static void bli_adddirstrings(void)
                tm= localtime(&file->s.st_mtime);
                // prevent impossible dates in windows
                if(tm==NULL) tm= localtime(&zero);
-               strftime(file->time, 8, "%H:%M", tm);
-               strftime(file->date, 16, "%d-%b-%y", tm);
+               strftime(file->time, sizeof(file->time), "%H:%M", tm);
+               strftime(file->date, sizeof(file->date), "%d-%b-%y", tm);
 
                /*
                 * Seems st_size is signed 32-bit value in *nix and Windows.  This
@@ -356,38 +354,43 @@ static void bli_adddirstrings(void)
                st_size= file->s.st_size;
 
                if (st_size > 1024*1024*1024) {
-                       sprintf(file->size, "%.2f GB", ((double)st_size)/(1024*1024*1024));     
+                       BLI_snprintf(file->size, sizeof(file->size), "%.2f GB", ((double)st_size)/(1024*1024*1024));
                }
                else if (st_size > 1024*1024) {
-                       sprintf(file->size, "%.1f MB", ((double)st_size)/(1024*1024));
+                       BLI_snprintf(file->size, sizeof(file->size), "%.1f MB", ((double)st_size)/(1024*1024));
                }
                else if (st_size > 1024) {
-                       sprintf(file->size, "%d KB", (int)(st_size/1024));
+                       BLI_snprintf(file->size, sizeof(file->size), "%d KB", (int)(st_size/1024));
                }
                else {
-                       sprintf(file->size, "%d B", (int)st_size);
+                       BLI_snprintf(file->size, sizeof(file->size), "%d B", (int)st_size);
                }
 
-               strftime(datum, 32, "%d-%b-%y %H:%M", tm);
+               strftime(datum, 32, "%d-%b-%y %H:%M", tm); /* XXX, is this used? - campbell */
 
                if (st_size < 1000) {
-                       sprintf(size, "%10d", (int) st_size);
-               } else if (st_size < 1000 * 1000) {
-                       sprintf(size, "%6d %03d", (int) (st_size / 1000), (int) (st_size % 1000));
-               } else if (st_size < 100 * 1000 * 1000) {
-                       sprintf(size, "%2d %03d %03d", (int) (st_size / (1000 * 1000)), (int) ((st_size / 1000) % 1000), (int) ( st_size % 1000));
-               } else {
-                       sprintf(size, "> %4.1f M", (double) (st_size / (1024.0 * 1024.0)));
-                       sprintf(size, "%10d", (int) st_size);
+                       BLI_snprintf(size, sizeof(size), "%10d",
+                                    (int) st_size);
+               }
+               else if (st_size < 1000 * 1000) {
+                       BLI_snprintf(size, sizeof(size), "%6d %03d",
+                                    (int) (st_size / 1000), (int) (st_size % 1000));
+               }
+               else if (st_size < 100 * 1000 * 1000) {
+                       BLI_snprintf(size, sizeof(size), "%2d %03d %03d",
+                                    (int) (st_size / (1000 * 1000)), (int) ((st_size / 1000) % 1000), (int) ( st_size % 1000));
+               }
+               else {
+                       /* XXX, whats going on here?. 2x calls - campbell */
+                       BLI_snprintf(size, sizeof(size), "> %4.1f M", (double) (st_size / (1024.0 * 1024.0)));
+                       BLI_snprintf(size, sizeof(size), "%10d", (int) st_size);
                }
 
-               sprintf(buf,"%s %s %s %7s %s %s %10s %s", file->mode1, file->mode2, file->mode3, file->owner, file->date, file->time, size,
-                       file->relname);
+               BLI_snprintf(buf, sizeof(buf), "%s %s %s %7s %s %s %10s %s",
+                            file->mode1, file->mode2, file->mode3, file->owner,
+                            file->date, file->time, size, file->relname);
 
-               file->string=MEM_mallocN(strlen(buf)+1, "filestring");
-               if (file->string){
-                       strcpy(file->string,buf);
-               }
+               file->string = BLI_strdup(buf);
        }
 }
 
@@ -444,18 +447,18 @@ int BLI_exists(const char *name)
        /*  in Windows stat doesn't recognize dir ending on a slash 
                To not break code where the ending slash is expected we
                don't mess with the argument name directly here - elubie */
-       char tmp[FILE_MAXDIR+FILE_MAXFILE];
+       char tmp[FILE_MAX];
        int len, res;
-       BLI_strncpy(tmp, name, FILE_MAXDIR+FILE_MAXFILE);
+       BLI_strncpy(tmp, name, FILE_MAX);
        len = strlen(tmp);
        if (len > 3 && ( tmp[len-1]=='\\' || tmp[len-1]=='/') ) tmp[len-1] = '\0';
        res = _stat(tmp, &st);
        if (res == -1) return(0);
 #elif defined(__MINGW32__)
        struct _stati64 st;
-       char tmp[FILE_MAXDIR+FILE_MAXFILE];
+       char tmp[FILE_MAX];
        int len, res;
-       BLI_strncpy(tmp, name, FILE_MAXDIR+FILE_MAXFILE);
+       BLI_strncpy(tmp, name, FILE_MAX);
        len = strlen(tmp);
        if (len > 3 && ( tmp[len-1]=='\\' || tmp[len-1]=='/') ) tmp[len-1] = '\0';
        res = _stati64(tmp, &st);
@@ -473,6 +476,12 @@ int BLI_is_dir(const char *file)
        return S_ISDIR(BLI_exists(file));
 }
 
+int BLI_is_file(const char *path)
+{
+       int mode= BLI_exists(path);
+       return (mode && !S_ISDIR(mode));
+}
+
 LinkNode *BLI_file_read_as_lines(const char *name)
 {
        FILE *fp= fopen(name, "r");