/****************************************************************************
- * Copyright (c) 1998-2006,2007 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2008,2010 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 <hashed_db.h>
#endif
-MODULE_ID("$Id: toe.c,v 1.46 2007/10/13 22:26:38 tom Exp $")
+MODULE_ID("$Id: toe.c,v 1.52 2010/05/01 22:04:08 tom Exp $")
#define isDotname(name) (!strcmp(name, ".") || !strcmp(name, ".."))
}
#endif
+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)
for (i = 0; i < eargc; i++) {
#if USE_DATABASE
if (_nc_is_dir_path(eargv[i])) {
+ char *cwd_buf = 0;
DIR *termdir;
DIRENT *subdir;
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;
closedir(entrydir);
}
closedir(termdir);
+ if (cwd_buf != 0)
+ free(cwd_buf);
}
#if USE_HASHED_DB
else {
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;
_nc_progname = _nc_rootname(argv[0]);
- while ((this_opt = getopt(argc, argv, "0123456789ahuvUV")) != -1) {
+ while ((this_opt = getopt(argc, argv, "0123456789ahu:vU:V")) != -1) {
/* handle optional parameter */
if (isdigit(this_opt)) {
switch (last_opt) {
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());
}
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);
}
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++)
}
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)