int help(void *opt, int argc, char **argv) { if(argc == 0) { sl_help(commands, 1, argv - 1 /* XXX */); } else { SL_cmd *c = sl_match (commands, argv[0], 0); if(c == NULL) { fprintf (stderr, "No such command: %s. " "Try \"help\" for a list of commands\n", argv[0]); } else { if(c->func) { char *fake[] = { NULL, "--help", NULL }; fake[0] = argv[0]; (*c->func)(2, fake); fprintf(stderr, "\n"); } if(c->help && *c->help) fprintf (stderr, "%s\n", c->help); if((++c)->name && c->func == NULL) { int f = 0; fprintf (stderr, "Synonyms:"); while (c->name && c->func == NULL) { fprintf (stderr, "%s%s", f ? ", " : " ", (c++)->name); f = 1; } fprintf (stderr, "\n"); } } } return 0; }
void sl_slc_help (SL_cmd *cmds, int argc, char **argv) { if(argc == 0) { sl_help(cmds, 1, argv - 1 /* XXX */); } else { SL_cmd *c = sl_match (cmds, argv[0], 0); if(c == NULL) { fprintf (stderr, "No such command: %s. " "Try \"help\" for a list of commands\n", argv[0]); } else { if(c->func) { static char help[] = "--help"; char *fake[3]; fake[0] = argv[0]; fake[1] = help; fake[2] = NULL; (*c->func)(2, fake); fprintf(stderr, "\n"); } if(c->help && *c->help) fprintf (stderr, "%s\n", c->help); if((++c)->name && c->func == NULL) { int f = 0; fprintf (stderr, "Synonyms:"); while (c->name && c->func == NULL) { fprintf (stderr, "%s%s", f ? ", " : " ", (c++)->name); f = 1; } fprintf (stderr, "\n"); } } } }
int sl_command(SL_cmd *cmds, int argc, char **argv) { SL_cmd *c; c = sl_match (cmds, argv[0], 0); if (c == NULL) return -1; return (*c->func)(argc, argv); }
void sl_help (SL_cmd *cmds, int argc, char **argv) { SL_cmd *c, *prev_c; if (getenv("SLMANDOC")) { mandoc_template(cmds, NULL); return; } if (argc == 1) { prev_c = NULL; for (c = cmds; c->name; ++c) { if (c->func) { if(prev_c) printf ("\n\t%s%s", prev_c->usage ? prev_c->usage : "", prev_c->usage ? "\n" : ""); prev_c = c; printf ("%s", c->name); } else printf (", %s", c->name); } if(prev_c) printf ("\n\t%s%s", prev_c->usage ? prev_c->usage : "", prev_c->usage ? "\n" : ""); } else { c = sl_match (cmds, argv[1], 0); if (c == NULL) printf ("No such command: %s. " "Try \"help\" for a list of all commands\n", argv[1]); else { printf ("%s\t%s\n", c->name, c->usage); if(c->help && *c->help) printf ("%s\n", c->help); if((++c)->name && c->func == NULL) { printf ("Synonyms:"); while (c->name && c->func == NULL) printf ("\t%s", (c++)->name); printf ("\n"); } } } }