Skip to content

Commit

Permalink
Add qp_printf for printing qp data to a stream.
Browse files Browse the repository at this point in the history
  • Loading branch information
Jeroen van der Heijden committed Aug 28, 2017
1 parent 48496c9 commit b2a4b48
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 32 deletions.
9 changes: 8 additions & 1 deletion ChangeLog
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
libqpack (0.10.1)

* Added qp_fprint() for printing qp data to a stream. As far as possible
the output is made JSON compatible.

-- Jeroen van der Heijden <jeroen@transceptor.technology> 28 Aug 2017

libqpack (0.10.0)

* Addedd __cplusplus macro for c++ compatibility.
* Added __cplusplus macro for c++ compatibility.

* Renamed qp_res_via_t member bool to boolean.

Expand Down
81 changes: 53 additions & 28 deletions qpack.c
Original file line number Diff line number Diff line change
Expand Up @@ -111,9 +111,11 @@ if (unpacker->pt + size > unpacker->end) \
}

static qp_types_t QP_print_unpacker(
FILE * stream,
qp_types_t tp,
qp_unpacker_t * unpacker,
qp_obj_t * qp_obj);
static void QP_fprint_raw(FILE * stream, const char * s, size_t n);
static int QP_res(qp_unpacker_t * unpacker, qp_res_t * res, qp_obj_t * val);
static void QP_res_destroy(qp_res_t * res);

Expand Down Expand Up @@ -933,15 +935,38 @@ qp_res_t * qp_unpacker_res(qp_unpacker_t * unpacker, int * rc)
}

void qp_print(const unsigned char * data, size_t len)
{
qp_fprint(stdout, data, len);
printf("\n");
}

void qp_fprint(FILE * stream, const unsigned char * data, size_t len)
{
qp_obj_t qp_obj;
qp_unpacker_t unpacker;
qp_unpacker_init(&unpacker, data, len);
QP_print_unpacker(qp_next(&unpacker, &qp_obj), &unpacker, &qp_obj);
printf("\n");
QP_print_unpacker(stream, qp_next(&unpacker, &qp_obj), &unpacker, &qp_obj);
}

static void QP_fprint_raw(FILE * stream, const char * s, size_t n)
{
fputc('"', stream);
for (size_t i = 0; i < n; i++)
{
char c = s[i];
switch (c)
{
case '"':
case '\\':
fputc('\\', stream);
}
fputc(c, stream);
}
fputc('"', stream);
}

