#include #include #include #include #include #include "tlmplib.h" #include "tlmplib.m" void _F_loadfile__v1::empty(const LOADFILE_INFO &) { } void _F_loadfile__v1::start(const LOADFILE_INFO &) { } void _F_loadfile__v1::end(off_t, const LOADFILE_INFO &) { } void _F_loadfile__v1::missing(const char *fname) { tlmp_error (MSG_U(E_CANTOPEN,"Can't open file %s (%s)\n") ,fname,strerror(errno)); } static int loadfile_gen ( _F_loadfile__v1 &c, SSTREAM &ss, bool strip, const char *fname) { LOADFILE_INFO info; info.filename = fname; c.priv = NULL; int ret = 0; char buf[10000]; off_t lastpos = ss.getoffset(); while (ss.gets(buf,sizeof(buf)-1)!=NULL){ if (ret == 0) c.start(info); if (strip) strip_end (buf); if (c.oneline (buf,lastpos,ret,info)==-1){ break; } lastpos = ss.getoffset(); ret++; } if (ret == 0){ c.empty(info); }else{ c.end (ss.getoffset(),info); } return ret; } int loadfile__v1 (_F_loadfile__v1 &c, SSTREAM &ss, bool strip) { return loadfile_gen (c,ss,strip,"(sstream)"); } int loadfile__v1 (_F_loadfile__v1 &c, const char *fname, bool strip) { int ret = -1; if (strcmp(fname,"-")==0){ SSTREAM_FILE ss(stdin); ret = loadfile_gen (c,ss,strip,"(stdin)"); }else{ FILE *fin = fopen64(fname,"r"); if (fin == NULL){ c.missing (fname); }else{ SSTREAM_FILE ss(fin); ret = loadfile_gen (c,ss,strip,fname); fclose (fin); } } return ret; } void _F_savefile::start(FILE *, const char *){} void _F_savefile::end(FILE *, const char *){} void _F_savefile::openfail(const char *fname) { tlmp_error (MSG_R(E_CANTOPEN),fname,strerror(errno)); } static int savefile_gen (_F_savefile &c, const char *fname, FILE *fout) { c.priv = NULL; int ret = -1; if (fout == NULL){ c.openfail (fname); }else{ c.start(fout,fname); ret = c.dowrite (fout,fname); fflush (fout); c.end(fout,fname); } return ret; } int savefile (_F_savefile &c, const char *fname, bool append) { FILE *fout = fopen(fname,append ? "a" : "w"); int ret = savefile_gen (c,fname,fout); if (fout != NULL) if (fclose (fout) == -1) ret = -1; return ret; } void _F_loadfile_csv::empty(const LOADFILE_INFO &) { } void _F_loadfile_csv::start(const LOADFILE_INFO &) { } void _F_loadfile_csv::end(off_t, const LOADFILE_INFO &) { } void _F_loadfile_csv::missing(const char *fname) { tlmp_error (MSG_R(E_CANTOPEN),fname,strerror(errno)); } int loadfile_csv( _F_loadfile_csv &c, const char *fname, const char sep, const char quote, int mincols) { glocal char sep = sep; glocal char quote = quote; glocal _F_loadfile_csv *c = &c; glocal int mincols = mincols; return (fname,true); glocal.c->missing(fname); glocal.c->empty (info); glocal.c->start(info); glocal.c->end (filepos,info); int ret = 0; SSTRINGS words; int n; if (glocal.quote == '\0'){ n = str_splitline (line,glocal.sep,words); }else{ n = str_splitlineq (line,glocal.sep,glocal.quote,'\0',words); } if (n > 0){ while (n < glocal.mincols){ n++; words.add(""); } const char *fields[n+1]; for (int i=0; iget(); } fields[n] = NULL; bool end = false; glocal.c->oneline (line,fields,n,filepos,noline,info,end); if (end) ret = -1; } return ret; } int loadfile_csv(_F_loadfile_csv &c, const char *fname, const char sep, int mincols) { return loadfile_csv (c,fname,sep,'"',mincols); }