/*
libcsv - parse and write csv data
Copyright (C) 2007  Robert Gamble

    available at http://libcsv.sf.net

    Original available under the terms of the GNU LGPL2, and according
    to those terms, relicensed under the GNU GPL2 for inclusion in Tellico */

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of version 2 of the GNU General Public License as  *
 *   published by the Free Software Foundation;                            *
 *                                                                         *
 ***************************************************************************/


#ifndef LIBCSV_H__
#define LIBCSV_H__
#include <stdlib.h>
#include <stdio.h>

#define CSV_MAJOR 2
#define CSV_MINOR 0
#define CSV_RELEASE 1

/* Error Codes */
#define CSV_SUCCESS 0
#define CSV_EPARSE 1   /* Parse error in strict mode */
#define CSV_ENOMEM 2   /* Out of memory while increasing buffer size */
#define CSV_ETOOBIG 3  /* Buffer larger than SIZE_MAX needed */
#define CSV_EINVALID 4 /* Invalid code,should never be received from csv_error*/


/* parser options */
#define CSV_STRICT 1    /* enable strict mode */
#define CSV_REPALL_NL 2 /* report all unquoted carriage returns and linefeeds */
#define CSV_STRICT_FINI 4 /* causes csv_fini to return CSV_EPARSE if last
                             field is quoted and doesn't containg ending
                             quote */

/* Character values */
#define CSV_TAB    0x09
#define CSV_SPACE  0x20
#define CSV_CR     0x0d
#define CSV_LF     0x0a
#define CSV_COMMA  0x2c
#define CSV_QUOTE  0x22

struct csv_parser {
  int pstate;         /* Parser state */
  int quoted;         /* Is the current field a quoted field? */
  size_t spaces;      /* Number of continious spaces after quote or in a non-quoted field */
  char * entry_buf;   /* Entry buffer */
  size_t entry_pos;   /* Current position in entry_buf (and current size of entry) */
  size_t entry_size;  /* Size of buffer */
  int status;         /* Operation status */
  unsigned char options;
  char quote_char;
  char delim_char;
  int (*is_space)(char);
  int (*is_term)(char);
};

int csv_init(struct csv_parser **p, unsigned char options);
int csv_fini(struct csv_parser *p, void (*cb1)(char *, size_t, void *), void (*cb2)(char, void *), void *data);
void csv_free(struct csv_parser *p);
int csv_error(struct csv_parser *p);
char * csv_strerror(int error);
size_t csv_parse(struct csv_parser *p, const char *s, size_t len, void (*cb1)(char *, size_t, void *), void (*cb2)(char, void *), void *data);
size_t csv_write(char *dest, size_t dest_size, const char *src, size_t src_size);
int csv_fwrite(FILE *fp, const char *src, size_t src_size);
size_t csv_write2(char *dest, size_t dest_size, const char *src, size_t src_size, char quote);
int csv_fwrite2(FILE *fp, const char *src, size_t src_size, char quote);
int csv_opts(struct csv_parser *p, unsigned char options);
void csv_set_delim(struct csv_parser *p, char c);
void csv_set_quote(struct csv_parser *p, char c);
char csv_get_delim(struct csv_parser *p);
char csv_get_quote(struct csv_parser *p);
void csv_set_space_func(struct csv_parser *p, int (*f)(char));
void csv_set_term_func(struct csv_parser *p, int (*f)(char));

#endif
