/* Copyright (C) 2007-2011 The Android Open Source Project
**
** This software is licensed under the terms of the GNU General Public
** License version 2, as published by the Free Software Foundation, and
** may be copied, distributed, and modified under those terms.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
*/
/*
* Contains implementation of main routine for ndk-stack utility.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include "ndk-stack-parser.h"
/* Usage string. */
static const char* _usage_str =
"Usage:\n"
" ndk-stack -sym <path> [-dump <path>]\n\n"
" -sym Contains full path to the root directory for symbols.\n"
" -dump Contains full path to the file containing the crash dump.\n"
" This is an optional parameter. If ommited, ndk-stack will\n"
" read input data from stdin\n"
"\n"
" See docs/NDK-STACK.html in your NDK installation tree for more details.\n\n";
int main(int argc, char **argv, char **envp)
{
const char* dump_file = NULL;
const char* sym_path = NULL;
int use_stdin = 0;
/* Parse command line. */
{
int n;
for (n = 1; n < argc; n++) {
if (!strcmp(argv[n], "-dump")) {
n++;
if (n < argc) {
dump_file = argv[n];
}
} else if (!strcmp(argv[n], "-sym")) {
n++;
if (n < argc) {
sym_path = argv[n];
}
} else {
fprintf(stdout, "%s", _usage_str);
return -1;
}
}
if (sym_path == NULL) {
fprintf(stdout, "%s", _usage_str);
return -1;
}
if (dump_file == NULL) {
use_stdin = 1;
}
}
/* Create crash dump parser, open dump file, and parse it line by line. */
NdkCrashParser* parser = CreateNdkCrashParser(stdout, sym_path);
if (parser != NULL) {
FILE* handle = use_stdin ? stdin : fopen(dump_file, "r");
if (handle != NULL) {
char str[2048];
while (fgets(str, sizeof(str), handle)) {
/* ParseLine requires that there are no \r, or \n symbols in the
* string. */
str[strcspn(str, "\r\n")] = '\0';
ParseLine(parser, str);
}
fclose(handle);
} else {
fprintf(stderr, "Unable to open dump file %s: %s\n",
dump_file, strerror(errno));
}
DestroyNdkCrashParser(parser);
} else {
fprintf(stderr, "Unable to create NDK stack parser: %s\n",
strerror(errno));
}
return 0;
}