124 lines
4.9 KiB
C
124 lines
4.9 KiB
C
/*
|
|
* Copyright 2010, R. Tyler Ballance <tyler@monkeypox.org>
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are
|
|
* met:
|
|
*
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
*
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in
|
|
* the documentation and/or other materials provided with the
|
|
* distribution.
|
|
*
|
|
* 3. Neither the name of R. Tyler Ballance nor the names of its
|
|
* contributors may be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
|
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
#include <yajl_encode.h>
|
|
|
|
|
|
/*
|
|
* This code was yanked largely from yajl_gen.c
|
|
* it is merely a set of hacks
|
|
*/
|
|
|
|
typedef enum {
|
|
yajl_gen_start,
|
|
yajl_gen_map_start,
|
|
yajl_gen_map_key,
|
|
yajl_gen_map_val,
|
|
yajl_gen_array_start,
|
|
yajl_gen_in_array,
|
|
yajl_gen_complete,
|
|
yajl_gen_error
|
|
} yajl_gen_state;
|
|
|
|
struct yajl_gen_t
|
|
{
|
|
unsigned int depth;
|
|
unsigned int pretty;
|
|
const char * indentString;
|
|
yajl_gen_state state[YAJL_MAX_DEPTH];
|
|
yajl_print_t print;
|
|
void * ctx; /* yajl_buf */
|
|
/* memory allocation routines */
|
|
yajl_alloc_funcs alloc;
|
|
};
|
|
|
|
#define INSERT_SEP \
|
|
if (g->state[g->depth] == yajl_gen_map_key || \
|
|
g->state[g->depth] == yajl_gen_in_array) { \
|
|
g->print(g->ctx, ",", 1); \
|
|
if (g->pretty) g->print(g->ctx, "\n", 1); \
|
|
} else if (g->state[g->depth] == yajl_gen_map_val) { \
|
|
g->print(g->ctx, ":", 1); \
|
|
if (g->pretty) g->print(g->ctx, " ", 1); \
|
|
}
|
|
|
|
#define INSERT_WHITESPACE \
|
|
if (g->pretty) { \
|
|
if (g->state[g->depth] != yajl_gen_map_val) { \
|
|
unsigned int _i; \
|
|
for (_i=0;_i<g->depth;_i++) \
|
|
g->print(g->ctx, g->indentString, \
|
|
strlen(g->indentString)); \
|
|
} \
|
|
}
|
|
/* check that we're not complete, or in error state. in a valid state
|
|
* to be generating */
|
|
#define ENSURE_VALID_STATE \
|
|
if (g->state[g->depth] == yajl_gen_error) { \
|
|
return yajl_gen_in_error_state;\
|
|
} else if (g->state[g->depth] == yajl_gen_complete) { \
|
|
return yajl_gen_generation_complete; \
|
|
}
|
|
|
|
#define APPENDED_ATOM \
|
|
switch (g->state[g->depth]) { \
|
|
case yajl_gen_start: \
|
|
g->state[g->depth] = yajl_gen_complete; \
|
|
break; \
|
|
case yajl_gen_map_start: \
|
|
case yajl_gen_map_key: \
|
|
g->state[g->depth] = yajl_gen_map_val; \
|
|
break; \
|
|
case yajl_gen_array_start: \
|
|
g->state[g->depth] = yajl_gen_in_array; \
|
|
break; \
|
|
case yajl_gen_map_val: \
|
|
g->state[g->depth] = yajl_gen_map_key; \
|
|
break; \
|
|
default: \
|
|
break; \
|
|
} \
|
|
|
|
#define FINAL_NEWLINE \
|
|
if (g->pretty && g->state[g->depth] == yajl_gen_complete) \
|
|
g->print(g->ctx, "\n", 1);
|
|
|
|
yajl_gen_status yajl_gen_raw_string(yajl_gen g, const unsigned char * str, unsigned int len)
|
|
{
|
|
ENSURE_VALID_STATE; INSERT_SEP; INSERT_WHITESPACE;
|
|
g->print(g->ctx, "\"", 1);
|
|
g->print(g->ctx, str, len);
|
|
g->print(g->ctx, "\"", 1);
|
|
APPENDED_ATOM;
|
|
FINAL_NEWLINE;
|
|
return yajl_gen_status_ok;
|
|
}
|