summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr.bin/tsort/tsort.110
-rw-r--r--usr.bin/tsort/tsort.c26
2 files changed, 22 insertions, 14 deletions
diff --git a/usr.bin/tsort/tsort.1 b/usr.bin/tsort/tsort.1
index 971db804316..09282c96b07 100644
--- a/usr.bin/tsort/tsort.1
+++ b/usr.bin/tsort/tsort.1
@@ -1,4 +1,4 @@
-.\" $OpenBSD: tsort.1,v 1.7 2001/03/26 22:53:33 espie Exp $
+.\" $OpenBSD: tsort.1,v 1.8 2001/04/07 14:17:37 espie Exp $
.\" $NetBSD: tsort.1,v 1.6 1996/01/17 20:37:49 mycroft Exp $
.\"
.\" Copyright (c) 1990, 1993, 1994
@@ -81,16 +81,18 @@ of the first component of the pairs.
Use
.Ar file ,
which holds an ordered list of nodes, to resolve ambiguities.
+In case of duplicates, the first entry is chosen.
.It Fl l
Search for and display the longest cycle.
.It Fl q
-Do not display informational messages about cycles. This is primarily
-intended for building libraries, where optimal ordering is not critical,
-and cycles occur often.
+Do not display informational messages about cycles.
+This is primarily intended for building libraries, where optimal ordering
+is not critical, and cycles occur often.
.It Fl r
Reverse the ordering relation.
.It Fl v
Inform on the exact number of edges broken while breaking cycles.
+If a hints file was used, inform on seen nodes absent from that file.
.It Fl w
Exit with exit code the number of cycles
.Nm
diff --git a/usr.bin/tsort/tsort.c b/usr.bin/tsort/tsort.c
index c43ace0cf96..cd7dc20e24a 100644
--- a/usr.bin/tsort/tsort.c
+++ b/usr.bin/tsort/tsort.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tsort.c,v 1.5 2001/03/26 22:53:33 espie Exp $ */
+/* $OpenBSD: tsort.c,v 1.6 2001/04/07 14:17:38 espie Exp $ */
/* ex:ts=8 sw=4:
*/
@@ -133,7 +133,7 @@ static void dump_node __P((struct node *));
static void dump_array __P((struct array *));
static void dump_hash __P((struct ohash *));
#endif
-static void read_hints __P((FILE *, struct ohash *, const char *));
+static void read_hints __P((FILE *, struct ohash *, int, const char *));
static struct node *find_smallest_node __P((struct array *));
static struct node *find_good_cycle_break __P((struct array *));
static void print_cycle __P((struct array *));
@@ -143,7 +143,7 @@ static unsigned int traverse_node __P((struct node *, unsigned int, struct array
static struct node *find_longest_cycle __P((struct array *, struct array *));
static void heap_down __P((struct array *, unsigned int));
-static void heapify __P((struct array *));
+static void heapify __P((struct array *, int));
static struct node *dequeue __P((struct array *));
static void enqueue __P((struct array *, struct node *));
@@ -376,9 +376,10 @@ read_pairs(f, h, reverse, name)
}
static void
-read_hints(f, h, name)
+read_hints(f, h, quiet, name)
FILE *f;
struct ohash *h;
+ int quiet;
const char *name;
{
char *str;
@@ -403,7 +404,8 @@ read_hints(f, h, name)
continue;
a = node_lookup(h, str, e);
if (a->order != 0)
- errx(EX_DATAERR,
+ if (!quiet)
+ warnx(
"duplicate node %s in hints file %s",
a->k, name);
else
@@ -438,13 +440,17 @@ heap_down(h, i)
}
static void
-heapify(h)
+heapify(h, verbose)
struct array *h;
+ int verbose;
{
unsigned int i;
- for (i = h->entries; i != 0;)
- heap_down(h, --i);
+ for (i = h->entries; i != 0;) {
+ if (h->t[--i]->order == 0 && verbose)
+ warnx("node %s absent from hints file", h->t[i]->k);
+ heap_down(h, i);
+ }
}
#define DEQUEUE(h) ( hints_flag ? dequeue(h) : (h)->t[--(h)->entries] )
@@ -813,7 +819,7 @@ main(argc, argv)
if (f == NULL)
err(EX_NOINPUT, "Can't open hint file %s",
optarg);
- read_hints(f, &pairs, optarg);
+ read_hints(f, &pairs, quiet_flag, optarg);
fclose(f);
}
/*FALLTHRU*/
@@ -877,7 +883,7 @@ main(argc, argv)
ohash_delete(&pairs);
if (hints_flag)
- heapify(&aux);
+ heapify(&aux, verbose_flag);
left = remaining.entries + aux.entries;
while (left != 0) {