Skip to content

Commit

Permalink
Implements XML-RPC and some cleanups. Not tested yet.
Browse files Browse the repository at this point in the history
  • Loading branch information
skinkie committed Oct 21, 2011
1 parent 9b08b1b commit 0aa0b71
Show file tree
Hide file tree
Showing 2 changed files with 184 additions and 75 deletions.
258 changes: 183 additions & 75 deletions cherokee/dwriter.c
Expand Up @@ -28,73 +28,113 @@
#define CS (w->state[w->depth])
#define OUT (w->buf)

#define ADD_SEP \
do { \
if ((CS == dwriter_dict_key) || \
(CS == dwriter_list_in)) \
{ \
cherokee_buffer_add_str (OUT, ","); \
if (w->pretty) \
cherokee_buffer_add_str(OUT, "\n"); \
} else if (CS == dwriter_dict_val) { \
if ((w->lang == dwriter_php) || \
(w->lang == dwriter_ruby)) \
cherokee_buffer_add_str (OUT, "=>"); \
else \
cherokee_buffer_add_str (OUT, ":"); \
if (w->pretty) \
cherokee_buffer_add_str (OUT, " "); \
} \
#define ADD_SEP \
do { \
if (w->lang == dwriter_xmlrpc) { \
if (CS == dwriter_dict_key || \
CS == dwriter_dict_start ) { \
if (w->pretty) \
cherokee_buffer_add_str (OUT, "\t"); \
cherokee_buffer_add_str (OUT, "<member>"); \
if (w->pretty) \
cherokee_buffer_add_str (OUT, "\n\t\t"); \
cherokee_buffer_add_str (OUT, "<name>"); \
} else if (CS == dwriter_list_in || \
CS == dwriter_dict_val || \
CS == dwriter_list_start) { \
if (w->pretty) \
cherokee_buffer_add_str (OUT, "\t\t"); \
cherokee_buffer_add_str (OUT, "<value>"); \
} \
} else { \
if ((CS == dwriter_dict_key) || \
(CS == dwriter_list_in)) { \
cherokee_buffer_add_str (OUT, ","); \
if (w->pretty) \
cherokee_buffer_add_str(OUT, "\n"); \
} else if (CS == dwriter_dict_val) { \
if ((w->lang == dwriter_php) || \
(w->lang == dwriter_ruby)) \
cherokee_buffer_add_str (OUT, "=>"); \
else \
cherokee_buffer_add_str (OUT, ":"); \
if (w->pretty) \
cherokee_buffer_add_str (OUT, " "); \
} \
} \
} while(0);

#define ADD_WHITE \
do { \
unsigned int i; \
if (w->pretty && w->lang != dwriter_csv && \
w->lang != dwriter_xmlrpc) { \
if (CS != dwriter_dict_val) { \
for (i=0; i<w->depth; i++) \
cherokee_buffer_add_str (OUT, " "); \
} \
} \
} while(0)

#define ADD_WHITE \
do { \
unsigned int i; \
if (w->pretty && w->lang != dwriter_csv) { \
if (CS != dwriter_dict_val) { \
for (i=0; i<w->depth; i++) \
cherokee_buffer_add_str (OUT, " "); \
} \
} \
#define ADD_END \
do { \
if (w->lang == dwriter_xmlrpc) { \
switch (CS) { \
case dwriter_dict_start: \
case dwriter_dict_key: \
cherokee_buffer_add_str (OUT, "</name>"); \
break; \
case dwriter_dict_val: \
cherokee_buffer_add_str (OUT, "</value>"); \
if (w->pretty) \
cherokee_buffer_add_str (OUT, "\n\t"); \
cherokee_buffer_add_str (OUT, "</member>"); \
break; \
case dwriter_list_in: \
case dwriter_list_start: \
cherokee_buffer_add_str (OUT, "</value>"); \
default: \
break; \
} \
} else { \
switch(CS) { \
case dwriter_start: \
CS = dwriter_complete; \
break; \
case dwriter_dict_start: \
case dwriter_dict_key: \
CS = dwriter_dict_val; \
break; \
case dwriter_list_start: \
CS = dwriter_list_in; \
break; \
case dwriter_dict_val: \
CS = dwriter_dict_key; \
break; \
default: \
break; \
} \
} \
} while(0)

#define ADD_END \
do { \
switch(CS) { \
case dwriter_start: \
CS = dwriter_complete; \
break; \
case dwriter_dict_start: \
case dwriter_dict_key: \
CS = dwriter_dict_val; \
break; \
case dwriter_list_start: \
CS = dwriter_list_in; \
break; \
case dwriter_dict_val: \
CS = dwriter_dict_key; \
break; \
default: \
break; \
} \
} while(0)

#define ADD_NEW_LINE \
if ((w->pretty) && (CS == dwriter_complete)) \
cherokee_buffer_add_str (OUT, "\n")
#define ADD_NEW_LINE \
if (w->pretty && (w->lang == dwriter_xmlrpc || \
CS == dwriter_dict_start || \
CS == dwriter_list_start || \
CS == dwriter_complete)) \
cherokee_buffer_add_str (OUT, "\n"); \


#define ENSURE_NOT_KEY \
if (CS == dwriter_dict_key) \
#define ENSURE_NOT_KEY \
if (CS == dwriter_dict_key) \
return ret_error

#define ENSURE_VALID_STATE \
if ((CS == dwriter_error) || (CS == dwriter_error)) \
return ret_error

#define INCREMENT_DEPTH \
w->depth += 1; \
if (w->depth >= DWRITER_STACK_LEN) \
#define INCREMENT_DEPTH \
w->depth += 1; \
if (w->depth >= DWRITER_STACK_LEN) \
return ret_error


Expand Down Expand Up @@ -188,7 +228,11 @@ cherokee_dwriter_integer (cherokee_dwriter_t *w, unsigned long l)
ENSURE_VALID_STATE; ENSURE_NOT_KEY;
ADD_SEP; ADD_WHITE;

cherokee_buffer_add_va (OUT, "%lu", l);
if (w->lang == dwriter_xmlrpc) {
cherokee_buffer_add_va (OUT, "<int>%lu</int>", l);
} else {
cherokee_buffer_add_va (OUT, "%lu", l);
}

ADD_END; ADD_NEW_LINE;
return ret_ok;
Expand All @@ -208,7 +252,13 @@ cherokee_dwriter_double (cherokee_dwriter_t *w, double d)
if (re <= 0)
return ret_error;

cherokee_buffer_add (OUT, tmp, re);
if (w->lang == dwriter_xmlrpc) {
cherokee_buffer_add_str (OUT, "<double>");
cherokee_buffer_add (OUT, tmp, re);
cherokee_buffer_add_str (OUT, "</double>");
} else {
cherokee_buffer_add (OUT, tmp, re);
}

ADD_END; ADD_NEW_LINE;
return ret_ok;
Expand All @@ -219,8 +269,14 @@ cherokee_dwriter_number (cherokee_dwriter_t *w, const char *s, int len)
{
ENSURE_VALID_STATE; ENSURE_NOT_KEY;
ADD_SEP; ADD_WHITE;

cherokee_buffer_add (OUT, s, len);

if (w->lang == dwriter_xmlrpc) {
cherokee_buffer_add_str (OUT, "<int>");
cherokee_buffer_add (OUT, s, len);
cherokee_buffer_add_str (OUT, "</int>");
} else {
cherokee_buffer_add (OUT, s, len);
}

ADD_END; ADD_NEW_LINE;
return ret_ok;
Expand All @@ -242,6 +298,9 @@ add_null (cherokee_dwriter_t *w)
case dwriter_ruby:
cherokee_buffer_add_str (OUT, "nil");
break;
case dwriter_xmlrpc:
cherokee_buffer_add_str (OUT, "<nil/>");
break;
case dwriter_csv:
break;
default:
Expand Down Expand Up @@ -272,13 +331,34 @@ cherokee_dwriter_string (cherokee_dwriter_t *w, const char *s, int len)
goto out;
}

cherokee_buffer_add_str (OUT, "\"");
if (w->lang == dwriter_xmlrpc) {
cherokee_buffer_t buf = CHEROKEE_BUF_INIT;
cherokee_buffer_add (&buf, s, len);

/* XML Encoding, as you see with &, sequence matters! */
cherokee_buffer_replace_string(&buf, "&", 1, "&amp;", 5);
cherokee_buffer_replace_string(&buf, "<", 1, "&lt;", 4);
cherokee_buffer_replace_string(&buf, ">", 1, "&gt;", 4);
cherokee_buffer_replace_string(&buf, "'", 1, "&apos;", 6);
cherokee_buffer_replace_string(&buf, "\"", 1,"&quot;", 6);

if (CS == dwriter_dict_val || CS == dwriter_list_in || CS == dwriter_list_start) {
cherokee_buffer_add_str (OUT, "<string>");
cherokee_buffer_add_buffer (OUT, &buf);
cherokee_buffer_add_str (OUT, "</string>");
} else {
cherokee_buffer_add_buffer (OUT, &buf);
}

escape_string (w->tmp, s, len);
cherokee_buffer_add (OUT, w->tmp->buf, w->tmp->len);
cherokee_buffer_mrproper(&buf);
} else {
cherokee_buffer_add_str (OUT, "\"");

cherokee_buffer_add_str (OUT, "\"");
escape_string (w->tmp, s, len);
cherokee_buffer_add (OUT, w->tmp->buf, w->tmp->len);

cherokee_buffer_add_str (OUT, "\"");
}
out:
ADD_END; ADD_NEW_LINE;
return ret_ok;
Expand Down Expand Up @@ -311,6 +391,11 @@ cherokee_dwriter_bool (cherokee_dwriter_t *w, cherokee_boolean_t b)
else
cherokee_buffer_add_str (OUT, "FALSE");
break;
case dwriter_xmlrpc:
cherokee_buffer_add_str (OUT, "<boolean>");
cherokee_buffer_add_str (OUT, b ? "1" : "0");
cherokee_buffer_add_str (OUT, "</boolean>");
break;
default:
SHOULDNT_HAPPEN;
}
Expand Down Expand Up @@ -338,15 +423,15 @@ cherokee_dwriter_dict_open (cherokee_dwriter_t *w)
case dwriter_php:
cherokee_buffer_add_str (OUT, "array(");
break;
case dwriter_xmlrpc:
cherokee_buffer_add_str (OUT, "<struct>");
break;
case dwriter_csv:
break;
default:
SHOULDNT_HAPPEN;
}

