blob: 4606575800d66298cbe6fd258080aa515f15949e [file] [log] [blame]
Lev Walkina9cc46e2004-09-22 16:06:28 +00001/*-
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>
Lev Walkina9cc46e2004-09-22 16:06:28 +00006#include <stdio.h>
Lev Walkina9cc46e2004-09-22 16:06:28 +00007#include <errno.h>
8
9/*
10 * The XER encoder of any type. May be invoked by the application.
11 */
12asn_enc_rval_t
Lev Walkin5e033762004-09-29 13:26:15 +000013xer_encode(asn_TYPE_descriptor_t *td, void *sptr,
Lev Walkina9cc46e2004-09-22 16:06:28 +000014 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
Lev Walkin942fd082004-10-03 09:13:02 +000021 if(!td || !sptr) goto cb_failed;
Lev Walkina9cc46e2004-09-22 16:06:28 +000022
Lev Walkindc06f6b2004-10-20 15:50:55 +000023 mname = td->xml_tag;
Lev Walkina9cc46e2004-09-22 16:06:28 +000024 mlen = strlen(mname);
25
Lev Walkin7c1dc052016-03-14 03:08:15 -070026 ASN__CALLBACK3("<", 1, mname, mlen, ">", 1);
Lev Walkina9cc46e2004-09-22 16:06:28 +000027
28 tmper = td->xer_encoder(td, sptr, 1, xer_flags, cb, app_key);
29 if(tmper.encoded == -1) return tmper;
30
Lev Walkin7c1dc052016-03-14 03:08:15 -070031 ASN__CALLBACK3("</", 2, mname, mlen, ">\n", xcan);
Lev Walkina9cc46e2004-09-22 16:06:28 +000032
Lev Walkin942fd082004-10-03 09:13:02 +000033 er.encoded = 4 + xcan + (2 * mlen) + tmper.encoded;
Lev Walkina9cc46e2004-09-22 16:06:28 +000034
Lev Walkin7c1dc052016-03-14 03:08:15 -070035 ASN__ENCODED_OK(er);
Lev Walkin942fd082004-10-03 09:13:02 +000036cb_failed:
Lev Walkin7c1dc052016-03-14 03:08:15 -070037 ASN__ENCODE_FAILED;
Lev Walkina9cc46e2004-09-22 16:06:28 +000038}
39
Lev Walkincc6a9102004-09-23 22:06:26 +000040/*
Lev Walkin11c3e172004-09-24 21:00:50 +000041 * This is a helper function for xer_fprint, which directs all incoming data
Lev Walkincc6a9102004-09-23 22:06:26 +000042 * 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}
Lev Walkina9cc46e2004-09-22 16:06:28 +000053
54int
Lev Walkin5e033762004-09-29 13:26:15 +000055xer_fprint(FILE *stream, asn_TYPE_descriptor_t *td, void *sptr) {
Lev Walkina9cc46e2004-09-22 16:06:28 +000056 asn_enc_rval_t er;
57
58 if(!stream) stream = stdout;
59 if(!td || !sptr)
60 return -1;
61
Lev Walkincc6a9102004-09-23 22:06:26 +000062 er = xer_encode(td, sptr, XER_F_BASIC, xer__print2fp, stream);
Lev Walkina9cc46e2004-09-22 16:06:28 +000063 if(er.encoded == -1)
64 return -1;
65
66 return fflush(stream);
67}