get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/79064/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 79064,
    "url": "http://patches.dpdk.org/api/patches/79064/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20200928215052.23627-7-dmitry.kozliuk@gmail.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20200928215052.23627-7-dmitry.kozliuk@gmail.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200928215052.23627-7-dmitry.kozliuk@gmail.com",
    "date": "2020-09-28T21:50:51",
    "name": "[v3,6/7] cmdline: support Windows",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "031ed8cdae4b77c61fdff028327ca348dff6905e",
    "submitter": {
        "id": 1581,
        "url": "http://patches.dpdk.org/api/people/1581/?format=api",
        "name": "Dmitry Kozlyuk",
        "email": "dmitry.kozliuk@gmail.com"
    },
    "delegate": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20200928215052.23627-7-dmitry.kozliuk@gmail.com/mbox/",
    "series": [
        {
            "id": 12564,
            "url": "http://patches.dpdk.org/api/series/12564/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=12564",
            "date": "2020-09-28T21:50:45",
            "name": "cmdline: support Windows",
            "version": 3,
            "mbox": "http://patches.dpdk.org/series/12564/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/79064/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/79064/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id D7773A04C0;\n\tMon, 28 Sep 2020 23:53:29 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id F10B11C125;\n\tMon, 28 Sep 2020 23:51:48 +0200 (CEST)",
            "from mail-lf1-f65.google.com (mail-lf1-f65.google.com\n [209.85.167.65]) by dpdk.org (Postfix) with ESMTP id 1C94F1D6F0\n for <dev@dpdk.org>; Mon, 28 Sep 2020 23:51:39 +0200 (CEST)",
            "by mail-lf1-f65.google.com with SMTP id x69so3095233lff.3\n for <dev@dpdk.org>; Mon, 28 Sep 2020 14:51:39 -0700 (PDT)",
            "from localhost.localdomain (broadband-37-110-65-23.ip.moscow.rt.ru.\n [37.110.65.23])\n by smtp.gmail.com with ESMTPSA id l11sm2954893lfk.113.2020.09.28.14.51.37\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Mon, 28 Sep 2020 14:51:37 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;\n h=from:to:cc:subject:date:message-id:in-reply-to:references\n :mime-version:content-transfer-encoding;\n bh=gJsvihyRYlQxFWK5X665Nth8+B0RVz6AwTC0bcoTQBw=;\n b=EmIi5WkKTGF2tX9Felh/wfZEBotCQvuisMWxHQHf7Qh0xYgZQY3NOBUdQcDHjG8AiK\n RDq8OFR/JA+/nzHl2L7HGVFMYWqKPnVQkz15glCdJOZdIzeMM4wkW04euynsHgab2IF+\n I9vTAMlx6coNyDxZ7mh2KNUUYpwzL1By0z0B2jHvmMqfmhDdhxrCg0wOuI3+vy6Q5xh+\n qvzHF8Sq+7q1R85xTs75e/CHKF0hG/ZcQAqr0V611djQ6qy3w3MnQrc37MDx4yTx82ct\n Ynhncw0IQ0qk9lr0Jj2t53XU6SzE3bq7P5vWEn8bCFHp2qvmvlf5WKi3BM2/S8BaEKOE\n NiEw==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20161025;\n h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n :references:mime-version:content-transfer-encoding;\n bh=gJsvihyRYlQxFWK5X665Nth8+B0RVz6AwTC0bcoTQBw=;\n b=e97qIkOh2YgRJ4SxdxttvkV1ZBrJkkGqMhAElsSXhC5oFr59udA9bbmaHcKgT6IxGi\n KE2xy0aAXz90nnXjrHUXxfpaFSzx/4Bct5CPFbLYg90pNH2oNnJFpvgUEZChg/LeKX6l\n 84oD/gFwd65WHhX08kGn2GlSoQ5He9/kG5Q2HxEKC0QexO41S8KmMd9j01WWQeooyuZj\n cPaQT+8A8OhU6+T+ymfq/E0ZjCuSHUMeNTCO6ea7TQLjNRs7nLmPZTQpyfcv2ZA1hSvQ\n y5ri+11wFOva55+wlMOSa/jHHMLJzHT7ScF1uidFjxXOQ5oYJ367VjHH7x5sRmQLhO3E\n 8deg==",
        "X-Gm-Message-State": "AOAM530qqrWoj3oqzktX85XnTmLRk72fzXIUAlq8DV2BHJuIQekU/Yqq\n I9aU0V3LvI2jroXSe7GqhP3S2OWumOGRc2pW",
        "X-Google-Smtp-Source": "\n ABdhPJw2BlORms+iGITCOgEfZPbMmSNKYWZrVXX91lZLWPbkcnoM2VpUoaCnrQ8hWIOhRrdBhUO3Mw==",
        "X-Received": "by 2002:ac2:4d05:: with SMTP id r5mr72433lfi.267.1601329898221;\n Mon, 28 Sep 2020 14:51:38 -0700 (PDT)",
        "From": "Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>",
        "To": "dev@dpdk.org",
        "Cc": "\"Kinsella, Ray\" <mdr@ashroe.eu>, Khoa To <khot@microsoft.com>,\n Stephen Hemminger <stephen@networkplumber.org>,\n Ferruh Yigit <ferruh.yigit@intel.com>,\n Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>,\n Bruce Richardson <bruce.richardson@intel.com>,\n Olivier Matz <olivier.matz@6wind.com>",
        "Date": "Tue, 29 Sep 2020 00:50:51 +0300",
        "Message-Id": "<20200928215052.23627-7-dmitry.kozliuk@gmail.com>",
        "X-Mailer": "git-send-email 2.28.0",
        "In-Reply-To": "<20200928215052.23627-1-dmitry.kozliuk@gmail.com>",
        "References": "<20200730210652.14568-1-dmitry.kozliuk@gmail.com>\n <20200928215052.23627-1-dmitry.kozliuk@gmail.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v3 6/7] cmdline: support Windows",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Implement terminal handling, input polling, and vdprintf() for Windows.\n\nBecause Windows I/O model differs fundamentally from Unix and there is\nno concept of character device, polling is simulated depending on the\nunderlying input device. Supporting non-terminal input is useful for\nautomated testing.\n\nWindows emulation of VT100 uses \"ESC [ E\" for newline instead of\nstandard \"ESC E\", so add a workaround.\n\nSigned-off-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>\n---\n config/meson.build                      |   2 +\n lib/librte_cmdline/cmdline.c            |   5 +\n lib/librte_cmdline/cmdline_os_windows.c | 207 ++++++++++++++++++++++++\n lib/librte_cmdline/cmdline_parse.c      |   2 +-\n lib/librte_cmdline/cmdline_private.h    |  23 +++\n lib/librte_cmdline/cmdline_socket.c     |   4 +\n lib/librte_cmdline/cmdline_vt100.h      |   4 +\n lib/librte_cmdline/meson.build          |   4 +-\n lib/meson.build                         |   1 +\n 9 files changed, 250 insertions(+), 2 deletions(-)\n create mode 100644 lib/librte_cmdline/cmdline_os_windows.c",
    "diff": "diff --git a/config/meson.build b/config/meson.build\nindex 69f2aeb60..bd382bd7b 100644\n--- a/config/meson.build\n+++ b/config/meson.build\n@@ -276,6 +276,8 @@ if is_windows\n \t\tadd_project_arguments('-D__USE_MINGW_ANSI_STDIO', language: 'c')\n \tendif\n \n+\tadd_project_link_arguments('-lws2_32', language: 'c')\n+\n \t# Contrary to docs, VirtualAlloc2() is exported by mincore.lib\n \t# in Windows SDK, while MinGW exports it by advapi32.a.\n \tif is_ms_linker\ndiff --git a/lib/librte_cmdline/cmdline.c b/lib/librte_cmdline/cmdline.c\nindex 49770869b..dd6229b56 100644\n--- a/lib/librte_cmdline/cmdline.c\n+++ b/lib/librte_cmdline/cmdline.c\n@@ -13,11 +13,16 @@\n #include <fcntl.h>\n #include <errno.h>\n #include <netinet/in.h>\n+#include <unistd.h>\n \n #include <rte_string_fns.h>\n \n #include \"cmdline_private.h\"\n \n+#ifdef RTE_EXEC_ENV_WINDOWS\n+#define write _write\n+#endif\n+\n static void\n cmdline_valid_buffer(struct rdline *rdl, const char *buf,\n \t\t     __rte_unused unsigned int size)\ndiff --git a/lib/librte_cmdline/cmdline_os_windows.c b/lib/librte_cmdline/cmdline_os_windows.c\nnew file mode 100644\nindex 000000000..e9585c9ee\n--- /dev/null\n+++ b/lib/librte_cmdline/cmdline_os_windows.c\n@@ -0,0 +1,207 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright (c) 2020 Dmitry Kozlyuk\n+ */\n+\n+#include <io.h>\n+\n+#include <rte_os.h>\n+\n+#include \"cmdline_private.h\"\n+\n+/* Missing from some MinGW-w64 distributions. */\n+#ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING\n+#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004\n+#endif\n+\n+#ifndef ENABLE_VIRTUAL_TERMINAL_INPUT\n+#define ENABLE_VIRTUAL_TERMINAL_INPUT 0x0200\n+#endif\n+\n+void\n+terminal_adjust(struct cmdline *cl)\n+{\n+\tHANDLE handle;\n+\tDWORD mode;\n+\n+\tZeroMemory(&cl->oldterm, sizeof(cl->oldterm));\n+\n+\t/* Detect console input, set it up and make it emulate VT100. */\n+\thandle = GetStdHandle(STD_INPUT_HANDLE);\n+\tif (GetConsoleMode(handle, &mode)) {\n+\t\tcl->oldterm.is_console_input = 1;\n+\t\tcl->oldterm.input_mode = mode;\n+\n+\t\tmode &= ~(\n+\t\t\tENABLE_LINE_INPUT |      /* no line buffering */\n+\t\t\tENABLE_ECHO_INPUT |      /* no echo */\n+\t\t\tENABLE_PROCESSED_INPUT | /* pass Ctrl+C to program */\n+\t\t\tENABLE_MOUSE_INPUT |     /* no mouse events */\n+\t\t\tENABLE_WINDOW_INPUT);    /* no window resize events */\n+\t\tmode |= ENABLE_VIRTUAL_TERMINAL_INPUT;\n+\t\tSetConsoleMode(handle, mode);\n+\t}\n+\n+\t/* Detect console output and make it emulate VT100. */\n+\thandle = GetStdHandle(STD_OUTPUT_HANDLE);\n+\tif (GetConsoleMode(handle, &mode)) {\n+\t\tcl->oldterm.is_console_output = 1;\n+\t\tcl->oldterm.output_mode = mode;\n+\n+\t\tmode &= ~ENABLE_WRAP_AT_EOL_OUTPUT;\n+\t\tmode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;\n+\t\tSetConsoleMode(handle, mode);\n+\t}\n+}\n+\n+void\n+terminal_restore(const struct cmdline *cl)\n+{\n+\tif (cl->oldterm.is_console_input) {\n+\t\tHANDLE handle = GetStdHandle(STD_INPUT_HANDLE);\n+\t\tSetConsoleMode(handle, cl->oldterm.input_mode);\n+\t}\n+\n+\tif (cl->oldterm.is_console_output) {\n+\t\tHANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);\n+\t\tSetConsoleMode(handle, cl->oldterm.output_mode);\n+\t}\n+}\n+\n+static int\n+cmdline_is_key_down(const INPUT_RECORD *record)\n+{\n+\treturn (record->EventType == KEY_EVENT) &&\n+\t\trecord->Event.KeyEvent.bKeyDown;\n+}\n+\n+static int\n+cmdline_poll_char_console(HANDLE handle)\n+{\n+\tINPUT_RECORD record;\n+\tDWORD events;\n+\n+\tif (!PeekConsoleInput(handle, &record, 1, &events)) {\n+\t\t/* Simulate poll(3) behavior on EOF. */\n+\t\treturn (GetLastError() == ERROR_HANDLE_EOF) ? 1 : -1;\n+\t}\n+\n+\tif ((events == 0) || !cmdline_is_key_down(&record))\n+\t\treturn 0;\n+\n+\treturn 1;\n+}\n+\n+static int\n+cmdline_poll_char_file(struct cmdline *cl, HANDLE handle)\n+{\n+\tDWORD type = GetFileType(handle);\n+\n+\t/* Since console is handled by cmdline_poll_char_console(),\n+\t * this is either a serial port or input handle had been replaced.\n+\t */\n+\tif (type == FILE_TYPE_CHAR)\n+\t\treturn cmdline_poll_char_console(handle);\n+\n+\t/* PeekNamedPipe() can handle all pipes and also sockets. */\n+\tif (type == FILE_TYPE_PIPE) {\n+\t\tDWORD bytes_avail;\n+\t\tif (!PeekNamedPipe(handle, NULL, 0, NULL, &bytes_avail, NULL))\n+\t\t\treturn (GetLastError() == ERROR_BROKEN_PIPE) ? 1 : -1;\n+\t\treturn bytes_avail ? 1 : 0;\n+\t}\n+\n+\t/* There is no straightforward way to peek a file in Windows\n+\t * I/O model. Read the byte, if it is not the end of file,\n+\t * buffer it for subsequent read. This will not work with\n+\t * a file being appended and probably some other edge cases.\n+\t */\n+\tif (type == FILE_TYPE_DISK) {\n+\t\tchar c;\n+\t\tint ret;\n+\n+\t\tret = _read(cl->s_in, &c, sizeof(c));\n+\t\tif (ret == 1) {\n+\t\t\tcl->repeat_count = 1;\n+\t\t\tcl->repeated_char = c;\n+\t\t}\n+\t\treturn ret;\n+\t}\n+\n+\t/* GetFileType() failed or file of unknown type,\n+\t * which we do not know how to peek anyway.\n+\t */\n+\treturn -1;\n+}\n+\n+int\n+cmdline_poll_char(struct cmdline *cl)\n+{\n+\tHANDLE handle = (HANDLE)_get_osfhandle(cl->s_in);\n+\treturn cl->oldterm.is_console_input ?\n+\t\tcmdline_poll_char_console(handle) :\n+\t\tcmdline_poll_char_file(cl, handle);\n+}\n+\n+ssize_t\n+cmdline_read_char(struct cmdline *cl, char *c)\n+{\n+\tHANDLE handle;\n+\tINPUT_RECORD record;\n+\tKEY_EVENT_RECORD *key;\n+\tDWORD events;\n+\n+\tif (!cl->oldterm.is_console_input)\n+\t\treturn _read(cl->s_in, c, 1);\n+\n+\t/* Return repeated strokes from previous event. */\n+\tif (cl->repeat_count > 0) {\n+\t\t*c = cl->repeated_char;\n+\t\tcl->repeat_count--;\n+\t\treturn 1;\n+\t}\n+\n+\thandle = (HANDLE)_get_osfhandle(cl->s_in);\n+\tkey = &record.Event.KeyEvent;\n+\tdo {\n+\t\tif (!ReadConsoleInput(handle, &record, 1, &events)) {\n+\t\t\tif (GetLastError() == ERROR_HANDLE_EOF) {\n+\t\t\t\t*c = EOF;\n+\t\t\t\treturn 0;\n+\t\t\t}\n+\t\t\treturn -1;\n+\t\t}\n+\t} while (!cmdline_is_key_down(&record));\n+\n+\t*c = key->uChar.AsciiChar;\n+\n+\t/* Save repeated strokes from a single event. */\n+\tif (key->wRepeatCount > 1) {\n+\t\tcl->repeated_char = *c;\n+\t\tcl->repeat_count = key->wRepeatCount - 1;\n+\t}\n+\n+\treturn 1;\n+}\n+\n+int\n+cmdline_vdprintf(int fd, const char *format, va_list op)\n+{\n+\tint copy, ret;\n+\tFILE *file;\n+\n+\tcopy = _dup(fd);\n+\tif (copy < 0)\n+\t\treturn -1;\n+\n+\tfile = _fdopen(copy, \"a\");\n+\tif (file == NULL) {\n+\t\t_close(copy);\n+\t\treturn -1;\n+\t}\n+\n+\tret = vfprintf(file, format, op);\n+\n+\tfclose(file); /* also closes copy */\n+\n+\treturn ret;\n+}\ndiff --git a/lib/librte_cmdline/cmdline_parse.c b/lib/librte_cmdline/cmdline_parse.c\nindex f120f19dd..fe366841c 100644\n--- a/lib/librte_cmdline/cmdline_parse.c\n+++ b/lib/librte_cmdline/cmdline_parse.c\n@@ -15,7 +15,7 @@\n \n #include <rte_string_fns.h>\n \n-#include \"cmdline.h\"\n+#include \"cmdline_private.h\"\n \n #ifdef RTE_LIBRTE_CMDLINE_DEBUG\n #define debug_printf printf\ndiff --git a/lib/librte_cmdline/cmdline_private.h b/lib/librte_cmdline/cmdline_private.h\nindex 4d9ea33f0..a8a6ee9e6 100644\n--- a/lib/librte_cmdline/cmdline_private.h\n+++ b/lib/librte_cmdline/cmdline_private.h\n@@ -8,9 +8,32 @@\n #include <stdarg.h>\n \n #include <rte_common.h>\n+#ifdef RTE_EXEC_ENV_WINDOWS\n+#include <rte_windows.h>\n+#endif\n \n #include <cmdline.h>\n \n+#ifdef RTE_EXEC_ENV_WINDOWS\n+struct terminal {\n+\tDWORD input_mode;\n+\tDWORD output_mode;\n+\tint is_console_input;\n+\tint is_console_output;\n+};\n+\n+struct cmdline {\n+\tint s_in;\n+\tint s_out;\n+\tcmdline_parse_ctx_t *ctx;\n+\tstruct rdline rdl;\n+\tchar prompt[RDLINE_PROMPT_SIZE];\n+\tstruct terminal oldterm;\n+\tchar repeated_char;\n+\tWORD repeat_count;\n+};\n+#endif\n+\n /* Disable buffering and echoing, save previous settings to oldterm. */\n void terminal_adjust(struct cmdline *cl);\n \ndiff --git a/lib/librte_cmdline/cmdline_socket.c b/lib/librte_cmdline/cmdline_socket.c\nindex 998e8ade2..0fe149700 100644\n--- a/lib/librte_cmdline/cmdline_socket.c\n+++ b/lib/librte_cmdline/cmdline_socket.c\n@@ -16,6 +16,10 @@\n #include \"cmdline_private.h\"\n #include \"cmdline_socket.h\"\n \n+#ifdef RTE_EXEC_ENV_WINDOWS\n+#define open _open\n+#endif\n+\n struct cmdline *\n cmdline_file_new(cmdline_parse_ctx_t *ctx, const char *prompt, const char *path)\n {\ndiff --git a/lib/librte_cmdline/cmdline_vt100.h b/lib/librte_cmdline/cmdline_vt100.h\nindex e33e67ed8..be9ae8e1c 100644\n--- a/lib/librte_cmdline/cmdline_vt100.h\n+++ b/lib/librte_cmdline/cmdline_vt100.h\n@@ -31,7 +31,11 @@ extern \"C\" {\n #define vt100_multi_right  \"\\033\\133%uC\"\n #define vt100_multi_left   \"\\033\\133%uD\"\n #define vt100_suppr        \"\\033\\133\\063\\176\"\n+#ifndef RTE_EXEC_ENV_WINDOWS\n #define vt100_home         \"\\033M\\033E\"\n+#else\n+#define vt100_home         \"\\033M\\033[E\"\n+#endif\n #define vt100_word_left    \"\\033\\142\"\n #define vt100_word_right   \"\\033\\146\"\n \ndiff --git a/lib/librte_cmdline/meson.build b/lib/librte_cmdline/meson.build\nindex 5c9e8886d..5009b3354 100644\n--- a/lib/librte_cmdline/meson.build\n+++ b/lib/librte_cmdline/meson.build\n@@ -25,7 +25,9 @@ headers = files('cmdline.h',\n \t'cmdline_cirbuf.h',\n \t'cmdline_parse_portlist.h')\n \n-if not is_windows\n+if is_windows\n+\tsources += files('cmdline_os_windows.c')\n+else\n \tsources += files('cmdline_os_unix.c')\n endif\n \ndiff --git a/lib/meson.build b/lib/meson.build\nindex d8b358e5f..ed66590a7 100644\n--- a/lib/meson.build\n+++ b/lib/meson.build\n@@ -42,6 +42,7 @@ if is_windows\n \t\t'eal',\n \t\t'ring',\n \t\t'mempool', 'mbuf', 'net', 'meter', 'ethdev', 'pci',\n+\t\t'cmdline',\n \t] # only supported libraries for windows\n endif\n \n",
    "prefixes": [
        "v3",
        "6/7"
    ]
}