2 * Copyright (C) 2013 Cumulus Networks, Inc.
4 * This file is part of Quagga.
6 * Quagga is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2, or (at your option) any
11 * Quagga is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; see the file COPYING; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 * CSV encoding and decoding routines.
31 * csv_record_t *fstrec;
35 * csv = csv_init(csv, buf, BUFSIZ);
37 * fstrec = csv_encode(csv, 2, "hello", "world");
38 * rec = csv_encode(csv, 2, "foo", "bar");
40 * fstrec = csv_encode_record(csv, fstrec, 2, "HELLO", "WORLD");
51 * csv = csv_init(csv, rcvdbuf, BUFSIZ);
56 * for (rec = csv_record_iter(csv); rec;
57 * rec = csv_record_iter_next(rec)) {
59 * for (str = csv_field_iter(rec, &fld); str;
60 * str = csv_field_iter_next(&fld)) {
71 #include <sys/queue.h>
73 typedef struct _csv_field_t_ csv_field_t
;
74 typedef struct _csv_record_t_ csv_record_t
;
75 typedef struct _csv_t_ csv_t
;
78 * Initialize the CSV structure (if necessary, allocate first). Point to
79 * the passed string buffer.
81 csv_t
* csv_init(csv_t
*csv
, char *buf
, int buflen
);
84 * Encode the variable list of arguments as CSV fields. The csv structure
85 * should have been initialized (with the string buffer). The fields get
86 * concatenated into the string.
88 csv_record_t
*csv_encode(csv_t
*csv
, int count
, ...);
91 * Encode the variable list arguments into an existing record, essentially
92 * overwriting the record. No checking is done for consistency. The number
93 * of fields should be the same as what was encoded and the length of each
94 * field should also be the same as what was encoded before. The "rec"
95 * parameter should be the same as what was returned from a previous call
98 * Useful for message encoding/decoding that get passed around between
99 * processes/nodes - e.g. the message header record can be rewritten AFTER
100 * encoding all other records, with new information such as total length.
102 csv_record_t
*csv_encode_record(csv_t
*csv
, csv_record_t
*rec
,
106 * Decode a CSV formatted string. The csv structure should have been
107 * initialized (with the string). The function creates a LIST of records
108 * (csv_record_t structure) where each record is in turn a LIST of fields
109 * (csv_field_t structure). The record points to the string containing the
110 * list of fields. Similarly, the field points to the field string.
111 * NB: csv initialized for discrete buf , caller will pass inbuf
113 void csv_decode(csv_t
*csv
, char *inbuf
);
116 * Dump all fields of a decoded CSV to stderr
118 void csv_dump(csv_t
*csv
);
121 * Total length of all characters encoded in the CSV.
123 int csvlen(csv_t
*csv
);
125 void csv_clean(csv_t
*csv
);
126 void csv_free(csv_t
*csv
);
129 * Iterate through the records and fields of an encoded/decoded CSV.
131 csv_record_t
*csv_record_iter(csv_t
*csv
);
132 csv_record_t
*csv_record_iter_next(csv_record_t
*rec
);
133 char *csv_field_iter(csv_record_t
*rec
, csv_field_t
**fld
);
134 char *csv_field_iter_next(csv_field_t
**fld
);
137 * Return the length of field
139 int csv_field_len(csv_field_t
*fld
);
142 * Checks to see if a record belongs to a csv
144 int csv_is_record_valid(csv_t
*csv
, csv_record_t
*in_rec
);
147 * concat two records in a csv
148 * Returns the newly formed record which includes fields from rec1 and rec2
149 * rec1 and rec2 are removed
151 csv_record_t
*csv_concat_record(csv_t
*csv
, csv_record_t
*rec1
,
155 * Remove a record from csv
156 * Only works when csv has discrete record bufs
158 void csv_remove_record(csv_t
*csv
, csv_record_t
*rec
);
161 * Insert a record into csv
162 * Only works when csv has discrete record bufs
164 void csv_insert_record(csv_t
*csv
, csv_record_t
*rec
);
167 * append fields to a record
168 * Only works when csv has discrete record bufs
171 csv_append_record (csv_t
*csv
, csv_record_t
*rec
, int count
, ...);
174 * Serialize contents of csv into string
175 * Only works when csv has discrete record bufs
177 int csv_serialize(csv_t
*csv
, char *msgbuf
, int msglen
);
181 * Only works when csv has discrete record bufs
183 void csv_clone_record (csv_t
*csv
, csv_record_t
*in_rec
, csv_record_t
**out_rec
);
186 * Return number of records
188 int csv_num_records (csv_t
*csv
);