diff --git a/cal/Makefile b/cal/Makefile index 8aedd65..c8fefb0 100644 --- a/cal/Makefile +++ b/cal/Makefile @@ -140,7 +140,7 @@ CALC_FILES= README alg_config.cal beer.cal bernoulli.cal \ test3300.cal test3400.cal test4000.cal test4100.cal test4600.cal \ test5100.cal test5200.cal test8400.cal test8500.cal test8600.cal \ test8900.cal test9300.cal toomcook.cal unitfrac.cal varargs.cal \ - w2f.cal xx_print.cal zeta2.cal + write2file.cal.cal xx_print.cal zeta2.cal # These calc files are now obsolete and are removed by the install rule. # diff --git a/cal/README b/cal/README index 7c1bfca..6d4118b 100644 --- a/cal/README +++ b/cal/README @@ -1955,6 +1955,17 @@ varargs.cal Example program to use 'varargs'. Program to sum the cubes of all the specified numbers. +write2file.cal + + w2f(filename,stream,fmt,value) defined + wd2f(value) defined + wx2f(value) defined + + write results to file + + This resource file serves as an example of how to perform file + I/O. This write2file hows how to perform file I/O and is provided + as an illustrative example. xx_print.cal @@ -1983,7 +1994,7 @@ zeta2.cal for information on this special zeta function. -## Copyright (C) 2000,2014,2017,2021 David I. Bell and Landon Curt Noll +## Copyright (C) 2000,2014,2017,2021,2023 David I. Bell and Landon Curt Noll ## ## Primary author: Landon Curt Noll ## diff --git a/cal/write2file.cal b/cal/write2file.cal new file mode 100644 index 0000000..1baf5a4 --- /dev/null +++ b/cal/write2file.cal @@ -0,0 +1,121 @@ +/* + * write2file - write results to file + * + * This resource file serves as an example of how to perform file I/O. + * This write2file hows how to perform file I/O and is provided as + * an illustrative example. + * + * Copyright (C) 2023 Landon Curt Noll + * + * Calc is open software; you can redistribute it and/or modify it under + * the terms of the version 2.1 of the GNU Lesser General Public License + * as published by the Free Software Foundation. + * + * Calc is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General + * Public License for more details. + * + * A copy of version 2.1 of the GNU Lesser General Public License is + * distributed with calc under the filename COPYING-LGPL. You should have + * received a copy with calc; if not, write to Free Software Foundation, Inc. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Under source code control: 2023/08/20 13:13:11 + * File existed as early as: 2023 + * + * chongo /\oo/\ http://www.isthe.com/chongo/ + * Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/ + */ + + +static outfilename; /* where to write stuff */ +static outfile; /* open file stream on which to write */ +static stderr; /* write errors to standard error */ + + +/* + * setup + */ +if (!isstr(outfilename)) { + outfilename = "./outfile"; +} +if (!isfile(stderr)) { + stderr = files(2); + if (!isfile(stderr)) { + printf("Warning: stderr as files(2) is not a file!\n"); + } +} + + +/* + * try to create or open and truncate the outfile + */ +if (!isfile(outfile)) { + /* open outfilename for writing at the beginning */ + outfile = fopen(outfilename, "w"); + + /* firewall - check for failing to open */ + if (!isfile(outfile)) { + fprintf(stderr, "failed to open: %s error(%d): %s\n", outfilename, errno(outfile), strerror(outfile)); + } +} + + +/* + * write a value to a file given a format + */ +define w2f(filename, stream, fmt, value) { + + /* firewall */ + if (!isfile(stderr)) { + printf("stderr is not an open file\n"); + return; + } + if (!isstr(filename)) { + fprintf(stderr, "filename argument is not a string\n"); + return; + } + if (!isfile(stream)) { + fprintf(stderr, "stream argument is not an open file\n"); + return; + } + if (!isstr(fmt)) { + fprintf(stderr, "fmt argument is not a string\n"); + return; + } + if (!isnum(value)) { + fprintf(stderr, "value argument is not a numeric value\n"); + return; + } + + /* write value in decimal */ + fprintf(stream, fmt, value); + if (ferror(stream)) { + fprintf(stderr, "error in writing to file: %s error(%d): %s\n", filename, errno(stream), strerror(stream)); + return; + } + + /* flush to be sure it is completely written */ + fflush(outfile); + if (ferror(outfile)) { + fprintf(stderr, "error in flushing to file: %s error(%d): %s\n", filename, errno(stream), strerror(stream)); + } + return; +} + + +/* + * wd2f - write a value to an open file in decimal + */ +define wd2f(value) { + return w2f(outfilename, outfile, "%d\n", value); +} + + +/* + * wx2f - write a value to an open file in hexadecimal + */ +define wx2f(value) { + return w2f(outfilename, outfile, "%x\n", value); +}