/*->c.csv */

#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <stdio.h>



#include "os.h"
#include "bbc.h"
#include "h.sprite"
#include "h.wimp"
#include "h.werr"
#include "h.flex"

#include "h.DrawLevel0"

#include "h.wos"
#include "h.ram"
#include "h.file"
#include "h.strdef"
#include "h.trans"


#include "h.csv"


#define CSVMAXLEN 1000
#define CSVMACREC 48


/****************************************************************************/


int csvputrecord(FILE * fp,csvstr * csv)
{
 int        i;
 int        len;

 for(i=0;i<csv->records;i++)
 {
  if(i>0) rputc(',',fp);

  len=strlen(csv->record[i]);
  if(len)
  {
   rputc('"',fp);
   rwrite(csv->record[i],len,1,fp);
   rputc('"',fp);
  }
 }
 rputc('\n',fp);

 return(0);
}


os_error * csvgetrecord(FILE * fp,csvstr ** csv)
{
 os_error * err;
 char       string[CSVMAXLEN];
 int        record[CSVMACREC];
 int        inquotes;
 int        startline;
 int        c;
 int        lastchar;
 int        inrecord;
 int        records;
 int        len;
 char     * p;
 int        i;
 int        eol;

 err=NULL;

 records=0;
 inquotes=0;
 startline=0;
 inrecord=0;
 c=-1;
 p=string;
 eol=0;

 *csv=NULL;

 while(!eol)
 {
  lastchar=c;
  c=rgetc(fp);
  if(!startline)
  {
   if(c==EOF) return(err);
   else
   {
    startline=1;
    record[records]=p-string;
    records++;
   }
  }

  switch(c)
  {
   case EOF:
   case  10:
   case  13:
            eol=1;
            break;

   case ',':
            if(inquotes)
            {
             *p++=c;
             break;
            }

   case   9:
            /* complete a record */
            *p++=0;
            record[records]=p-string;
            records++;
            inrecord=0;
            break;

   case '"':
            if(!inrecord)
            {
             inrecord=1;
             c=-1;
            }

            if(lastchar=='"')
            {
             *p++=c;
             c=-1;
            }
            inquotes^=1;
            break;

    default:
            if(!inrecord) inrecord=1;
            *p++=c;
            break;
  }
 }
 *p++=0;

 len=p-string;
 err=flex_alloce((flex_ptr)csv,sizeof(csvstr)+(records-1)*sizeof(int)+len);
 if(!err)
 {
  (*csv)->records=records;
  p=((char*)(*csv))+sizeof(csvstr)+(records-1)*sizeof(int);

  for(i=0;i<records;i++)
  {
   (*csv)->record[i]=record[i]+p;
  }
  memcpy(p,string,len);
 }

 return(err);
}


void csvclose(FILE * fp,char * name,int write)
{
 int realfile;

 realfile=!ramfp(fp);
 rclose(fp);
 if(realfile && write) setftype(name,CSV);
}


FILE * csvopen(char * name,char * mode)
{
 return(ropen(name,mode));
}


