]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - progs/toe.c
ncurses 5.9 - patch 20110807
[ncurses.git] / progs / toe.c
index 9b62d1e3bd2156008493e43afad1f53891c735c2..3d35fcd3f08143618d141ec56eeda14da9e483d1 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 1998-2006,2007 Free Software Foundation, Inc.              *
+ * Copyright (c) 1998-2010,2011 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            *
 
 #include <sys/stat.h>
 
-#include <dump_entry.h>
-
 #if USE_HASHED_DB
 #include <hashed_db.h>
 #endif
 
-MODULE_ID("$Id: toe.c,v 1.43 2007/02/03 19:10:39 tom Exp $")
+MODULE_ID("$Id: toe.c,v 1.58 2011/08/07 18:36:31 tom Exp $")
 
 #define isDotname(name) (!strcmp(name, ".") || !strcmp(name, ".."))
 
@@ -59,11 +57,19 @@ static void
 ExitProgram(int code)
 {
     _nc_free_entries(_nc_head);
-    _nc_leaks_dump_entry();
     _nc_free_tic(code);
 }
 #endif
 
+static void failed(const char *) GCC_NORETURN;
+
+static void
+failed(const char *msg)
+{
+    perror(msg);
+    ExitProgram(EXIT_FAILURE);
+}
+
 #if USE_HASHED_DB
 static bool
 make_db_name(char *dst, const char *src, unsigned limit)
