ITS
xer_encoder.c
Go to the documentation of this file.
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  */
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:
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 }
xer_encoder_flags_e
Definition: xer_encoder.h:17
static int xer__print2fp(const void *buffer, size_t size, void *app_key)
Definition: xer_encoder.c:45
ssize_t encoded
Definition: asn_codecs.h:48
int xer_fprint(FILE *stream, asn_TYPE_descriptor_t *td, void *sptr)
Definition: xer_encoder.c:55
#define _ASN_ENCODED_OK(rval)
Definition: asn_codecs.h:68
#define _ASN_ENCODE_FAILED
Definition: asn_codecs.h:60
int() asn_app_consume_bytes_f(const void *buffer, size_t size, void *application_specific_key)
#define _ASN_CALLBACK3(buf1, size1, buf2, size2, buf3, size3)
Definition: asn_internal.h:77
asn_enc_rval_t xer_encode(asn_TYPE_descriptor_t *td, void *sptr, enum xer_encoder_flags_e xer_flags, asn_app_consume_bytes_f *cb, void *app_key)
Definition: xer_encoder.c:13
xer_type_encoder_f * xer_encoder
Definition: constr_TYPE.h:99