// main int main(int n, char* args[]) { // parsing arguments for file paths int option; while ((option = getopt(n, args, "t:w:f:a:")) != -1) { switch (option) { case 't': FILE_FOR_WAPITI_TREE_PARSE = optarg; break; case 'w': FILE_FOR_WAPITI_PARSE = optarg; break; case 'f': FILE_FOR_W3AF_PARSE = optarg; break; case 'a': FILE_FOR_ARACHNI_PARSE = optarg; break; case '?': if ((optopt == 't') || (optopt == 'w') || (optopt == 'f') || (optopt == 'a')) fprintf(stderr, "Option -%c requires an argument.\n", optopt); else if (isprint(optopt)) fprintf(stderr, "Unknown option `-%c'.\n", optopt); else fprintf(stderr, "Unknown option character `\\x%x'.\n", optopt); break; default: break; } } start_database(); parse_wapiti(); parse_w3af(); parse_arachni(); finalize_database(); create_json(); return 0; }
static char* parse_value(nx_json* parent, const char* key, char* p, nx_json_unicode_encoder encoder) { nx_json* js; while (1) { switch (*p) { case '\0': NX_JSON_REPORT_ERROR("unexpected end of text", p); return 0; // error case ' ': case '\t': case '\n': case '\r': case ',': // skip p++; break; case '{': js=create_json(NX_JSON_OBJECT, key, parent); if (!js) return 0; p++; while (1) { const char* new_key = NULL; p=parse_key(&new_key, p, encoder); if (!p) return 0; // error if (*p=='}') return p+1; // end of object p=parse_value(js, new_key, p, encoder); if (!p) return 0; // error } case '[': js=create_json(NX_JSON_ARRAY, key, parent); if (!js) return 0; p++; while (1) { p=parse_value(js, 0, p, encoder); if (!p) return 0; // error if (*p==']') return p+1; // end of array } case ']': return p; case '"': p++; js=create_json(NX_JSON_STRING, key, parent); if (!js) return 0; js->text_value=unescape_string(p, &p, encoder); if (!js->text_value) return 0; // propagate error return p; case '-': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { char* pe; js=create_json(NX_JSON_INTEGER, key, parent); if (!js) return 0; js->int_value=strtol(p, &pe, 0); if (pe==p) { NX_JSON_REPORT_ERROR("invalid number", p); return 0; // error } #ifndef __KERNEL__ if (*pe=='.' || *pe=='e' || *pe=='E') { // double value js->type=NX_JSON_DOUBLE; js->dbl_value=strtod(p, &pe); if (pe==p) { NX_JSON_REPORT_ERROR("invalid number", p); return 0; // error } } else { js->dbl_value=js->int_value; } #endif return pe; } case 't': if (!strncmp(p, "true", 4)) { js=create_json(NX_JSON_BOOL, key, parent); if (!js) return 0; js->int_value=1; return p+4; } NX_JSON_REPORT_ERROR("unexpected chars", p); return 0; // error case 'f': if (!strncmp(p, "false", 5)) { js=create_json(NX_JSON_BOOL, key, parent); if (!js) return 0; js->int_value=0; return p+5; } NX_JSON_REPORT_ERROR("unexpected chars", p); return 0; // error case 'n': if (!strncmp(p, "null", 4)) { js = create_json(NX_JSON_NULL, key, parent); if (!js) return 0; return p+4; } NX_JSON_REPORT_ERROR("unexpected chars", p); return 0; // error case '/': // comment if (p[1]=='/') { // line comment char* ps=p; p=strchr(p+2, '\n'); if (!p) { NX_JSON_REPORT_ERROR("endless comment", ps); return 0; // error } p++; } else if (p[1]=='*') { // block comment p=skip_block_comment(p+2); if (!p) return 0; } else { NX_JSON_REPORT_ERROR("unexpected chars", p); return 0; // error } break; default: NX_JSON_REPORT_ERROR("unexpected chars", p); return 0; // error } } }