8000 goaccess/json.c at master · no2key/goaccess · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
{"payload":{"allShortcutsEnabled":false,"fileTree":{"":{"items":[{"name":"config","path":"config","contentType":"directory"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":".travis.yml","path":".travis.yml","contentType":"file"},{"name":"AUTHORS","path":"AUTHORS","contentType":"file"},{"name":"COPYING","path":"COPYING","contentType":"file"},{"name":"ChangeLog","path":"ChangeLog","contentType":"file"},{"name":"Makefile.am","path":"Makefile.am","contentType":"file"},{"name":"NEWS","path":"NEWS","contentType":"file"},{"name":"README","path":"README","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"TODO","path":"TODO","contentType":"file"},{"name":"browsers.c","path":"browsers.c","contentType":"file"},{"name":"browsers.h","path":"browsers.h","contentType":"file"},{"name":"commons.c","path":"commons.c","contentType":"file"},{"name":"commons.h","path":"commons.h","contentType":"file"},{"name":"configure.ac","path":"configure.ac","contentType":"file"},{"name":"csv.c","path":"csv.c","contentType":"file"},{"name":"csv.h","path":"csv.h","contentType":"file"},{"name":"error.c","path":"error.c","contentType":"file"},{"name":"error.h","path":"error.h","contentType":"file"},{"name":"gdashboard.c","path":"gdashboard.c","contentType":"file"},{"name":"gdashboard.h","path":"gdashboard.h","contentType":"file"},{"name":"gdns.c","path":"gdns.c","contentType":"file"},{"name":"gdns.h","path":"gdns.h","contentType":"file"},{"name":"geolocation.c","path":"geolocation.c","contentType":"file"},{"name":"geolocation.h","path":"geolocation.h","contentType":"file"},{"name":"glibht.c","path":"glibht.c","contentType":"file"},{"name":"glibht.h","path":"glibht.h","contentType":"file"},{"name":"gmenu.c","path":"gmenu.c","contentType":"file"},{"name":"gmenu.h","path":"gmenu.h","contentType":"file"},{"name":"goaccess.1","path":"goaccess.1","contentType":"file"},{"name":"goaccess.c","path":"goaccess.c","contentType":"file"},{"name":"goaccess.h","path":"goaccess.h","contentType":"file"},{"name":"json.c","path":"json.c","contentType":"file"},{"name":"json.h","path":"json.h","contentType":"file"},{"name":"opesys.c","path":"opesys.c","contentType":"file"},{"name":"opesys.h","path":"opesys.h","contentType":"file"},{"name":"options.c","path":"options.c","contentType":"file"},{"name":"options.h","path":"options.h","contentType":"file"},{"name":"output.c","path":"output.c","contentType":"file"},{"name":"output.h","path":"output.h","contentType":"file"},{"name":"parser.c","path":"parser.c","contentType":"file"},{"name":"parser.h","path":"parser.h","contentType":"file"},{"name":"settings.c","path":"settings.c","contentType":"file"},{"name":"settings.h","path":"settings.h","contentType":"file"},{"name":"tcabinet.c","path":"tcabinet.c","contentType":"file"},{"name":"tcabinet.h","path":"tcabinet.h","contentType":"file"},{"name":"ui.c","path":"ui.c","contentType":"file"},{"name":"ui.h","path":"ui.h","contentType":"file"},{"name":"util.c","path":"util.c","contentType":"file"},{"name":"util.h","path":"util.h","contentType":"file"},{"name":"xmalloc.c","path":"xmalloc.c","contentType":"file"},{"name":"xmalloc.h","path":"xmalloc.h","contentType":"file"}],"totalCount":53}},"fileTreeProcessingTime":9.623697,"foldersToFetch":[],"incompleteFileTree":false,"repo":{"id":25494841,"defaultBranch":"master","name":"goaccess","ownerLogin":"no2key","currentUserCanPush":false,"isFork":true,"isEmpty":false,"createdAt":"2014-10-21T01:09:56.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/2669136?v=4","public":true,"private":false,"isOrgOwned":false},"codeLineWrapEnabled":false,"symbolsExpanded":false,"treeExpanded":true,"refInfo":{"name":"master","listCacheKey":"v0:1632814583.330142","canEdit":false,"refType":"branch","currentOid":"55faa5e03180cb73c33f6a6d46a2f550b14fbb0f"},"path":"json.c","currentUser":null,"blob":{"rawLines":["/**"," * output.c -- output json to the standard output stream"," * Copyright (C) 2009-2014 by Gerardo Orellana \u003cgoaccess@prosoftcorp.com\u003e"," * GoAccess - An Ncurses apache weblog analyzer \u0026 interactive viewer"," *"," * This program is free software; you can redistribute it and/or"," * modify it under the terms of the GNU General Public License as"," * published by the Free Software Foundation; either version 2 of"," * the License, or (at your option) any later version."," *"," * 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."," *"," * A copy of the GNU General Public License is attached to this"," * source distribution for its full text."," *"," * Visit http://goaccess.prosoftcorp.com for new releases."," */","#define _LARGEFILE_SOURCE","#define _LARGEFILE64_SOURCE","#define _FILE_OFFSET_BITS 64","","#include \u003cctype.h\u003e","#include \u003cstdio.h\u003e","#include \u003cstdlib.h\u003e","#include \u003cstring.h\u003e","#include \u003csys/stat.h\u003e","#include \u003ctime.h\u003e","#include \u003cunistd.h\u003e","#include \u003cinttypes.h\u003e","","#include \"json.h\"","","#ifdef HAVE_LIBTOKYOCABINET","#include \"tcabinet.h\"","#else","#include \"glibht.h\"","#endif","","#ifdef HAVE_LIBGEOIP","#include \"geolocation.h\"","#endif","","#include \"commons.h\"","#include \"error.h\"","#include \"gdns.h\"","#include \"settings.h\"","#include \"ui.h\"","#include \"util.h\"","#include \"xmalloc.h\"","","static void","escape_json_output (FILE * fp, char *s)","{"," while (*s) {"," switch (*s) {"," case '\"':"," fprintf (fp, \"\\\\\\\"\");"," break;"," case '\\\\':"," fprintf (fp, \"\\\\\\\\\");"," break;"," case '\\b':"," fprintf (fp, \"\\\\\\b\");"," break;"," case '\\f':"," fprintf (fp, \"\\\\\\f\");"," break;"," case '\\n':"," fprintf (fp, \"\\\\\\n\");"," break;"," case '\\r':"," fprintf (fp, \"\\\\\\r\");"," break;"," case '\\t':"," fprintf (fp, \"\\\\\\t\");"," break;"," case '/':"," fprintf (fp, \"\\\\/\");"," break;"," default:"," if ((uint8_t) * s \u003c= 0x1f) {"," /* Control characters (U+0000 through U+001F) */"," char buf[8];"," snprintf (buf, sizeof buf, \"\\\\u%04x\", *s);"," fprintf (fp, \"%s\", buf);"," } else if ((uint8_t) * s == 0xe2 \u0026\u0026 (uint8_t) * (s + 1) == 0x80 \u0026\u0026"," (uint8_t) * (s + 2) == 0xa8) {"," /* Line separator (U+2028) */"," fprintf (fp, \"\\\\u2028\");"," s += 2;"," } else if ((uint8_t) * s == 0xe2 \u0026\u0026 (uint8_t) * (s + 1) == 0x80 \u0026\u0026"," (uint8_t) * (s + 2) == 0xa9) {"," /* Paragraph separator (U+2019) */"," fprintf (fp, \"\\\\u2029\");"," s += 2;"," } else {"," fputc (*s, fp);"," }"," break;"," }"," s++;"," }","}","","static void","print_json_sub_items (FILE * fp, GSubList * sub_list, int process)","{"," char *data;"," float percent;"," GSubItem *iter;"," int hits, i = 0;",""," fprintf (fp, \",\\n\\t\\t\\t\\\"items\\\": [\\n\");"," for (iter = sub_list-\u003ehead; iter; iter = iter-\u003enext) {"," hits = iter-\u003ehits;"," data = (char *) iter-\u003edata;"," percent = get_percentage (process, hits);"," percent = percent \u003c 0 ? 0 : percent;",""," fprintf (fp, \"\\t\\t\\t\\t{\\n\");"," fprintf (fp, \"\\t\\t\\t\\t\\t\\\"hits\\\": \\\"%d\\\",\\n\", hits);"," fprintf (fp, \"\\t\\t\\t\\t\\t\\\"percent\\\": \\\"%4.2f%%\\\",\\n\", percent);"," fprintf (fp, \"\\t\\t\\t\\t\\t\\\"data\\\": \\\"\");"," escape_json_output (fp, data);"," fprintf (fp, \"\\\"\\n\");"," fprintf (fp, \"\\t\\t\\t\\t}\");",""," if (i != sub_list-\u003esize - 1)"," fprintf (fp, \",\\n\");"," else"," fprintf (fp, \"\\n\");"," i++;"," }"," fprintf (fp, \"\\t\\t\\t]\");","}","","/**"," * Generate JSON on partial fields for the following modules:"," * OS, BROWSERS, REFERRERS, REFERRING_SITES, KEYPHRASES, STATUS_CODES"," */","static void","print_json_generic (FILE * fp, const GHolder * h, int process)","{"," char *data;"," const char *id = NULL;"," float percent;"," int i, hits;",""," if (h-\u003emodule == BROWSERS)"," id = BROWS_ID;"," else if (h-\u003emodule == OS)"," id = OPERA_ID;"," else if (h-\u003emodule == REFERRERS)"," id = REFER_ID;"," else if (h-\u003emodule == REFERRING_SITES)"," id = SITES_ID;"," else if (h-\u003emodule == KEYPHRASES)"," id = KEYPH_ID;"," else if (h-\u003emodule == STATUS_CODES)"," id = CODES_ID;","#ifdef HAVE_LIBGEOIP"," else if (h-\u003emodule == GEO_LOCATION)"," id = GEOLO_ID;","#endif",""," fprintf (fp, \"\\t\\\"%s\\\": [\\n\", id);",""," for (i = 0; i \u003c h-\u003eidx; i++) {"," hits = h-\u003eitems[i].hits;"," data = h-\u003eitems[i].data;"," percent = get_percentage (process, hits);"," percent = percent \u003c 0 ? 0 : percent;",""," fprintf (fp, \"\\t\\t{\\n\");"," fprintf (fp, \"\\t\\t\\t\\\"hits\\\": \\\"%d\\\",\\n\", hits);"," fprintf (fp, \"\\t\\t\\t\\\"percent\\\": \\\"%4.2f%%\\\",\\n\", percent);"," fprintf (fp, \"\\t\\t\\t\\\"data\\\": \\\"\");"," escape_json_output (fp, data);"," fprintf (fp, \"\\\"\");",""," if (h-\u003emodule == OS || h-\u003emodule == BROWSERS || h-\u003emodule == STATUS_CODES","#ifdef HAVE_LIBGEOIP"," || h-\u003emodule == GEO_LOCATION","#endif"," )"," print_json_sub_items (fp, h-\u003eitems[i].sub_list, process);",""," fprintf (fp, \"\\n\\t\\t}\");",""," if (i != h-\u003eidx - 1)"," fprintf (fp, \",\\n\");"," else"," fprintf (fp, \"\\n\");"," }"," fprintf (fp, \"\\n\\t]\");","}","","/**"," * Generate JSON on complete fields for the following modules:"," * REQUESTS, REQUESTS_STATIC, NOT_FOUND, HOSTS"," */","static void","print_json_complete (FILE * fp, GHolder * holder, int process)","{","#ifdef HAVE_LIBGEOIP"," char country[COUNTRY_LEN] = \"\";"," char city[CITY_LEN] = \"\";","#endif",""," char *data, *host, *method = NULL, *protocol = NULL;"," float percent;"," GHolder *h = holder;"," int i, j, hits;"," unsigned long long bw, usecs;",""," for (i = 0; i \u003c 4; i++) {"," switch (i) {"," case 0:"," h = holder + REQUESTS;"," fprintf (fp, \"\\t\\\"%s\\\": [\\n\", REQUE_ID);"," break;"," case 1:"," h = holder + REQUESTS_STATIC;"," fprintf (fp, \"\\t\\\"%s\\\": [\\n\", STATI_ID);"," break;"," case 2:"," h = holder + NOT_FOUND;"," fprintf (fp, \"\\t\\\"%s\\\": [\\n\", FOUND_ID);"," break;"," case 3:"," h = holder + HOSTS;"," fprintf (fp, \"\\t\\\"%s\\\": [\\n\", HOSTS_ID);"," break;"," }",""," for (j = 0; j \u003c h-\u003eidx; j++) {"," hits = h-\u003eitems[j].hits;"," data = h-\u003eitems[j].data;"," percent = get_percentage (process, hits);"," percent = percent \u003c 0 ? 0 : percent;"," bw = h-\u003eitems[j].bw;"," usecs = h-\u003eitems[j].usecs;"," method = h-\u003eitems[j].method;"," protocol = h-\u003eitems[j].protocol;",""," fprintf (fp, \"\\t\\t{\\n\");"," fprintf (fp, \"\\t\\t\\t\\\"hits\\\": \\\"%d\\\",\\n\", hits);"," fprintf (fp, \"\\t\\t\\t\\\"percent\\\": \\\"%4.2f%%\\\",\\n\", percent);"," fprintf (fp, \"\\t\\t\\t\\\"data\\\": \\\"\");"," escape_json_output (fp, data);"," fprintf (fp, \"\\\",\\n\");"," fprintf (fp, \"\\t\\t\\t\\\"bytes\\\": \\\"%lld\\\"\", bw);",""," if (h-\u003emodule == HOSTS) {"," if (conf.enable_html_resolver) {"," host = reverse_ip (data);"," fprintf (fp, \",\\n\\t\\t\\t\\\"host\\\": \\\"\");"," escape_json_output (fp, host);"," fprintf (fp, \"\\\"\");"," free (host);"," }","#ifdef HAVE_LIBGEOIP"," geoip_get_country (data, country);"," fprintf (fp, \",\\n\\t\\t\\t\\\"country\\\": \\\"\");"," escape_json_output (fp, country);"," fprintf (fp, \"\\\"\");",""," if (conf.geoip_city_data) {"," geoip_get_city (data, city);"," fprintf (fp, \",\\n\\t\\t\\t\\\"city\\\": \\\"\");"," escape_json_output (fp, city);"," fprintf (fp, \"\\\"\");"," }","#endif"," }"," if (conf.serve_usecs)"," fprintf (fp, \",\\n\\t\\t\\t\\\"time_served\\\": \\\"%lld\\\"\", usecs);"," if (conf.append_protocol \u0026\u0026 protocol)"," fprintf (fp, \",\\n\\t\\t\\t\\\"protocol\\\": \\\"%s\\\"\", protocol);"," if (conf.append_method \u0026\u0026 method)"," fprintf (fp, \",\\n\\t\\t\\t\\\"method\\\": \\\"%s\\\"\", method);",""," fprintf (fp, \"\\n\\t\\t}\");",""," if (j != h-\u003eidx - 1)"," fprintf (fp, \",\\n\");"," else"," fprintf (fp, \"\\n\");"," }"," if (i != 3)"," fprintf (fp, \"\\t],\\n\");"," else"," fprintf (fp, \"\\t]\\n\");"," }","}","","/* generate JSON unique visitors stats */","static void","print_json_visitors (FILE * fp, GHolder * h)","{"," char *data, buf[DATE_LEN];"," float percent;"," int hits, bw, i, process = get_ht_size (ht_unique_visitors);",""," /* make compiler happy */"," memset (buf, 0, sizeof (buf));"," fprintf (fp, \"\\t\\\"%s\\\": [\\n\", VISIT_ID);"," for (i = 0; i \u003c h-\u003eidx; i++) {"," hits = h-\u003eitems[i].hits;"," data = h-\u003eitems[i].data;"," percent = get_percentage (process, hits);"," percent = percent \u003c 0 ? 0 : percent;"," bw = h-\u003eitems[i].bw;"," convert_date (buf, data, \"%Y%m%d\", \"%d/%b/%Y\", DATE_LEN);"," fprintf (fp, \"\\t\\t{\\n\\t\\t\\t\\\"hits\\\": \\\"%d\\\",\\n\", hits);"," fprintf (fp, \"\\t\\t\\t\\\"percent\\\": \\\"%4.2f%%\\\",\\n\", percent);"," fprintf (fp, \"\\t\\t\\t\\\"date\\\": \\\"%s\\\",\\n\", buf);"," fprintf (fp, \"\\t\\t\\t\\\"bytes\\\": \\\"%d\\\"\\n\", bw);"," fprintf (fp, \"\\t\\t}\");",""," if (i != h-\u003eidx - 1)"," fprintf (fp, \",\\n\");"," else"," fprintf (fp, \"\\n\");"," }"," fprintf (fp, \"\\t]\");","}","","/* generate overview stats */","static void","print_json_summary (FILE * fp, GLog * logger)","{"," off_t log_size = 0;"," char now[DATE_TIME];",""," generate_time ();"," strftime (now, DATE_TIME, \"%Y-%m-%d %H:%M:%S\", now_tm);",""," fprintf (fp, \"\\t\\\"%s\\\": {\\n\", GENER_ID);"," /* general statistics info */"," fprintf (fp, \"\\t\\t\\\"date_time\\\": \\\"%s\\\",\\n\", now);"," fprintf (fp, \"\\t\\t\\\"total_requests\\\": %d,\\n\", logger-\u003eprocess);"," fprintf (fp, \"\\t\\t\\\"unique_visitors\\\": %d,\\n\","," get_ht_size (ht_unique_visitors));"," fprintf (fp, \"\\t\\t\\\"referrers\\\": %d,\\n\", get_ht_size (ht_referrers));",""," if (!logger-\u003epiping)"," log_size = file_size (conf.ifile);",""," fprintf (fp, \"\\t\\t\\\"log_size\\\": %jd,\\n\", (intmax_t) log_size);"," fprintf (fp, \"\\t\\t\\\"failed_requests\\\": %d,\\n\", logger-\u003einvalid);"," fprintf (fp, \"\\t\\t\\\"unique_files\\\": %d,\\n\", get_ht_size (ht_requests));"," fprintf (fp, \"\\t\\t\\\"unique_404\\\": %d,\\n\","," get_ht_size (ht_not_found_requests));",""," fprintf (fp, \"\\t\\t\\\"bandwidth\\\": %lld,\\n\", logger-\u003eresp_size);"," fprintf (fp, \"\\t\\t\\\"generation_time\\\": %llu,\\n\","," ((long long) end_proc - start_proc));"," fprintf (fp, \"\\t\\t\\\"excluded_ip_hits\\\": %u,\\n\", logger-\u003eexclude_ip);"," fprintf (fp, \"\\t\\t\\\"static_files\\\": %d,\\n\", get_ht_size (ht_requests_static));",""," if (conf.ifile == NULL)"," conf.ifile = (char *) \"STDIN\";",""," fprintf (fp, \"\\t\\t\\\"log_file\\\": \\\"%s\\\"\\n\", conf.ifile);"," fprintf (fp, \"\\t}\");","}","","/* entry point to generate a a json report writing it to the fp */","/* follow the JSON style similar to http://developer.github.com/v3/ */","void","output_json (GLog * logger, GHolder * holder)","{"," FILE *fp = stdout;"," fprintf (fp, \"{\\n\"); /* open */",""," print_json_summary (fp, logger);"," fprintf (fp, \",\\n\");",""," print_json_visitors (fp, holder + VISITORS);"," fprintf (fp, \",\\n\");",""," print_json_complete (fp, holder, logger-\u003eprocess);"," fprintf (fp, \",\\n\");",""," print_json_generic (fp, holder + OS, get_ht_size (ht_unique_visitors));"," fprintf (fp, \",\\n\");",""," print_json_generic (fp, holder + BROWSERS, get_ht_size (ht_unique_visitors));"," fprintf (fp, \",\\n\");",""," print_json_generic (fp, holder + REFERRERS, logger-\u003eprocess);"," fprintf (fp, \",\\n\");",""," print_json_generic (fp, holder + REFERRING_SITES, logger-\u003eprocess);"," fprintf (fp, \",\\n\");",""," print_json_generic (fp, holder + KEYPHRASES, logger-\u003eprocess);"," fprintf (fp, \",\\n\");","","#ifdef HAVE_LIBGEOIP"," print_json_generic (fp, holder + GEO_LOCATION,"," get_ht_size (ht_unique_visitors));"," fprintf (fp, \",\\n\");","#endif",""," print_json_generic (fp, holder + STATUS_CODES, logger-\u003eprocess);"," fprintf (fp, \"\\n\");",""," fprintf (fp, \"\\n}\\n\"); /* close */",""," fclose (fp);","}"],"stylingDirectives":null,"colorizedLines":null,"csv":null,"csvError":null,"dependabotInfo":{"showConfigurationBanner":false,"configFilePath":null,"networkDependabotPath":"/no2key/goaccess/network/updates","dismissConfigurationNoticePath":"/settings/dismiss-notice/dependabot_configuration_notice","configurationNoticeDismissed":null},"displayName":"json.c","displayUrl":"https://github.com/no2key/goaccess/blob/master/json.c?raw=true","headerInfo":{"blobSize":"11.1 KB","deleteTooltip":"You must be signed in to make or propose changes","editTooltip":"You must be signed in to make or propose changes","ghDesktopPath":"https://desktop.github.com","isGitLfs":false,"onBranch":true,"shortPath":"3951d0e","siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Fno2key%2Fgoaccess%2Fblob%2Fmaster%2Fjson.c","isCSV":false,"isRichtext":false,"toc":null,"lineInfo":{"truncatedLoc":"416","truncatedSloc":"365"},"mode":"file"},"image":false,"isCodeownersFile":null,"isPlain":false,"isValidLegacyIssueTemplate":false,"issueTemplate":null,"discussionTemplate":null,"language":"C","languageID":41,"large":false,"planSupportInfo":{"repoIsFork":null,"repoOwnedByCurrentUser":null,"requestFullPath":"/no2key/goaccess/blob/master/json.c","showFreeOrgGatedFeatureMessage":null,"showPlanSupportBanner":null,"upgradeDataAttributes":null,"upgradePath":null},"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_dockerfile","releasePath":"/no2key/goaccess/releases/new?marketplace=true","showPublishActionBanner":false},"rawBlobUrl":"https://github.com/no2key/goaccess/raw/refs/heads/master/json.c","renderImageOrRaw":false,"richText":null,"renderedFileInfo":null,"shortPath":null,"symbolsEnabled":true,"tabSize":8,"topBannersInfo":{"overridingGlobalFundingFile":false,"globalPreferredFundingPath":null,"showInvalidCitationWarning":false,"citationHelpUrl":"https://docs.github.com/github/creating-cloning-and-archiving-repositories/creating-a-repository-on-github/about-citation-files","actionsOnboardingTip":null},"truncated":false,"viewable":true,"workflowRedirectUrl":null,"symbols":{"timed_out":true,"not_analyzed":false,"symbols":[{"name":"_LARGEFILE_SOURCE","kind":"macro","ident_start":891,"ident_end":908,"extent_start":883,"extent_end":909,"fully_qualified_name":"_LARGEFILE_SOURCE","ident_utf16":{"start":{"line_number":20,"utf16_col":8},"end":{"line_number":20,"utf16_col":25}},"extent_utf16":{"start":{"line_number":20,"utf16_col":0},"end":{"line_number":21,"utf16_col":0}}},{"name":"_LARGEFILE64_SOURCE","kind":"macro","ident_start":917,"ident_end":936,"extent_start":909,"extent_end":937,"fully_qualified_name":"_LARGEFILE64_SOURCE","ident_utf16":{"start":{"line_number":21,"utf16_col":8},"end":{"line_number":21,"utf16_col":27}},"extent_utf16":{"start":{"line_number":21,"utf16_col":0},"end":{"line_number":22,"utf16_col":0}}},{"name":"_FILE_OFFSET_BITS","kind":"macro","ident_start":945,"ident_end":962,"extent_start":937,"extent_end":966,"fully_qualified_name":"_FILE_OFFSET_BITS","ident_utf16":{"start":{"line_number":22,"utf16_col":8},"end":{"line_number":22,"utf16_col":25}},"extent_utf16":{"start":{"line_number":22,"utf16_col":0},"end":{"line_number":23,"utf16_col":0}}},{"name":"escape_json_output","kind":"function","ident_start":1433,"ident_end":1451,"extent_start":1433,"extent_end":1472,"fully_qualified_name":"escape_json_output","ident_utf16":{"start":{"line_number":54,"utf16_col":0},"end":{"line_number":54,"utf16_col":18}},"extent_utf16":{"start":{"line_number":54,"utf16_col":0},"end":{"line_number":54,"utf16_col":39}}},{"name":"print_json_sub_items","kind":"function","ident_start":2722,"ident_end":2742,"extent_start":2722,"extent_end":2788,"fully_qualified_name":"print_json_sub_items","ident_utf16":{"start":{"line_number":108,"utf16_col":0},"end":{"line_number":108,"utf16_col":20}},"extent_utf16":{"start":{"line_number":108,"utf16_col":0},"end":{"line_number":108,"utf16_col":66}}},{"name":"print_json_generic","kind":"function","ident_start":3688,"ident_end":3706,"extent_start":3688,"extent_end":3750,"fully_qualified_name":"print_json_generic","ident_utf16":{"start":{"line_number":144,"utf16_col":0},"end":{"line_number":144,"utf16_col":18}},"extent_utf16":{"start":{"line_number":144,"utf16_col":0},"end":{"line_number":144,"utf16_col":62}}},{"name":"if","kind":"function","ident_start":4174,"ident_end":4176,"extent_start":4174,"extent_end":4211,"fully_qualified_name":"if","ident_utf16":{"start":{"line_number":164,"utf16_col":7},"end":{"line_number":164,"utf16_col":9}},"extent_utf16":{"start":{"line_number":164,"utf16_col":7},"end":{"line_number":165,"utf16_col":6}}},{"name":"print_json_complete","kind":"function","ident_start":5190,"ident_end":5209,"extent_start":5190,"extent_end":5252,"fully_qualified_name":"print_json_complete","ident_utf16":{"start":{"line_number":205,"utf16_col":0},"end":{"line_number":205,"utf16_col":19}},"extent_utf16":{"start":{"line_number":205,"utf16_col":0},"end":{"line_number":205,"utf16_col":62}}},{"name":"print_json_visitors","kind":"function","ident_start":7857,"ident_end":7876,"extent_start":7857,"extent_end":7901,"fully_qualified_name":"print_json_visitors","ident_utf16":{"start":{"line_number":301,"utf16_col":0},"end":{"line_number":301,"utf16_col":19}},"extent_utf16":{"start":{"line_number":301,"utf16_col":0},"end":{"line_number":301,"utf16_col":44}}},{"name":"print_json_summary","kind":"function","ident_start":8797,"ident_end":8815,"extent_start":8797,"extent_end":8842,"fully_qualified_name":"print_json_summary","ident_utf16":{"start":{"line_number":333,"utf16_col":0},"end":{"line_number":333,"utf16_col":18}},"extent_utf16":{"start":{"line_number":333,"utf16_col":0},"end":{"line_number":333,"utf16_col":45}}},{"name":"output_json","kind":"function","ident_start":10302,"ident_end":10313,"extent_start":10302,"extent_end":10347,"fully_qualified_name":"output_json","ident_utf16":{"start":{"line_number":374,"utf16_col":0},"end":{"line_number":374,"utf16_col":11}},"extent_utf16":{"start":{"line_number":374,"utf16_col":0},"end":{"line_number":374,"utf16_col":45}}}]}},"copilotInfo":null,"copilotAccessAllowed":false,"modelsAccessAllowed":false,"modelsRepoIntegrationEnabled":false,"csrf_tokens":{"/no2key/goaccess/branches":{"post":"y4J9TUzZogvOITGMFlCt4KvwR51fA7QIz_gc-9epA1C3NsDNrj-20AaCGHRQJicQk-VUcWFzsrIexyciLhoGMg"},"/repos/preferences":{"post":"tmnwq0s4qyPX15FHa3WU8KhZb9nDLP2WK1Q9rvekElf9OP7F2S-hwzEC0TZiNrI0GIV0GsI4JVfBELVKLdIuOA"}}},"title":"goaccess/json.c at master · no2key/goaccess","appPayload":{"helpUrl":"https://docs.github.com","findFileWorkerPath":"/assets-cdn/worker/find-file-worker-7d7eb7c71814.js","findInFileWorkerPath":"/assets-cdn/worker/find-in-file-worker-1ae9fa256942.js","githubDevUrl":null,"enabled_features":{"code_nav_ui_events":false,"react_blob_overlay":false,"accessible_code_button":true,"github_models_repo_integration":false}}}
0