if (w->pretty)
cherokee_buffer_add_str (OUT, "\n");

ADD_NEW_LINE;
return ret_ok;
}
Expand All @@ -358,20 +443,25 @@ cherokee_dwriter_dict_close (cherokee_dwriter_t *w)
ENSURE_VALID_STATE;

w->depth -= 1;
if (w->pretty)
cherokee_buffer_add_str (OUT, "\n");

ADD_END; ADD_WHITE;

switch (w->lang) {
case dwriter_json:
case dwriter_python:
case dwriter_ruby:
if (w->pretty)
cherokee_buffer_add_str (OUT, "\n");
cherokee_buffer_add_str (OUT, "}");
break;
case dwriter_php:
if (w->pretty)
cherokee_buffer_add_str (OUT, "\n");
cherokee_buffer_add_str (OUT, ")");
break;
case dwriter_xmlrpc:
cherokee_buffer_add_str (OUT, "</struct>");
break;
case dwriter_csv:
break;
default:
Expand Down Expand Up @@ -401,27 +491,28 @@ cherokee_dwriter_list_open (cherokee_dwriter_t *w)
case dwriter_php:
cherokee_buffer_add_str (OUT, "array(");
break;
case dwriter_xmlrpc:
cherokee_buffer_add_str (OUT, "<array>");
if (w->pretty)
cherokee_buffer_add_str (OUT, "\n\t");
cherokee_buffer_add_str (OUT, "<data>");
break;
case dwriter_csv:
break;
default:
SHOULDNT_HAPPEN;
}

