aboutsummaryrefslogtreecommitdiff
path: root/sys/mtio/mtparse.x
diff options
context:
space:
mode:
Diffstat (limited to 'sys/mtio/mtparse.x')
-rw-r--r--sys/mtio/mtparse.x126
1 files changed, 126 insertions, 0 deletions
diff --git a/sys/mtio/mtparse.x b/sys/mtio/mtparse.x
new file mode 100644
index 00000000..27622280
--- /dev/null
+++ b/sys/mtio/mtparse.x
@@ -0,0 +1,126 @@
+# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
+
+include <config.h>
+include <syserr.h>
+include <ctype.h>
+include "mtio.h"
+
+# MTPARSE -- Decode a virtual magtape file specification, returning the device
+# name, file and record to which the drive is to be positioned, and any special
+# device attributes (these will override the device defaults). The file and
+# record fields are returned as ERR if missing. Only the drive name field is
+# required.
+#
+# Magtape device syntax:
+#
+# [node!] mtX [ '[' file[.record] [:attr-list] ']' ]
+#
+# for example,
+#
+# mtexb1[4:nb:se@:ts=1200:so=/dev/ttya8]
+#
+# The "mt" prefix is required for the object to be considered a magtape
+# device reference. The device name returned is "mtX" as shown above; there
+# must be an entry for device mtX in the tapecap file in DEV.
+#
+# The file and record numbers are optional. Files and records are numbered
+# starting with 1. A sequence such as "mtX[eot]" will cause the tape to be
+# positioned to end of tape. "mtX[0]" causes the tape to be opened at the
+# current position, i.e., without being moved.
+#
+# The optional attr-list field consists of a sequence of colon-delimited
+# tapecap fields. These will override any values given in the tapecap
+# entry for the device. The syntax for attr-list is the same as in tapecap.
+
+procedure mtparse (mtname, device, sz_device, file, record, attrl, sz_attrl)
+
+char mtname[ARB] #I device specification
+char device[ARB] #O device name as in tapecap
+int sz_device #I max chars in device name
+int file #O file number or -1
+int record #O record number or -1
+char attrl[ARB] #O attribute list
+int sz_attrl #I max char in attribute list
+
+char eotstr[3]
+int ip, op, nchars, ival
+int ctoi(), strncmp(), ki_extnode()
+bool streq()
+define bad_ 91
+
+begin
+ # Extract the node name, if any, from the mtname.
+ ip = ki_extnode (mtname, device, sz_device, nchars) + 1
+ op = nchars + 1
+
+ # Verify that this is a magtape device specification.
+ if (strncmp (mtname[ip], "mt", 2) != 0)
+ goto bad_
+
+ # Extract the device name field.
+ while (mtname[ip] != EOS && mtname[ip] != '[') {
+ device[op] = mtname[ip]
+ op = min (sz_device, op + 1)
+ ip = ip + 1
+ }
+ device[op] = EOS
+
+ file = ERR
+ record = ERR
+ attrl[1] = EOS
+
+ # Process the [...] part of the device specification.
+ if (mtname[ip] == '[') {
+ ip = ip + 1
+
+ # Get the file number.
+ if (ctoi (mtname, ip, ival) > 0) {
+ file = ival
+ if (file < 0)
+ goto bad_
+ } else if (IS_ALPHA(mtname[ip])) {
+ call strcpy (mtname[ip], eotstr, 3)
+ call strlwr (eotstr)
+ if (streq (eotstr, "eot")) {
+ file = EOT
+ ip = ip + 3
+ } else
+ goto bad_
+ }
+
+ # Get the record number.
+ if (mtname[ip] == '.' || mtname[ip] == ',') {
+ ip = ip + 1
+ if (mtname[ip] == ']')
+ record = ERR
+ else if (ctoi (mtname, ip, ival) > 0) {
+ record = ival
+ if (record < 0)
+ goto bad_
+ }
+ }
+
+ # Get the device attribute list.
+ op = 1
+ if (mtname[ip] == ':') {
+ attrl[op] = mtname[ip]
+ op = max(1, min(sz_attrl, op + 1))
+ ip = ip + 1
+
+ while (mtname[ip] != EOS && mtname[ip] != ']') {
+ attrl[op] = mtname[ip]
+ op = max(1, min(sz_attrl, op + 1))
+ ip = ip + 1
+ }
+ }
+ attrl[op] = EOS
+
+ # Check for the ']' terminator.
+ if (mtname[ip] != ']')
+ goto bad_
+ }
+
+ return
+bad_
+ call syserrs (SYS_MTFILSPEC, mtname)
+end