Lines Matching refs:encoder
47 /* JSON encoder context type */
49 /* Top-level context of empty encoder. JSON element can be added. */
51 /* Top-level context of encoder with an element. JSON element cannot be added. */
65 /* JSON encoder structure, a wrapper for pa_strbuf and encoder context */
627 static void json_encoder_context_push(pa_json_encoder *encoder, pa_json_context_type_t type) {
628 pa_assert(encoder);
632 head->next = encoder->context;
633 encoder->context = head;
636 /* Returns type of context popped off encoder context stack. */
637 static pa_json_context_type_t json_encoder_context_pop(pa_json_encoder *encoder) {
641 pa_assert(encoder);
642 pa_assert(encoder->context);
644 type = encoder->context->type;
646 head = encoder->context->next;
647 pa_xfree(encoder->context);
648 encoder->context = head;
653 bool pa_json_encoder_is_empty(pa_json_encoder *encoder) {
656 pa_assert(encoder);
657 pa_assert(encoder->context);
659 type = encoder->context->type;
664 pa_json_encoder *encoder;
666 encoder = pa_xnew(pa_json_encoder, 1);
667 encoder->buffer = pa_strbuf_new();
669 encoder->context = NULL;
670 json_encoder_context_push(encoder, PA_JSON_CONTEXT_EMPTY);
672 return encoder;
675 void pa_json_encoder_free(pa_json_encoder *encoder) {
677 pa_assert(encoder);
679 /* should have exactly one encoder context left at this point */
680 pa_assert(encoder->context);
681 type = json_encoder_context_pop(encoder);
682 pa_assert(encoder->context == NULL);
686 pa_log_warn("JSON encoder is empty.");
688 if (encoder->buffer)
689 pa_strbuf_free(encoder->buffer);
691 pa_xfree(encoder);
694 char *pa_json_encoder_to_string_free(pa_json_encoder *encoder) {
697 pa_assert(encoder);
699 result = pa_strbuf_to_string_free(encoder->buffer);
701 encoder->buffer = NULL;
702 pa_json_encoder_free(encoder);
707 static void json_encoder_insert_delimiter(pa_json_encoder *encoder) {
708 pa_assert(encoder);
710 if (encoder->context->counter++)
711 pa_strbuf_putc(encoder->buffer, ',');
780 static void json_write_string_escaped(pa_json_encoder *encoder, const char *value) {
783 pa_assert(encoder);
786 pa_strbuf_printf(encoder->buffer, "\"%s\"", escaped_value);
791 void pa_json_encoder_begin_element_object(pa_json_encoder *encoder) {
792 pa_assert(encoder);
793 pa_assert(encoder->context->type != PA_JSON_CONTEXT_TOP);
795 if (encoder->context->type == PA_JSON_CONTEXT_EMPTY)
796 encoder->context->type = PA_JSON_CONTEXT_TOP;
798 json_encoder_insert_delimiter(encoder);
799 pa_strbuf_putc(encoder->buffer, '{');
801 json_encoder_context_push(encoder, PA_JSON_CONTEXT_OBJECT);
805 void pa_json_encoder_begin_member_object(pa_json_encoder *encoder, const char *name) {
806 pa_assert(encoder);
807 pa_assert(encoder->context);
808 pa_assert(encoder->context->type == PA_JSON_CONTEXT_OBJECT);
811 json_encoder_insert_delimiter(encoder);
813 json_write_string_escaped(encoder, name);
814 pa_strbuf_putc(encoder->buffer, ':');
816 pa_strbuf_putc(encoder->buffer, '{');
818 json_encoder_context_push(encoder, PA_JSON_CONTEXT_OBJECT);
822 void pa_json_encoder_end_object(pa_json_encoder *encoder) {
824 pa_assert(encoder);
826 type = json_encoder_context_pop(encoder);
829 pa_strbuf_putc(encoder->buffer, '}');
833 void pa_json_encoder_begin_element_array(pa_json_encoder *encoder) {
834 pa_assert(encoder);
835 pa_assert(encoder->context);
836 pa_assert(encoder->context->type != PA_JSON_CONTEXT_TOP);
838 if (encoder->context->type == PA_JSON_CONTEXT_EMPTY)
839 encoder->context->type = PA_JSON_CONTEXT_TOP;
841 json_encoder_insert_delimiter(encoder);
842 pa_strbuf_putc(encoder->buffer, '[');
844 json_encoder_context_push(encoder, PA_JSON_CONTEXT_ARRAY);
848 void pa_json_encoder_begin_member_array(pa_json_encoder *encoder, const char *name) {
849 pa_assert(encoder);
850 pa_assert(encoder->context);
851 pa_assert(encoder->context->type == PA_JSON_CONTEXT_OBJECT);
854 json_encoder_insert_delimiter(encoder);
856 json_write_string_escaped(encoder, name);
857 pa_strbuf_putc(encoder->buffer, ':');
859 pa_strbuf_putc(encoder->buffer, '[');
861 json_encoder_context_push(encoder, PA_JSON_CONTEXT_ARRAY);
865 void pa_json_encoder_end_array(pa_json_encoder *encoder) {
867 pa_assert(encoder);
869 type = json_encoder_context_pop(encoder);
872 pa_strbuf_putc(encoder->buffer, ']');
875 void pa_json_encoder_add_element_string(pa_json_encoder *encoder, const char *value) {
876 pa_assert(encoder);
877 pa_assert(encoder->context);
878 pa_assert(encoder->context->type == PA_JSON_CONTEXT_EMPTY || encoder->context->type == PA_JSON_CONTEXT_ARRAY);
880 if (encoder->context->type == PA_JSON_CONTEXT_EMPTY)
881 encoder->context->type = PA_JSON_CONTEXT_TOP;
883 json_encoder_insert_delimiter(encoder);
885 json_write_string_escaped(encoder, value);
888 void pa_json_encoder_add_member_string(pa_json_encoder *encoder, const char *name, const char *value) {
889 pa_assert(encoder);
890 pa_assert(encoder->context);
891 pa_assert(encoder->context->type == PA_JSON_CONTEXT_OBJECT);
894 json_encoder_insert_delimiter(encoder);
896 json_write_string_escaped(encoder, name);
898 pa_strbuf_putc(encoder->buffer, ':');
904 json_write_string_escaped(encoder, value);
907 static void json_write_null(pa_json_encoder *encoder) {
908 pa_assert(encoder);
910 pa_strbuf_puts(encoder->buffer, "null");
913 void pa_json_encoder_add_element_null(pa_json_encoder *encoder) {
914 pa_assert(encoder);
915 pa_assert(encoder->context);
916 pa_assert(encoder->context->type == PA_JSON_CONTEXT_EMPTY || encoder->context->type == PA_JSON_CONTEXT_ARRAY);
918 if (encoder->context->type == PA_JSON_CONTEXT_EMPTY)
919 encoder->context->type = PA_JSON_CONTEXT_TOP;
921 json_encoder_insert_delimiter(encoder);
923 json_write_null(encoder);
926 void pa_json_encoder_add_member_null(pa_json_encoder *encoder, const char *name) {
927 pa_assert(encoder);
928 pa_assert(encoder->context);
929 pa_assert(encoder->context->type == PA_JSON_CONTEXT_OBJECT);
932 json_encoder_insert_delimiter(encoder);
934 json_write_string_escaped(encoder, name);
935 pa_strbuf_putc(encoder->buffer, ':');
937 json_write_null(encoder);
940 static void json_write_bool(pa_json_encoder *encoder, bool value) {
941 pa_assert(encoder);
943 pa_strbuf_puts(encoder->buffer, value ? "true" : "false");
946 void pa_json_encoder_add_element_bool(pa_json_encoder *encoder, bool value) {
947 pa_assert(encoder);
948 pa_assert(encoder->context);
949 pa_assert(encoder->context->type == PA_JSON_CONTEXT_EMPTY || encoder->context->type == PA_JSON_CONTEXT_ARRAY);
951 if (encoder->context->type == PA_JSON_CONTEXT_EMPTY)
952 encoder->context->type = PA_JSON_CONTEXT_TOP;
954 json_encoder_insert_delimiter(encoder);
956 json_write_bool(encoder, value);
959 void pa_json_encoder_add_member_bool(pa_json_encoder *encoder, const char *name, bool value) {
960 pa_assert(encoder);
961 pa_assert(encoder->context);
962 pa_assert(encoder->context->type == PA_JSON_CONTEXT_OBJECT);
965 json_encoder_insert_delimiter(encoder);
967 json_write_string_escaped(encoder, name);
969 pa_strbuf_putc(encoder->buffer, ':');
971 json_write_bool(encoder, value);
974 static void json_write_int(pa_json_encoder *encoder, int64_t value) {
975 pa_assert(encoder);
977 pa_strbuf_printf(encoder->buffer, "%"PRId64, value);
980 void pa_json_encoder_add_element_int(pa_json_encoder *encoder, int64_t value) {
981 pa_assert(encoder);
982 pa_assert(encoder->context);
983 pa_assert(encoder->context->type == PA_JSON_CONTEXT_EMPTY || encoder->context->type == PA_JSON_CONTEXT_ARRAY);
985 if (encoder->context->type == PA_JSON_CONTEXT_EMPTY)
986 encoder->context->type = PA_JSON_CONTEXT_TOP;
988 json_encoder_insert_delimiter(encoder);
990 json_write_int(encoder, value);
993 void pa_json_encoder_add_member_int(pa_json_encoder *encoder, const char *name, int64_t value) {
994 pa_assert(encoder);
995 pa_assert(encoder->context);
996 pa_assert(encoder->context->type == PA_JSON_CONTEXT_OBJECT);
999 json_encoder_insert_delimiter(encoder);
1001 json_write_string_escaped(encoder, name);
1003 pa_strbuf_putc(encoder->buffer, ':');
1005 json_write_int(encoder, value);
1008 static void json_write_double(pa_json_encoder *encoder, double value, int precision) {
1009 pa_assert(encoder);
1010 pa_strbuf_printf(encoder->buffer, "%.*f", precision, value);
1013 void pa_json_encoder_add_element_double(pa_json_encoder *encoder, double value, int precision) {
1014 pa_assert(encoder);
1015 pa_assert(encoder->context);
1016 pa_assert(encoder->context->type == PA_JSON_CONTEXT_EMPTY || encoder->context->type == PA_JSON_CONTEXT_ARRAY);
1018 if (encoder->context->type == PA_JSON_CONTEXT_EMPTY)
1019 encoder->context->type = PA_JSON_CONTEXT_TOP;
1021 json_encoder_insert_delimiter(encoder);
1023 json_write_double(encoder, value, precision);
1026 void pa_json_encoder_add_member_double(pa_json_encoder *encoder, const char *name, double value, int precision) {
1027 pa_assert(encoder);
1028 pa_assert(encoder->context);
1029 pa_assert(encoder->context->type == PA_JSON_CONTEXT_OBJECT);
1032 json_encoder_insert_delimiter(encoder);
1034 json_write_string_escaped(encoder, name);
1036 pa_strbuf_putc(encoder->buffer, ':');
1038 json_write_double(encoder, value, precision);
1041 static void json_write_raw(pa_json_encoder *encoder, const char *raw_string) {
1042 pa_assert(encoder);
1043 pa_strbuf_puts(encoder->buffer, raw_string);
1046 void pa_json_encoder_add_element_raw_json(pa_json_encoder *encoder, const char *raw_json_string) {
1047 pa_assert(encoder);
1048 pa_assert(encoder->context);
1049 pa_assert(encoder->context->type == PA_JSON_CONTEXT_EMPTY || encoder->context->type == PA_JSON_CONTEXT_ARRAY);
1051 if (encoder->context->type == PA_JSON_CONTEXT_EMPTY)
1052 encoder->context->type = PA_JSON_CONTEXT_TOP;
1054 json_encoder_insert_delimiter(encoder);
1056 json_write_raw(encoder, raw_json_string);
1059 void pa_json_encoder_add_member_raw_json(pa_json_encoder *encoder, const char *name, const char *raw_json_string) {
1060 pa_assert(encoder);
1061 pa_assert(encoder->context);
1062 pa_assert(encoder->context->type == PA_JSON_CONTEXT_OBJECT);
1065 json_encoder_insert_delimiter(encoder);
1067 json_write_string_escaped(encoder, name);
1069 pa_strbuf_putc(encoder->buffer, ':');
1071 json_write_raw(encoder, raw_json_string);