summaryrefslogtreecommitdiff
path: root/graphics/asymptote/runfile.in
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /graphics/asymptote/runfile.in
Initial commit
Diffstat (limited to 'graphics/asymptote/runfile.in')
-rw-r--r--graphics/asymptote/runfile.in361
1 files changed, 361 insertions, 0 deletions
diff --git a/graphics/asymptote/runfile.in b/graphics/asymptote/runfile.in
new file mode 100644
index 0000000000..e51b3b76ea
--- /dev/null
+++ b/graphics/asymptote/runfile.in
@@ -0,0 +1,361 @@
+/*****
+ * runfile.in
+ *
+ * Runtime functions for file operations.
+ *
+ *****/
+
+file* => primFile()
+
+#include "fileio.h"
+#include "callable.h"
+#include "triple.h"
+#include "array.h"
+
+#ifdef __CYGWIN__
+extern "C" int mkstemp(char *c);
+#endif
+
+using namespace camp;
+using namespace settings;
+using namespace vm;
+
+string commentchar="#";
+
+// Autogenerated routines:
+
+
+bool ==(file *a, file *b)
+{
+ return a == b;
+}
+
+bool !=(file *a, file *b)
+{
+ return a != b;
+}
+
+file* :nullFile()
+{
+ return &camp::nullfile;
+}
+
+file* input(string name=emptystring, bool check=true,
+ string comment=commentchar, string mode=emptystring)
+{
+ file *f=NULL;
+ if(mode == "binary") {
+ f=new ibfile(name,check);
+ } else if(mode == "xdr") {
+#ifdef HAVE_RPC_RPC_H
+ f=new ixfile(name,check);
+#else
+ ostringstream buf;
+ buf << name << ": XDR read support not enabled";
+ error(buf);
+#endif
+ } else if(mode == "") {
+ char c=comment.empty() ? (char) 0 : comment[0];
+ f=new ifile(name,c,check);
+ } else {
+ f=NULL;
+ ostringstream buf;
+ buf << name << ": invalid file mode '" << mode << "'";
+ error(buf);
+ }
+
+ f->open();
+ return f;
+}
+
+file* output(string name=emptystring, bool update=false,
+ string comment=commentchar, string mode=emptystring)
+{
+ file *f=NULL;
+ if(mode == "pipe") {
+ f=new opipe(name);
+ } else if(mode == "binary") {
+ if(update) f=new iobfile(name);
+ else f=new obfile(name);
+ } else if(mode == "xdr") {
+#ifdef HAVE_RPC_RPC_H
+ if(update)
+ f=new ioxfile(name);
+ else f=new oxfile(name);
+#else
+ ostringstream buf;
+ buf << name << ": XDR write support not enabled";
+ error(buf);
+#endif
+ } else if(mode == "") {
+ if(update) {
+ char c=comment.empty() ? (char) 0 : comment[0];
+ f=new iofile(name,c);
+ } else f=new ofile(name);
+ } else {
+ f=NULL;
+ ostringstream buf;
+ buf << name << ": invalid file mode '" << mode << "'";
+ error(buf);
+ }
+
+ f->open();
+ if(update) f->seek(0,false);
+
+ return f;
+}
+
+bool eof(file *f)
+{
+ return f->eof();
+}
+
+bool eol(file *f)
+{
+ return f->eol();
+}
+
+bool error(file *f)
+{
+ return f->error();
+}
+
+void clear(file *f)
+{
+ f->clear();
+}
+
+void close(file *f)
+{
+ f->close();
+}
+
+Int precision(file *f=NULL, Int digits=0)
+{
+ if(f == 0) f=&camp::Stdout;
+ return f->precision(digits);
+}
+
+void flush(file *f)
+{
+ f->flush();
+}
+
+string getc(file *f)
+{
+ char c=0;
+ if(f->isOpen()) f->read(c);
+ static char str[1];
+ str[0]=c;
+ return string(str);
+}
+
+Int tell(file *f)
+{
+ return f->tell();
+}
+
+void seek(file *f, Int pos)
+{
+ f->seek(pos,pos >= 0);
+}
+
+void seekeof(file *f)
+{
+ f->seek(0,false);
+}
+
+string :namePart(file f)
+{
+ return f.filename();
+}
+
+string :modePart(file f)
+{
+ return f.FileMode();
+}
+
+// Set file dimensions
+file* :dimensionSetHelper(Int nx=-1, Int ny=-1, Int nz=-1, file *f)
+{
+ f->dimension(nx,ny,nz);
+ return f;
+}
+
+callable* :dimensionSet(file *f)
+{
+ return new thunk(new bfunc(dimensionSetHelper),f);
+}
+
+array * :dimensionPart(file f)
+{
+ array *a=new array(3);
+ (*a)[0]=f.Nx();
+ (*a)[1]=f.Ny();
+ (*a)[2]=f.Nz();
+ return a;
+}
+
+// Set file f to read arrays in line-at-a-time mode
+file* :lineSetHelper(bool b=true, file *f)
+{
+ f->LineMode(b);
+ return f;
+}
+
+callable* :lineSet(file *f)
+{
+ return new thunk(new bfunc(lineSetHelper),f);
+}
+
+bool :linePart(file f)
+{
+ return f.LineMode();
+}
+
+// Set file to read comma-separated values
+file* :csvSetHelper(bool b=true, file *f)
+{
+ f->CSVMode(b);
+ return f;
+}
+
+callable* :csvSet(file *f)
+{
+ return new thunk(new bfunc(csvSetHelper),f);
+}
+
+bool :csvPart(file f)
+{
+ return f.CSVMode();
+}
+
+// Set file to read whitespace-separated values
+file* :wordSetHelper(bool b=true, file *f)
+{
+ f->WordMode(b);
+ return f;
+}
+
+callable* :wordSet(file *f)
+{
+ return new thunk(new bfunc(wordSetHelper),f);
+}
+
+bool :wordPart(file f)
+{
+ return f.WordMode();
+}
+
+// Set file to read/write single precision real XDR values.
+file* :singlerealSetHelper(bool b=true, file *f)
+{
+ f->SingleReal(b);
+ return f;
+}
+
+callable* :singlerealSet(file *f)
+{
+ return new thunk(new bfunc(singlerealSetHelper),f);
+}
+
+bool :singlerealPart(file f)
+{
+ return f.SingleReal();
+}
+
+// Set file to read/write single precision int XDR values.
+file* :singleintSetHelper(bool b=true, file *f)
+{
+ f->SingleInt(b);
+ return f;
+}
+
+callable* :singleintSet(file *f)
+{
+ return new thunk(new bfunc(singleintSetHelper),f);
+}
+
+bool :singleintPart(file f)
+{
+ return f.SingleInt();
+}
+
+// Set file to read/write signed int XDR values.
+file* :signedintSetHelper(bool b=true, file *f)
+{
+ f->SignedInt(b);
+ return f;
+}
+
+callable* :signedintSet(file *f)
+{
+ return new thunk(new bfunc(signedintSetHelper),f);
+}
+
+bool :signedintPart(file f)
+{
+ return f.SignedInt();
+}
+
+// Set file to read an arrayi (i int sizes followed by an i-dimensional array)
+file* :readSetHelper(Int i, file *f)
+{
+ switch(i) {
+ case 1:
+ f->dimension(-2);
+ break;
+
+ case 2:
+ f->dimension(-2,-2);
+ break;
+
+ case 3:
+ f->dimension(-2,-2,-2);
+ break;
+
+ default:
+ f->dimension();
+ }
+
+ return f;
+}
+
+callable* :readSet(file *f)
+{
+ return new thunk(new bfunc(readSetHelper),f);
+}
+
+// Delete file named s.
+Int delete(string s)
+{
+ s=outpath(s);
+ Int rc=unlink(s.c_str());
+ if(rc == 0 && verbose > 0)
+ cout << "Deleted " << s << endl;
+ return rc;
+}
+
+// Rename file "from" to file "to".
+Int rename(string from, string to)
+{
+ from=outpath(from);
+ to=outpath(to);
+ Int rc=rename(from.c_str(),to.c_str());
+ if(rc == 0 && verbose > 0)
+ cout << "Renamed " << from << " to " << to << endl;
+ return rc;
+}
+
+// Create a unique temporary file name.
+string mktemp(string s)
+{
+ char *S=Strdup(s+"XXXXXX");
+ int fd=mkstemp(S);
+ if(fd < 0) {
+ ostringstream buf;
+ buf << "Could not create unique temporary filename based on " << s;
+ error(buf);
+ }
+ return S;
+}