]> git.stg.codes - stg.git/blob - stglibs/smux.lib/xer_encoder.c
Merge branch 'master' into full-month-stats
[stg.git] / stglibs / smux.lib / xer_encoder.c
1 /*-
2  * Copyright (c) 2003, 2004 Lev Walkin <vlm@lionet.info>. All rights reserved.
3  * Redistribution and modifications are permitted subject to BSD license.
4  */
5 #include <asn_internal.h>
6 #include <stdio.h>
7 #include <errno.h>
8
9 /*
10  * The XER encoder of any type. May be invoked by the application.
11  */
12 asn_enc_rval_t
13 xer_encode(asn_TYPE_descriptor_t *td, void *sptr,
14         enum xer_encoder_flags_e xer_flags,
15                 asn_app_consume_bytes_f *cb, void *app_key) {
16         asn_enc_rval_t er, tmper;
17         const char *mname;
18         size_t mlen;
19         int xcan = (xer_flags & XER_F_CANONICAL) ? 1 : 2;
20
21         if(!td || !sptr) goto cb_failed;
22
23         mname = td->xml_tag;
24         mlen = strlen(mname);
25
26         _ASN_CALLBACK3("<", 1, mname, mlen, ">", 1);
27
28         tmper = td->xer_encoder(td, sptr, 1, xer_flags, cb, app_key);
29         if(tmper.encoded == -1) return tmper;
30
31         _ASN_CALLBACK3("</", 2, mname, mlen, ">\n", xcan);
32
33         er.encoded = 4 + xcan + (2 * mlen) + tmper.encoded;
34
35         _ASN_ENCODED_OK(er);
36 cb_failed:
37         _ASN_ENCODE_FAILED;
38 }
39
40 /*
41  * This is a helper function for xer_fprint, which directs all incoming data
42  * into the provided file descriptor.
43  */
44 static int
45 xer__print2fp(const void *buffer, size_t size, void *app_key) {
46         FILE *stream = (FILE *)app_key;
47
48         if(fwrite(buffer, 1, size, stream) != size)
49                 return -1;
50
51         return 0;
52 }
53
54 int
55 xer_fprint(FILE *stream, asn_TYPE_descriptor_t *td, void *sptr) {
56         asn_enc_rval_t er;
57
58         if(!stream) stream = stdout;
59         if(!td || !sptr)
60                 return -1;
61
62         er = xer_encode(td, sptr, XER_F_BASIC, xer__print2fp, stream);
63         if(er.encoded == -1)
64                 return -1;
65
66         return fflush(stream);
67 }