blob: aa7cf040ad874dc1f8bfd8e353c3061b71493fdb [file] [log] [blame]
Harald Welte92c45f32010-06-12 18:59:38 +02001/*-
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 */
12asn_enc_rval_t
13xer_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);
36cb_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 */
44static int
45xer__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
54int
55xer_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}