@@ -166,6 +172,7 @@ typelist(int eargc, char *eargv[],
     for (i = 0; i < eargc; i++) {
 #if USE_DATABASE
        if (_nc_is_dir_path(eargv[i])) {
+           char *cwd_buf = 0;
            DIR *termdir;
            DIRENT *subdir;
 
@@ -174,26 +181,38 @@ typelist(int eargc, char *eargv[],
                (void) fprintf(stderr,
                               "%s: can't open terminfo directory %s\n",
                               _nc_progname, eargv[i]);
-               return (EXIT_FAILURE);
-           } else if (verbosity)
+               continue;
+           }
+
+           if (verbosity)
                (void) printf("#\n#%s:\n#\n", eargv[i]);
 
            while ((subdir = readdir(termdir)) != 0) {
                size_t len = NAMLEN(subdir);
-               char buf[PATH_MAX];
+               size_t cwd_len = len + strlen(eargv[i]) + 3;
                char name_1[PATH_MAX];
                DIR *entrydir;
                DIRENT *entry;
 
+               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;
 
-               (void) sprintf(buf, "%s/%s/", eargv[i], name_1);
-               if (chdir(buf) != 0)
+               (void) sprintf(cwd_buf, "%s/%.*s/", eargv[i], (int) len, name_1);
+               if (chdir(cwd_buf) != 0)
                    continue;
 
                entrydir = opendir(".");
+               if (entrydir == 0) {
+                   perror(cwd_buf);
+                   continue;
+               }
                while ((entry = readdir(entrydir)) != 0) {
                    char name_2[PATH_MAX];
                    TERMTYPE lterm;
@@ -225,12 +244,18 @@ typelist(int eargc, char *eargv[],
                closedir(entrydir);
            }
            closedir(termdir);
+           if (cwd_buf != 0)
+               free(cwd_buf);
+           continue;
        }
 #if USE_HASHED_DB
        else {
            DB *capdbp;
            char filename[PATH_MAX];
 
+           if (verbosity)
+               (void) printf("#\n#%s:\n#\n", eargv[i]);
+
            if (make_db_name(filename, eargv[i], sizeof(filename))) {
                if ((capdbp = _nc_db_open(filename, FALSE)) != 0) {
                    DBT key, data;
@@ -256,6 +281,7 @@ typelist(int eargc, char *eargv[],
                    }
 
                    _nc_db_close(capdbp);
+                   continue;
                }
            }
        }
@@ -263,30 +289,36 @@ typelist(int eargc, char *eargv[],
 #endif
 #if USE_TERMCAP
 #if HAVE_BSD_CGETENT
-       char *db_array[2];
-       char *buffer = 0;
+       {
+           CGETENT_CONST char *db_array[2];
+           char *buffer = 0;
 
-       if (verbosity)
-           (void) printf("#\n#%s:\n#\n", eargv[i]);
+           if (verbosity)
+               (void) printf("#\n#%s:\n#\n", eargv[i]);
 
-       db_array[0] = eargv[i];
-       db_array[1] = 0;
+           db_array[0] = eargv[i];
+           db_array[1] = 0;
 
-       if (cgetfirst(&buffer, db_array)) {
-           show_termcap(buffer, hook);
-           free(buffer);
-           while (cgetnext(&buffer, db_array)) {
+           if (cgetfirst(&buffer, db_array) > 0) {
                show_termcap(buffer, hook);
                free(buffer);
+               while (cgetnext(&buffer, db_array) > 0) {
+                   show_termcap(buffer, hook);
+                   free(buffer);
+               }
+               cgetclose();
+               continue;
            }
        }
-       cgetclose();
 #else
        /* scan termcap text-file only */
        if (_nc_is_file_path(eargv[i])) {
            char buffer[2048];
            FILE *fp;
 
+           if (verbosity)
+               (void) printf("#\n#%s:\n#\n", eargv[i]);
+
            if ((fp = fopen(eargv[i], "r")) != 0) {
                while (fgets(buffer, sizeof(buffer), fp) != 0) {
                    if (*buffer == '#')
@@ -319,26 +351,27 @@ main(int argc, char *argv[])
     bool direct_dependencies = FALSE;
     bool invert_dependencies = FALSE;
     bool header = FALSE;
-    int i;
+    char *report_file = 0;
+    unsigned i;
     int code;
     int this_opt, last_opt = '?';
-    int v_opt = 0;
+    unsigned v_opt = 0;
 
     _nc_progname = _nc_rootname(argv[0]);
 
-    while ((this_opt = getopt(argc, argv, "0123456789ahuvUV")) != EOF) {
+    while ((this_opt = getopt(argc, argv, "0123456789ahu:vU:V")) != -1) {
        /* handle optional parameter */
        if (isdigit(this_opt)) {
            switch (last_opt) {
            case 'v':
-               v_opt = (this_opt - '0');
+               v_opt = (unsigned) (this_opt - '0');
                break;
            default:
                if (isdigit(last_opt))
                    v_opt *= 10;
                else
                    v_opt = 0;
-               v_opt += (this_opt - '0');
+               v_opt += (unsigned) (this_opt - '0');
                last_opt = this_opt;
            }
            continue;
@@ -352,12 +385,14 @@ main(int argc, char *argv[])
            break;
        case 'u':
            direct_dependencies = TRUE;
+           report_file = optarg;
            break;
        case 'v':
            v_opt = 1;
            break;
        case 'U':
            invert_dependencies = TRUE;
+           report_file = optarg;
            break;
        case 'V':
            puts(curses_version());
@@ -368,15 +403,15 @@ main(int argc, char *argv[])
     }
     set_trace_level(v_opt);
 
-    if (direct_dependencies || invert_dependencies) {
-       if (freopen(argv[optind], "r", stdin) == 0) {
+    if (report_file != 0) {
+       if (freopen(report_file, "r", stdin) == 0) {
            (void) fflush(stdout);
-           fprintf(stderr, "%s: can't open %s\n", _nc_progname, argv[optind]);
+           fprintf(stderr, "%s: can't open %s\n", _nc_progname, report_file);
            ExitProgram(EXIT_FAILURE);
        }
 
        /* parse entries out of the source file */
-       _nc_set_source(argv[optind]);
+       _nc_set_source(report_file);
        _nc_read_entry_source(stdin, 0, FALSE, FALSE, NULLHOOK);
     }
 
@@ -386,7 +421,7 @@ main(int argc, char *argv[])
 
        for_entry_list(qp) {
            if (qp->nuses) {
-               int j;
+               unsigned j;
 
                (void) printf("%s:", _nc_first_name(qp->tterm.term_names));
                for (j = 0; j < qp->nuses; j++)
@@ -467,6 +502,10 @@ main(int argc, char *argv[])
            }
            if (!pass) {
                eargv = typeCalloc(char *, count + 1);
+               if (eargv == 0)
+                   failed("realloc eargv");
+
+               assert(eargv != 0);
            } else {
                code = typelist((int) count, eargv, header, deschook);
                while (count-- > 0)