qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Anthony Liguori <anthony@codemonkey.ws>
To: Paolo Bonzini <bonzini@gnu.org>
Cc: qemu-devel@nongnu.org, Luiz Capitulino <lcapitulino@redhat.com>
Subject: [Qemu-devel] Re: [PATCH 01/10] Introduce qmisc module
Date: Fri, 16 Oct 2009 20:49:45 -0500	[thread overview]
Message-ID: <4AD922B9.50902@codemonkey.ws> (raw)
In-Reply-To: <4AD910BA.4090607@gnu.org>

Paolo Bonzini wrote:
> On 10/16/2009 11:37 PM, Anthony Liguori wrote:
>>
>> I already am :-)  Stay tuned, I should have a patch later this 
>> afternoon.
>
> Was it a race?  (Seriously, sorry I didn't notice a couple of hours ago).
>
> This one is ~5% slower than the "Evil" one, but half the size.  Tested 
> against the comments.json file from the "Evil" parser and with 
> valgrind too.  Does all the funky Unicode stuff too.
>
> Paolo
> /*
>  * An event-based, asynchronous JSON parser.
>  *
>  * Copyright (C) 2009 Red Hat Inc.
>  *
>  * Authors:
>  *  Paolo Bonzini <pbonzini@redhat.com>
>  *
>  * Permission is hereby granted, free of charge, to any person obtaining a copy
>  * of this software and associated documentation files (the "Software"), to deal
>  * in the Software without restriction, including without limitation the rights
>  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
>  * copies of the Software, and to permit persons to whom the Software is
>  * furnished to do so, subject to the following conditions:
>  * 
>  * The above copyright notice and this permission notice shall be included in
>  * all copies or substantial portions of the Software.
>  *
>  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
>  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
>  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
>  * SOFTWARE.
>  */
>
>
> #include "json.h"
> #include <string.h>
> #include <stdlib.h>
>
> /* Common character classes.  */
>
> #define CASE_XDIGIT \
>         case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': \
>         case 'A': case 'B': case 'C': case 'D': case 'E': case 'F'
>
> #define CASE_DIGIT \
>         case '0': case '1': case '2': case '3': case '4': \
>         case '5': case '6': case '7': case '8': case '9'
>
> /* Helper function to go from \uXXXX-encoded UTF-16 to UTF-8.  */
>
> static bool hex_to_utf8 (char *buf, char **dest, char *src)
> {
>     int i, n;
>     uint8_t *p;
>
>     for (i = n = 0; i < 4; i++) {
>         n <<= 4;
>         switch (src[i])
>         {
>         CASE_DIGIT: n |= src[i] - '0'; break;
>         CASE_XDIGIT: n |= (src[i] & ~32) - 'A' + 10; break;
>         default: return false;
>         }
>     }
>
>     p = (uint8_t *)*dest;
>     if (n < 128) {
>         *p++ = n;
>     } else if (n < 2048) {
>         *p++ = 0xC0 | (n >> 6);
>         *p++ = 0x80 | (n & 63);
>     } else if (n < 0xDC00 || n > 0xDFFF) {
>         *p++ = 0xE0 | (n >> 12);
>         *p++ = 0x80 | ((n >> 6) & 63);
>         *p++ = 0x80 | (n & 63);
>     } else {
>         /* Merge with preceding high surrogate.  */
>         if (p - (uint8_t *)buf < 3
>             || p[-3] != 0xED
>             || p[-2] < 0xA0 || p[-2] > 0xAF) /* 0xD800..0xDBFF */
>             return false;
>
>         n += 0x10000 - 0xDC00;
>         n |= ((p[-2] & 15) << 16) | ((p[-1] & 63) << 10);
>
>         /* Overwrite high surrogate.  */
>         p[-3] = 0xF0 | (n >> 18);
>         p[-2] = 0x80 | ((n >> 12) & 63);
>         p[-1] = 0x80 | ((n >> 6) & 63);
>         *p++ = 0x80 | (n & 63);
>     }
>     *dest = (char *)p;
>     return true;
> }
>
> struct json_parser {
>     struct    json_parser_config c;
>     size_t    n, alloc;
>     char      *buf;
>     size_t    sp;
>     uint32_t  state, stack[128];
>     char      start_buffer[4];
> };
>   

Having an explicit stack is unnecessary I think.  You can use a very 
simple scheme to detect the end of messages by simply counting {}, [], 
and being aware of the lexical rules.

Regards,

Anthony Liguori

  parent reply	other threads:[~2009-10-17  1:49 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-10-08 21:35 [Qemu-devel] [PATCH v0 00/10]: More QObject conversions Luiz Capitulino
2009-10-08 21:35 ` [Qemu-devel] [PATCH 01/10] Introduce qmisc module Luiz Capitulino
2009-10-15 14:02   ` Anthony Liguori
2009-10-15 15:26     ` Luiz Capitulino
2009-10-15 15:35       ` Anthony Liguori
2009-10-15 17:17         ` Luiz Capitulino
2009-10-15 18:33           ` Anthony Liguori
2009-10-15 18:45           ` Anthony Liguori
2009-10-15 16:39       ` Daniel P. Berrange
2009-10-15 16:46         ` Daniel P. Berrange
2009-10-15 17:28         ` Luiz Capitulino
2009-10-15 18:34           ` Anthony Liguori
2009-10-16 13:24             ` [Qemu-devel] " Paolo Bonzini
2009-10-16 13:45               ` Anthony Liguori
2009-10-16 17:35                 ` Paolo Bonzini
2009-10-16 17:38                   ` Anthony Liguori
2009-10-16 19:36                     ` Paolo Bonzini
2009-10-16 21:37                       ` Anthony Liguori
2009-10-17  0:32                         ` Paolo Bonzini
2009-10-17  0:38                           ` malc
2009-10-17  0:46                             ` Paolo Bonzini
2009-10-17  1:49                           ` Anthony Liguori [this message]
2009-10-17  1:50                           ` Anthony Liguori
2009-10-17  7:48                             ` Paolo Bonzini
2009-10-17 10:01                             ` Vincent Hanquez
2009-10-18 14:06                               ` Luiz Capitulino
2009-10-18 14:08                                 ` Paolo Bonzini
2009-10-18 14:49                                   ` Anthony Liguori
2009-10-18 15:18                                     ` Luiz Capitulino
2009-10-18 15:25                                       ` Paolo Bonzini
2009-10-18 16:05                                         ` Luiz Capitulino
2009-10-18 16:32                                           ` Anthony Liguori
2009-10-18 18:04                                             ` Paolo Bonzini
2009-10-18 22:00                                             ` Luiz Capitulino
2009-10-18 16:26                                     ` Anthony Liguori
2009-10-18 17:32                                       ` Vincent Hanquez
2009-10-18 21:24                                         ` Anthony Liguori
2009-10-18 15:06                                 ` Vincent Hanquez
2009-10-18 15:35                                   ` Luiz Capitulino
2009-10-18 15:39                                     ` Paolo Bonzini
2009-10-18 16:56                                     ` Vincent Hanquez
2009-10-18 16:29                                   ` Anthony Liguori
2009-10-18 16:46                                     ` Vincent Hanquez
2009-10-18 17:59                                       ` Paolo Bonzini
2009-10-08 21:35 ` [Qemu-devel] [PATCH 02/10] monitor: Convert do_memory_save() to QObject Luiz Capitulino
2009-10-08 21:35 ` [Qemu-devel] [PATCH 03/10] monitor: Convert do_physical_memory_save() " Luiz Capitulino
2009-10-08 21:35 ` [Qemu-devel] [PATCH 04/10] monitor: Convert do_migrate() " Luiz Capitulino
2009-10-08 21:35 ` [Qemu-devel] [PATCH 05/10] monitor: Convert do_migrate_set_speed() " Luiz Capitulino
2009-10-08 21:35 ` [Qemu-devel] [PATCH 06/10] monitor: Convert do_migrate_cancel() " Luiz Capitulino
2009-10-08 21:35 ` [Qemu-devel] [PATCH 07/10] monitor: Convert do_info_migrate() " Luiz Capitulino
2009-10-10 12:11   ` Markus Armbruster
2009-10-15 14:07   ` Anthony Liguori
2009-10-08 21:35 ` [Qemu-devel] [PATCH 08/10] monitor: Convert bdrv_info() " Luiz Capitulino
2009-10-10 12:18   ` Markus Armbruster
2009-10-14 13:23     ` Luiz Capitulino
2009-10-14 14:11       ` Markus Armbruster
2009-10-15 14:13   ` Anthony Liguori
2009-10-08 21:35 ` [Qemu-devel] [PATCH 09/10] monitor: Convert pci_device_hot_add() " Luiz Capitulino
2009-10-08 21:35 ` [Qemu-devel] [PATCH 10/10] monitor: Convert do_pci_device_hot_remove() " Luiz Capitulino
2009-10-10 12:31 ` [Qemu-devel] [PATCH v0 00/10]: More QObject conversions Markus Armbruster
2009-10-11 14:48   ` Luiz Capitulino
2009-10-12 15:36     ` Markus Armbruster

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4AD922B9.50902@codemonkey.ws \
    --to=anthony@codemonkey.ws \
    --cc=bonzini@gnu.org \
    --cc=lcapitulino@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).