static qp_types_t QP_print_unpacker(
FILE * stream,
qp_types_t tp,
qp_unpacker_t * unpacker,
qp_obj_t * qp_obj)
Expand All @@ -951,90 +976,90 @@ static qp_types_t QP_print_unpacker(
switch (tp)
{
case QP_INT64:
printf("%" PRId64, qp_obj->via.int64);
fprintf(stream, "%" PRId64, qp_obj->via.int64);
break;
case QP_DOUBLE:
printf("%f", qp_obj->via.real);
fprintf(stream, "%f", qp_obj->via.real);
break;
case QP_RAW:
printf("\"%.*s\"", (int) qp_obj->len, qp_obj->via.raw);
QP_fprint_raw(stream, qp_obj->via.raw, qp_obj->len);
break;
case QP_TRUE:
printf("TRUE");
fprintf(stream, "true");
break;
case QP_FALSE:
printf("FALSE");
fprintf(stream, "false");
break;
case QP_NULL:
printf("NULL");
fprintf(stream, "null");
break;
case QP_ARRAY0:
case QP_ARRAY1:
case QP_ARRAY2:
case QP_ARRAY3:
case QP_ARRAY4:
case QP_ARRAY5:
printf("[");
fprintf(stream, "[");
count = tp - QP_ARRAY0;
tp = qp_next(unpacker, qp_obj);
for (found = 0; count-- && tp; found = 1)
{
if (found )
{
printf(", ");
fprintf(stream, ",");
}
tp = QP_print_unpacker(tp, unpacker, qp_obj);
tp = QP_print_unpacker(stream, tp, unpacker, qp_obj);
}
printf("]");
fprintf(stream, "]");
return tp;
case QP_MAP0:
case QP_MAP1:
case QP_MAP2:
case QP_MAP3:
case QP_MAP4:
case QP_MAP5:
printf("{");
fprintf(stream, "{");
count = tp - QP_MAP0;
tp = qp_next(unpacker, qp_obj);
for (found = 0; count-- && tp; found = 1)
{
if (found )
{
printf(", ");
fprintf(stream, ",");
}
tp = QP_print_unpacker(tp, unpacker, qp_obj);
printf(": ");
tp = QP_print_unpacker(tp, unpacker, qp_obj);
tp = QP_print_unpacker(stream, tp, unpacker, qp_obj);
fprintf(stream, ":");
tp = QP_print_unpacker(stream, tp, unpacker, qp_obj);
}
printf("}");
fprintf(stream, "}");
return tp;
case QP_ARRAY_OPEN:
printf("[");
fprintf(stream, "[");
tp = qp_next(unpacker, qp_obj);
for (count = 0; tp && tp != QP_ARRAY_CLOSE; count = 1)
{
if (count)
{
printf(", ");
fprintf(stream, ",");
}
tp = QP_print_unpacker(tp, unpacker, qp_obj);
tp = QP_print_unpacker(stream, tp, unpacker, qp_obj);
}
printf("]");
fprintf(stream, "]");
break;
case QP_MAP_OPEN:
printf("{");
fprintf(stream, "{");
tp = qp_next(unpacker, qp_obj);
for (count = 0; tp && tp != QP_MAP_CLOSE; count = 1)
{
if (count)
{
printf(", ");
fprintf(stream, ",");
}
tp = QP_print_unpacker(tp, unpacker, qp_obj);
printf(": ");
tp = QP_print_unpacker(tp, unpacker, qp_obj);
tp = QP_print_unpacker(stream, tp, unpacker, qp_obj);
fprintf(stream, ":");
tp = QP_print_unpacker(stream, tp, unpacker, qp_obj);
}
printf("}");
fprintf(stream, "}");
break;
default:
break;
Expand Down
11 changes: 9 additions & 2 deletions qpack.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

#define QP_VERSION_MAJOR 0
#define QP_VERSION_MINOR 10
#define QP_VERSION_PATCH 0
#define QP_VERSION_PATCH 1

#define QP_STRINGIFY(num) #num
#define QP_VERSION_STR(major,minor,patch) \
Expand Down Expand Up @@ -265,9 +265,16 @@ extern int qp_is_raw_equal(qp_obj_t * obj, const char * str);

/* print */
void qp_print(const unsigned char * data, size_t len);
#define qp_packer_print(packer) qp_print(packer->buffer, packer->len)
void qp_fprint(FILE * stream, const unsigned char * data, size_t len);

#define qp_packer_print(packer) \
qp_print(packer->buffer, packer->len)
#define qp_packer_fprint(stream, packer) \
qp_fprint(stream, packer->buffer, packer->len)
#define qp_unpacker_print(unpacker) \
qp_print(unpacker->start, unpacker->end - unpacker->start)
#define qp_unpacker_fprint(stream, unpacker) \
qp_fprint(stream, unpacker->start, unpacker->end - unpacker->start)

/* misc functions */
const char * qp_strerror(int err_code);
Expand Down
2 changes: 1 addition & 1 deletion test/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ int main(void)

packer = qp_packer_create(512);
qp_add_map(&packer);
qp_add_raw(packer, "Hi Qpack", strlen("Hi Qpack"));
qp_add_raw(packer, "Hi \"Qpack\"", strlen("Hi \"Qpack\""));
qp_add_array(&packer);
qp_add_array(&packer);
qp_add_array(&packer);
Expand Down

0 comments on commit b2a4b48

Please sign in to comment.