Add help text and -q options

This commit is contained in:
K. Lange 2024-03-07 07:23:21 +09:00
parent 3e6632807a
commit 5345006580
2 changed files with 59 additions and 10 deletions

View File

@ -26,10 +26,24 @@ extern KrkValue krk_operator_add (KrkValue a, KrkValue b);
extern KrkValue krk_operator_sub (KrkValue a, KrkValue b);
static int usage(char * argv[]) {
fprintf(stderr, "usage: %s [FILE] [args...]\n", argv[0]);
fprintf(stderr, "usage: %s [-f LOG_FILE] [-q] FILE [args...]\n", argv[0]);
return 1;
}
static int help(char * argv[]) {
usage(argv);
fprintf(stderr,
"Generate callgrind-format trace files.\n"
"\n"
"Options:\n"
" -f LOG_FILE Output callgrind-format data to LOG_FILE.\n"
" -q Do not print execution summary.\n"
"\n"
" --help Show this help text.\n"
"\n");
return 0;
}
static KrkValue lineCache; /* {sourceCO: {line: count}} */
static KrkValue callCache; /* {sourceCO: {(codeobject,targetLine,sourceLine): [calls,instructions,time]}} */
static KrkValue timeCache; /* {sourceCO: time} */
@ -37,6 +51,7 @@ static KrkValue timeCache; /* {sourceCO: time} */
static size_t lastFrameCount = 0; /* Previously seen frame count, to track function entry/exit */
static size_t instrCounter = 0; /* Total counter of executed instructions */
static size_t functionsEntered = 0; /* Number of function entries seen */
static int quiet = 0;
/**
* @brief Calculate time difference as string.
@ -203,11 +218,14 @@ int main(int argc, char *argv[]) {
snprintf(outfile,1024,"callgrind.out.%d",getpid());
int opt;
while ((opt = getopt(argc, argv, "+:f:-:")) != -1) {
while ((opt = getopt(argc, argv, "+:f:q-:")) != -1) {
switch (opt) {
case 'f':
snprintf(outfile,1024,"%s", optarg);
break;
case 'q':
quiet = 1;
break;
case '?':
if (optopt != '-') {
fprintf(stderr, "%s: unrocognized option '%c'\n", argv[0], optopt);
@ -217,6 +235,7 @@ int main(int argc, char *argv[]) {
/* fall through */
case '-':
if (!strcmp(optarg,"help")) {
return help(argv);
} else {
fprintf(stderr, "%s: unrecognized option: '--%s'\n", argv[0], optarg);
return 1;
@ -245,14 +264,16 @@ int main(int argc, char *argv[]) {
if (krk_currentThread.flags & KRK_THREAD_HAS_EXCEPTION) {
krk_currentThread.flags &= ~(KRK_THREAD_HAS_EXCEPTION);
fprintf(stderr, "== Executed ended by exception ==\n");
if (!quiet) fprintf(stderr, "== Executed ended by exception ==\n");
} else {
fprintf(stderr, "== Execution completed ==\n");
if (!quiet) fprintf(stderr, "== Execution completed ==\n");
}
krk_callgrind_debuggerHook(NULL);
if (!quiet) {
fprintf(stderr, "%10zu total instruction%s\n", instrCounter, (instrCounter != 1) ? "s" : "");
fprintf(stderr, "%10zu function%s calls\n", functionsEntered, (functionsEntered != 1) ? "s" : "");
}
FILE * f = fopen(outfile,"w");
if (!f) {

View File

@ -9,13 +9,35 @@
#include "common.h"
#define DEFAULT_LIMIT 500000
static int usage(char * argv[]) {
fprintf(stderr, "usage: %s [-s count] [FILE] [args...]\n", argv[0]);
fprintf(stderr, "usage: %s [-s COUNT] [-q] FILE [args...]\n", argv[0]);
return 1;
}
static int help(char * argv[]) {
usage(argv);
fprintf(stderr,
"Run scripts with an instruction counter and halt when a "
"limit is exceeded. The default limit is %d. A total count of "
"executed instructions is printed after completion.\n"
"\n"
"Options:\n"
" -s COUNT Set watchdog timeout to COUNT instructions.\n"
" Specify -1 to set disable limit.\n"
" -q Do not print total instruction count.\n"
"\n"
" --help Show this help text.\n"
"\n",
DEFAULT_LIMIT);
return 0;
}
static size_t instrCounter = 0; /* Total counter of executed instructions */
static size_t stopAt = 500000;
static size_t stopAt = DEFAULT_LIMIT;
static int quiet = 0;
int krk_callgrind_debuggerHook(KrkCallFrame * frame) {
instrCounter++;
@ -29,11 +51,14 @@ int krk_callgrind_debuggerHook(KrkCallFrame * frame) {
int main(int argc, char *argv[]) {
int opt;
while ((opt = getopt(argc, argv, "+:s:-:")) != -1) {
while ((opt = getopt(argc, argv, "+:s:q-:")) != -1) {
switch (opt) {
case 's':
stopAt = strtoul(optarg,NULL,10);
break;
case 'q':
quiet = 1;
break;
case '?':
if (optopt != '-') {
fprintf(stderr, "%s: unrocognized option '%c'\n", argv[0], optopt);
@ -43,6 +68,7 @@ int main(int argc, char *argv[]) {
/* fall through */
case '-':
if (!strcmp(optarg,"help")) {
return help(argv);
} else {
fprintf(stderr, "%s: unrecognized option: '--%s'\n", argv[0], optarg);
return 1;
@ -62,7 +88,9 @@ int main(int argc, char *argv[]) {
krk_startModule("__main__");
krk_runfile(argv[optind],argv[optind]);
if (!quiet) {
fprintf(stderr, "%zu total instructions\n", instrCounter);
}
krk_freeVM();
return 0;