1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 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
|