diff options
Diffstat (limited to 'Build/source/utils/asymptote/fileio.cc')
-rw-r--r-- | Build/source/utils/asymptote/fileio.cc | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/Build/source/utils/asymptote/fileio.cc b/Build/source/utils/asymptote/fileio.cc new file mode 100644 index 00000000000..125326af5eb --- /dev/null +++ b/Build/source/utils/asymptote/fileio.cc @@ -0,0 +1,168 @@ +/****** + * fileio.cc + * Tom Prince and John Bowman 2004/08/10 + * + * Handle input/output + ******/ + +#include "fileio.h" +#include "settings.h" + +namespace camp { + +string tab="\t"; +string newline="\n"; + +ofile Stdout(""); +file nullfile("",false,false,true); + +void ifile::ignoreComment() +{ + if(comment == 0) return; + int c; + bool eol=(stream->peek() == '\n'); + if(eol && csvmode && nullfield) return; + for(;;) { + while(isspace(c=stream->peek())) { + stream->ignore(); + whitespace += (char) c; + } + if(c == comment) { + whitespace=""; + while((c=stream->peek()) != '\n' && c != EOF) + stream->ignore(); + if(c == '\n') + stream->ignore(); + } else {if(eol) stream->unget(); return;} + } +} + +bool ifile::eol() +{ + int c; + while(isspace(c=stream->peek())) { + if(c == '\n') return true; + else { + stream->ignore(); + whitespace += (char) c; + } + } + return false; +} + +bool ifile::nexteol() +{ + int c; + if(nullfield) { + nullfield=false; + return true; + } + + while(isspace(c=stream->peek())) { + if(c == '\n' && comma) { + nullfield=true; + return false; + } + stream->ignore(); + if(c == '\n') { + while(isspace(c=stream->peek())) { + if(c == '\n') {nullfield=true; return true;} + else { + stream->ignore(); + whitespace += (char) c; + } + } + return true; + } + else whitespace += (char) c; + } + return false; +} + +void ifile::csv() +{ + comma=false; + nullfield=false; + if(!csvmode || stream->eof()) return; + std::ios::iostate rdstate=stream->rdstate(); + if(stream->fail()) stream->clear(); + int c=stream->peek(); + if(c == ',') stream->ignore(); + else if(c == '\n') { + stream->ignore(); + if(linemode && stream->peek() != EOF) stream->unget(); + } else stream->clear(rdstate); + if(c == ',') comma=true; +} + +void ifile::Read(string& val) +{ + string s; + if(wordmode) { + whitespace=""; + while(isspace(stream->peek())) stream->ignore(); + } + if(csvmode || wordmode) { + bool quote=false; + while(stream->good()) { + int c=stream->peek(); + if(c == '"') {quote=!quote; stream->ignore(); continue;} + if(!quote) { + if(comment && c == comment) { + while((c=stream->peek()) != '\n' && c != EOF) + stream->ignore(); + if(s.empty() && c == '\n') { + stream->ignore(); + continue; + } + } + if(csvmode && (c == ',' || c == '\n')) + break; + if(wordmode && isspace(c)) + break; + } + s += (char) stream->get(); + } + } else + getline(*stream,s); + + if(comment) { + size_t p=0; + while((p=s.find(comment,p)) < string::npos) { + if(p+1 < s.length() && s[p+1] == comment) { + s.erase(p,1); + ++p; + } else { + s.erase(p); + break; + } + } + } + val=whitespace+s; +} + +void ofile::writeline() +{ + if(standard && interact::query && !vm::indebugger) { + Int scroll=settings::getScroll(); + if(scroll && interact::lines > 0 && interact::lines % scroll == 0) { + for(;;) { + if(!cin.good()) { + *stream << newline; + cin.clear(); + break; + } + int c=cin.get(); + if(c == '\n') break; + // Discard any additional characters + while(cin.good() && cin.get() != '\n'); + if(c == 's') {interact::query=false; break;} + if(c == 'q') {interact::query=false; interact::lines=0; throw quit();} + } + } else *stream << newline; + ++interact::lines; + } else *stream << newline; + if(errorstream::interrupt) {interact::lines=0; throw interrupted();} +} + +} // namespace camp |