]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - progs/toe.c
ncurses 5.9 - patch 20131027
[ncurses.git] / progs / toe.c
index a5cf8bb8f96d5b686afa5ee80685e6b814d6be96..d57a5fe49f48c1391357ff4248235bdc97d1fc15 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 1998-2011,2012 Free Software Foundation, Inc.              *
+ * Copyright (c) 1998-2012,2013 Free Software Foundation, Inc.              *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
@@ -44,7 +44,7 @@
 #include <hashed_db.h>
 #endif
 
-MODULE_ID("$Id: toe.c,v 1.66 2012/02/22 23:57:44 tom Exp $")
+MODULE_ID("$Id: toe.c,v 1.72 2013/05/25 20:13:07 tom Exp $")
 
 #define isDotname(name) (!strcmp(name, ".") || !strcmp(name, ".."))
 
@@ -99,6 +99,8 @@ new_termdata(void)
     if (want >= len_termdata) {
        len_termdata = (2 * want) + 10;
        ptr_termdata = typeRealloc(TERMDATA, len_termdata, ptr_termdata);
+       if (ptr_termdata == 0)
+           failed("ptr_termdata");
     }
 
     return ptr_termdata + use_termdata++;
@@ -257,8 +259,11 @@ term_description(TERMTYPE *tp)
 {
     const char *desc;
 
-    if ((desc = strrchr(tp->term_names, '|')) == 0 || *++desc == '\0')
+    if (tp->term_names == 0
+       || (desc = strrchr(tp->term_names, '|')) == 0
+       || (*++desc == '\0')) {
        desc = "(No description)";
+    }
 
     return desc;
 }
@@ -295,10 +300,10 @@ checksum_of(TERMTYPE *tp)
     unsigned i;
 
     for (i = 0; i < NUM_BOOLEANS(tp); i++) {
-       result += (tp->Booleans[i]);
+       result += (unsigned long) (tp->Booleans[i]);
     }
     for (i = 0; i < NUM_NUMBERS(tp); i++) {
-       result += (tp->Numbers[i]);
+       result += (unsigned long) (tp->Numbers[i]);
     }
     for (i = 0; i < NUM_STRINGS(tp); i++) {
        result += string_sum(tp->Strings[i]);
@@ -318,7 +323,7 @@ sorthook(int db_index, int db_limit, const char *term_name, TERMTYPE *tp)
     data->description = strmalloc(term_description(tp));
 }
 
-#if USE_TERMCAP
+#if NCURSES_USE_TERMCAP
 static void
 show_termcap(int db_index, int db_limit, char *buffer, DescHook hook)
 {
@@ -345,6 +350,21 @@ show_termcap(int db_index, int db_limit, char *buffer, DescHook hook)
 }
 #endif
 
+#if NCURSES_USE_DATABASE
+static char *
+copy_entryname(DIRENT * src)
+{
+    size_t len = NAMLEN(src);
+    char *result = malloc(len + 1);
+    if (result == 0)
+       failed("copy entryname");
+    memcpy(result, src->d_name, len);
+    result[len] = '\0';
+
+    return result;
+}
+#endif
+
 static int
 typelist(int eargc, char *eargv[],
         bool verbosity,
@@ -354,7 +374,7 @@ typelist(int eargc, char *eargv[],
     int i;
 
     for (i = 0; i < eargc; i++) {
-#if USE_DATABASE
+#if NCURSES_USE_DATABASE
        if (_nc_is_dir_path(eargv[i])) {
            char *cwd_buf = 0;
            DIR *termdir;
@@ -372,24 +392,28 @@ typelist(int eargc, char *eargv[],
                (void) printf("#\n#%s:\n#\n", eargv[i]);
 
            while ((subdir = readdir(termdir)) != 0) {
-               size_t len = NAMLEN(subdir);
-               size_t cwd_len = len + strlen(eargv[i]) + 3;
-               char name_1[PATH_MAX];
+               size_t cwd_len;
+               char *name_1;
                DIR *entrydir;
                DIRENT *entry;
 
+               name_1 = copy_entryname(subdir);
+               if (isDotname(name_1)) {
+                   free(name_1);
+                   continue;
+               }
+
+               cwd_len = NAMLEN(subdir) + strlen(eargv[i]) + 3;
                cwd_buf = typeRealloc(char, cwd_len, cwd_buf);
                if (cwd_buf == 0)
                    failed("realloc cwd_buf");
 
                assert(cwd_buf != 0);
 
-               strncpy(name_1, subdir->d_name, len)[len] = '\0';
-               if (isDotname(name_1))
-                   continue;
-
                _nc_SPRINTF(cwd_buf, _nc_SLIMIT(cwd_len)
-                           "%s/%.*s/", eargv[i], (int) len, name_1);
+                           "%s/%s/", eargv[i], name_1);
+               free(name_1);
+
                if (chdir(cwd_buf) != 0)
                    continue;
 
@@ -399,15 +423,16 @@ typelist(int eargc, char *eargv[],
                    continue;
                }
                while ((entry = readdir(entrydir)) != 0) {
-                   char name_2[PATH_MAX];
+                   char *name_2;
                    TERMTYPE lterm;
                    char *cn;
                    int status;
 
-                   len = NAMLEN(entry);
-                   strncpy(name_2, entry->d_name, len)[len] = '\0';
-                   if (isDotname(name_2) || !_nc_is_file_path(name_2))
+                   name_2 = copy_entryname(entry);
+                   if (isDotname(name_2) || !_nc_is_file_path(name_2)) {
+                       free(name_2);
                        continue;
+                   }
 
                    status = _nc_read_file_entry(name_2, &lterm);
                    if (status <= 0) {
@@ -415,6 +440,10 @@ typelist(int eargc, char *eargv[],
                        (void) fprintf(stderr,
                                       "%s: couldn't open terminfo file %s.\n",
                                       _nc_progname, name_2);
+                       free(cwd_buf);
+                       free(name_2);
+                       closedir(entrydir);
+                       closedir(termdir);
                        return (EXIT_FAILURE);
                    }
 
@@ -425,6 +454,7 @@ typelist(int eargc, char *eargv[],
                        hook(i, eargc, cn, &lterm);
                    }
                    _nc_free_termtype(&lterm);
+                   free(name_2);
                }
                closedir(entrydir);
            }
@@ -472,7 +502,7 @@ typelist(int eargc, char *eargv[],
        }
 #endif
 #endif
-#if USE_TERMCAP
+#if NCURSES_USE_TERMCAP
 #if HAVE_BSD_CGETENT
        {
            CGETENT_CONST char *db_array[2];
@@ -680,6 +710,8 @@ main(int argc, char *argv[])
            }
            if (!pass) {
                eargv = allocArgv(count);
+               if (eargv == 0)
+                   failed("eargv");
            } else {
                code = typelist((int) count, eargv, header, hook);
                freeArgv(eargv);
@@ -692,6 +724,8 @@ main(int argc, char *argv[])
        char **eargv = allocArgv(2);
        size_t count = 0;
 
+       if (eargv == 0)
+           failed("eargv");
        _nc_first_db(&state, &offset);
        if ((path = _nc_next_db(&state, &offset)) != 0) {
            eargv[count++] = strmalloc(path);