aboutsummaryrefslogtreecommitdiff
path: root/examples/parser.c
diff options
context:
space:
mode:
authorTadas Vilkeliskis <vilkeliskis.t@gmail.com>2013-10-25 16:34:50 -0400
committerTadas Vilkeliskis <vilkeliskis.t@gmail.com>2013-10-26 19:02:09 -0400
commit58f3d912e20abc57c1c68cfc28325a5d58034189 (patch)
tree93d93345c09809c606961fd9649cfa43bf1a8a38 /examples/parser.c
parentce79f6da73ec063b35d4b0e2f30c44cdf199599c (diff)
csv parser
Diffstat (limited to 'examples/parser.c')
-rw-r--r--examples/parser.c95
1 files changed, 95 insertions, 0 deletions
diff --git a/examples/parser.c b/examples/parser.c
new file mode 100644
index 0000000..50c30d6
--- /dev/null
+++ b/examples/parser.c
@@ -0,0 +1,95 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <fcntl.h>
+#include <csv_parser.h>
+
+
+typedef struct field_ {
+ char data[32];
+ int row;
+ int col;
+ struct field_ *next;
+} field_t;
+
+
+typedef struct csv_ {
+ field_t *head;
+ field_t *tail;
+} csv_t;
+
+
+field_t *new_field(const char *data, size_t length, int row, int col)
+{
+ field_t *field = malloc(sizeof(field_t));
+ memset(field, 0, sizeof(field_t));
+ field->row = row;
+ field->col = col;
+ strncpy(field->data, data, length);
+ return field;
+}
+
+
+int field_cb(csv_parser_t *parser, const char *data, size_t length, int row, int col)
+{
+ csv_t *csv = parser->data;
+ field_t *field;
+
+ if (!csv->tail) {
+ field = new_field(data, length, row, col);
+ csv->tail = field;
+ csv->head = field;
+ } else {
+ if (csv->tail->row == row && csv->tail->col == col) {
+ strncat(csv->tail->data, data, length);
+ } else {
+ field = new_field(data, length, row, col);
+ csv->tail->next = field;
+ csv->tail = field;
+ }
+ }
+
+ return 0;
+}
+
+
+int main(int argc, const char *argv[])
+{
+ csv_t csv;
+ field_t *field;
+ char buffer[64];
+ ssize_t nread;
+ csv_parser_t parser;
+ csv_parser_settings_t settings;
+
+ csv.head = NULL;
+ csv.tail = NULL;
+
+ settings.delimiter = ',';
+ settings.field_cb = field_cb;
+
+ csv_parser_init(&parser);
+ parser.data = &csv;
+
+ int fd = open("iris.csv", O_RDONLY);
+ if (fd == -1) {
+ perror("open");
+ return -1;
+ }
+
+ while ((nread = read(fd, buffer, sizeof(buffer))) > 0) {
+ csv_parser_execute(&parser, &settings, buffer, nread);
+ }
+
+ close(fd);
+
+ field = csv.head;
+ while (field) {
+ printf("row: %3d, col: %3d, data: %s\n", field->row, field->col, field->data);
+ field_t *next = field->next;
+ free(field);
+ field = next;
+ }
+
+ return 0;
+}