blob: 3ee62cb87b96ee8e2307ad42cca359b2ea0934df [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
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
Lev Walkin942fd082004-10-03 09:13:02 +000031 _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 Walkinabde4f42005-11-13 09:49:05 +000035 er.structure_ptr = 0;
36 er.failed_type = 0;
Lev Walkina9cc46e2004-09-22 16:06:28 +000037 return er;
Lev Walkin942fd082004-10-03 09:13:02 +000038cb_failed:
39 _ASN_ENCODE_FAILED;
Lev Walkina9cc46e2004-09-22 16:06:28 +000040}
41
Lev Walkincc6a9102004-09-23 22:06:26 +000042/*
Lev Walkin11c3e172004-09-24 21:00:50 +000043 * This is a helper function for xer_fprint, which directs all incoming data
Lev Walkincc6a9102004-09-23 22:06:26 +000044 * into the provided file descriptor.
45 */
46static int
47xer__print2fp(const void *buffer, size_t size, void *app_key) {
48 FILE *stream = (FILE *)app_key;
49
50 if(fwrite(buffer, 1, size, stream) != size)
51 return -1;
52
53 return 0;
54}
Lev Walkina9cc46e2004-09-22 16:06:28 +000055
56int
Lev Walkin5e033762004-09-29 13:26:15 +000057xer_fprint(FILE *stream, asn_TYPE_descriptor_t *td, void *sptr) {
Lev Walkina9cc46e2004-09-22 16:06:28 +000058 asn_enc_rval_t er;
59
60 if(!stream) stream = stdout;
61 if(!td || !sptr)
62 return -1;
63
Lev Walkincc6a9102004-09-23 22:06:26 +000064 er = xer_encode(td, sptr, XER_F_BASIC, xer__print2fp, stream);
Lev Walkina9cc46e2004-09-22 16:06:28 +000065 if(er.encoded == -1)
66 return -1;
67
68 return fflush(stream);
69}