aboutsummaryrefslogtreecommitdiffhomepage
path: root/libslang/slsh/scripts/badlinks
diff options
context:
space:
mode:
Diffstat (limited to 'libslang/slsh/scripts/badlinks')
-rwxr-xr-xlibslang/slsh/scripts/badlinks78
1 files changed, 78 insertions, 0 deletions
diff --git a/libslang/slsh/scripts/badlinks b/libslang/slsh/scripts/badlinks
new file mode 100755
index 0000000..77409bd
--- /dev/null
+++ b/libslang/slsh/scripts/badlinks
@@ -0,0 +1,78 @@
+#!/usr/bin/env slsh
+% Find links that point to non-existent files
+
+static define warn ()
+{
+ variable args = __pop_args (_NARGS-1);
+ variable err = ();
+ variable msg;
+
+ msg = sprintf (__push_args (args));
+
+ if (err)
+ err = ": " + errno_string (err);
+ else
+ err == "";
+
+ () = fprintf (stderr, "%s: %s%s\n",
+ __argv[0], msg, err);
+}
+
+static define badlinks (dir)
+{
+ variable files, file;
+ variable st;
+
+ files = listdir (dir);
+ if (files == NULL)
+ {
+ warn (errno, dir);
+ return;
+ }
+
+ foreach (files)
+ {
+ file = ();
+
+ file = path_concat (dir, file);
+ st = stat_file (file);
+ if (st != NULL)
+ continue;
+
+ if (errno != ENOENT)
+ {
+ warn (errno, file);
+ continue;
+ }
+
+ if (-1 == fprintf (stdout, "%s\n", file))
+ break;
+ }
+}
+
+define main (argc, argv)
+{
+ if (argc > 1)
+ {
+ if (argv[1] == "--help")
+ {
+ () = fprintf (stdout, "Usage: %s [--help] [dirs....]\n",
+ __argv[0]);
+ exit (1);
+ }
+ }
+
+ if (argc == 1)
+ {
+ badlinks (".");
+ exit (0);
+ }
+
+ foreach (argv[[1:]])
+ badlinks ();
+
+ exit (0);
+}
+
+main (__argc, __argv);
+