summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--menudriver.c102
1 files changed, 44 insertions, 58 deletions
diff --git a/menudriver.c b/menudriver.c
index aa6d65c..17e2272 100644
--- a/menudriver.c
+++ b/menudriver.c
@@ -27,8 +27,6 @@
#endif
#endif
-char *viewer = "less";
-
#define VIEWERPAUSESATEND .
/* this modifies default behaviour of menudriver to return straight to menu
after displaying section, to avoid two layers of prompt;
@@ -42,11 +40,10 @@ int fastback = 0;
void callshell(char[]);
void clrscr(void);
-void menudrive(const char *, char *);
+void menudrive(const char *, const char *, char *);
void pushlast(void);
void poplast(void);
void settings(const char *, const char *, int);
-void singleton(char *);
int subdir(void);
char next[40] = "", cmd[80], last[40] = ".";
@@ -84,9 +81,39 @@ static void view_menu(const char *command, const char *filename)
fclose(f);
}
+static void view_file(const char *viewer, const char *filename)
+{
+ struct stat st;
+ if (!(stat(filename, &st) == 0 && S_ISREG(st.st_mode))) {
+ fprintf(stderr, "menudriver: cannot access \"%s\"\n", filename), exit(1);
+ return;
+ }
+
+ clrscr();
+
+ char cmd[PATH_MAX];
+
+#ifdef UWIN /* does UWIN even exist anymore? */
+ if (strcmp(filename, "99") == 0) {
+#else
+ if (st.st_mode & S_IXUSR) {
+#endif
+ snprintf(cmd, sizeof(cmd), "./%s", filename);
+ fastback = 0;
+ } else {
+ snprintf(cmd, sizeof(cmd), "%s %s", viewer, filename);
+ }
+
+ system(cmd);
+
+ if (!fastback) {
+ wait_for_return();
+ }
+}
+
int main(int argc, char *argv[])
{
- char *v = getenv("VIEWER");
+ char *viewer = getenv("VIEWER");
char *fb = getenv("RETURNTOMENU");
char *menuviewer = getenv("MENUVIEWER");
@@ -95,15 +122,15 @@ int main(int argc, char *argv[])
exit(1);
}
- if (v) {
- viewer = v;
+ if (!viewer) {
+ viewer = "less";
}
if (fb) {
fastback = !(*fb == 'N' || *fb == 'n');
}
- menudrive(menuviewer, argc == 1 ? "." : argv[1]);
+ menudrive(menuviewer, viewer, argc == 1 ? "." : argv[1]);
}
/* checks if last is a number (and if so leaves value in val) */
@@ -125,13 +152,15 @@ int lastval(void)
return (sscanf(last, "%d", &val) == 1);
}
-void menudrive(const char *menuviewer, char *dir)
+void menudrive(const char *menuviewer, const char *viewer, char *dir)
{
char *np;
int c;
int bad = 0;
+
if (chdir(dir) == -1) {
- singleton(dir); /* apparently not a directory */
+ view_file(viewer, dir);
+ exit(0);
}
struct stat st;
@@ -207,7 +236,8 @@ void menudrive(const char *menuviewer, char *dir)
}
if (chdir(next) == -1 || stat("contents", &st)) {
- bad = 1, chdir(hold);
+ bad = 1;
+ chdir(hold);
} else {
strcpy(last, next);
pushlast();
@@ -215,25 +245,7 @@ void menudrive(const char *menuviewer, char *dir)
}
} else if (S_ISREG(st.st_mode)) {
- /* regular file */
- clrscr();
-
-#ifndef UWIN
- if (st.st_mode & S_IXUSR) /* executable (by owner) */
-#else
- if (strcmp(next, "99") == 0)
-#endif
- {
- snprintf(cmd, sizeof(cmd), "./%s", next);
- system(cmd);
- if (fastback) {
- wait_for_return();
- }
-
- } else {
- snprintf(cmd, sizeof(cmd), "%s %s", viewer, next);
- system(cmd);
- }
+ view_file(viewer, next);
if (fastback) {
strcpy(last, next);
@@ -251,7 +263,8 @@ void menudrive(const char *menuviewer, char *dir)
}
while (c != '\n' && c != EOF) {
- *np++ = c, c = getchar();
+ *np++ = c;
+ c = getchar();
}
if (c == EOF) {
@@ -317,32 +330,6 @@ void menudrive(const char *menuviewer, char *dir)
and exit by chdir(hold) instead of chdir("..") - will need to make this
recursive, or else have stack of holdwd's */
-void singleton(char *fil)
-{
- struct stat st;
- if (!(stat(fil, &st) == 0 && S_ISREG(st.st_mode))) {
- fprintf(stderr, "menudriver: cannot access \"%s\"\n", fil), exit(1);
- return;
- }
-
- clrscr();
-
- snprintf(cmd, sizeof(cmd), "%s %s", viewer, fil);
-#ifndef UWIN
- if (st.st_mode & S_IXUSR) { /* executable (by owner) */
- snprintf(cmd, sizeof(cmd), "./%s", fil);
- fastback = 0;
- }
-#endif
- system(cmd);
-
- if (!fastback) {
- wait_for_return();
- }
-
- exit(0);
-}
-
void callshell(char v[])
{
static char *shell = NULL;
@@ -448,4 +435,3 @@ void clrscr(void)
{
system("tput clear");
}
-