if (w->pretty)
cherokee_buffer_add_str (OUT, "\n");

ADD_NEW_LINE;
return ret_ok;
}



ret_t
cherokee_dwriter_list_close (cherokee_dwriter_t *w)
{
ENSURE_VALID_STATE;

if (w->pretty)
cherokee_buffer_add_str (OUT, "\n");
w->depth -= 1;

ADD_END; ADD_WHITE;
Expand All @@ -430,11 +521,23 @@ cherokee_dwriter_list_close (cherokee_dwriter_t *w)
case dwriter_json:
case dwriter_python:
case dwriter_ruby:
if (w->pretty)
cherokee_buffer_add_str (OUT, "\n");
cherokee_buffer_add_str (OUT, "]");
break;
case dwriter_php:
if (w->pretty)
cherokee_buffer_add_str (OUT, "\n");
cherokee_buffer_add_str (OUT, ")");
break;
case dwriter_xmlrpc:
if (w->pretty)
cherokee_buffer_add_str (OUT, "\t");
cherokee_buffer_add_str (OUT, "</data>");
if (w->pretty)
cherokee_buffer_add_str (OUT, "\n");
cherokee_buffer_add_str (OUT, "</array>");
break;
case dwriter_csv:
cherokee_buffer_add_str (OUT, "\n");
break;
Expand Down Expand Up @@ -471,6 +574,11 @@ cherokee_dwriter_lang_to_type (cherokee_buffer_t *buf,
return ret_ok;
}

if (equal_buf_str (buf, "xmlrpc")) {
*lang = dwriter_xmlrpc;
return ret_ok;
}

if (equal_buf_str (buf, "csv")) {
*lang = dwriter_csv;
return ret_ok;
Expand Down

0 comments on commit 0aa0b71

Please sign in to comment.