aboutsummaryrefslogtreecommitdiff
path: root/noao/digiphot/photcal/io/iogetline.x
diff options
context:
space:
mode:
Diffstat (limited to 'noao/digiphot/photcal/io/iogetline.x')
-rw-r--r--noao/digiphot/photcal/io/iogetline.x89
1 files changed, 89 insertions, 0 deletions
diff --git a/noao/digiphot/photcal/io/iogetline.x b/noao/digiphot/photcal/io/iogetline.x
new file mode 100644
index 00000000..040c4aeb
--- /dev/null
+++ b/noao/digiphot/photcal/io/iogetline.x
@@ -0,0 +1,89 @@
+include "../lib/io.h"
+
+
+# IO_GETLINE -- Get an input line from the data file. The line returned may
+# be composed by one or more physical lines in the output file, if subsequent
+# lines start with a continuation character. The continuation character must
+# be the first character in the subsequent lines. Comment and blank lines
+# are skipped.
+
+int procedure io_getline (fd, line, maxch)
+
+int fd # file descriptor
+char line[maxch] # line from file
+int maxch # line size
+
+bool first # first line ?
+int pending # pending line in buffer ?
+char buffer[SZ_LINE] # line buffer
+
+common /iogetcom/ pending
+
+int fscan()
+int strlen(), strmatch()
+
+begin
+ # Initialize flag to differentiate the first input line
+ # within the loop.
+ first = true
+
+ # Read lines until a non-comment and non-blank line is found, or
+ # the end of the file is reached. Lines starting with a continuation
+ # character are concatenated.
+ repeat {
+
+ # Get next line. If there is no pending line already in
+ # the buffer, read a new line from the file. Otherwise,
+ # use the pending line and clear the pending flag.
+ if (pending == NO) {
+ if (fscan (fd) != EOF)
+ call gargstr (buffer, SZ_LINE)
+ else if (first)
+ return (EOF)
+ else
+ return (OK)
+ } else
+ pending = NO
+
+ # Skip blank and comment lines
+ if (strlen (buffer) == 0)
+ next
+ if (strmatch (buffer, COMMENT) != 0)
+ next
+
+ # If the input line contains a continuation character, then
+ # concatenate it to the accumulated line. Otherwise, leave
+ # it in the buffer, and set the pending flag. For the first
+ # input line no continuation characters are allowed.
+ if (first) {
+ if (strmatch (buffer, CONTINUATION) != 0)
+ call error (0, "Continuation character found in first line")
+ else {
+ call strcpy (buffer, line, maxch)
+ first = false
+ next
+ }
+ } else {
+ if (strmatch (buffer, CONTINUATION) != 0) {
+ call strcat (buffer[2], line, maxch)
+ next
+ } else {
+ pending = YES
+ return (OK)
+ }
+ }
+ }
+end
+
+
+# IO_GETLINE_INIT -- Initialize get line.
+
+procedure io_getline_init ()
+
+int pending # pending line in buffer ?
+
+common /iogetcom/ pending
+
+begin
+ pending = NO
+end