readv [[[delim,]offs,]max,]iname ... =oname ... (-Z-)
readv -name ... iname ... =oname ...
readv - iname = =oname -= ... =- ...
readv (Standardverwendung nach namen-Anmeldung)
---
Etwa wie 'readl', mit Syntax wie 'catv'.
Es wird nacheinander aus existierenden Variablen gelesen,
die zuvor als iname(n) angemeldet werden müssen.
Es wird in bereits existierende Variablen geschrieben,
die zuvor als =oname(n) angemeldet werden müssen.
Es können bis zu 32 Variablen gleichzeitig
angemeldet sein.
Eine Anmeldung meldet eine noch nicht angemeldete
Variable an oder eine abgemeldete erneut an.
Der Lesezeiger des Kommandos wird auf die
iVariable gerichtet und es werden initial gesetzt:
max = Variablengröße [Byte]
offs = 0
delim = '\n' (dezimal=10)
Eine Anmeldung bei bereits vorliegendem Angemeldetstatus
setzt nur den Lesezeiger entsprechend, sofern dabei keine
Parameterwerte explizit angegeben sind:
d,o,m,iname
o,m,iname
m,iname
d,,,iname
d,,m,iname
d,o,,iname
o,,iname
m,iname
Wie zu sehen ist, werden die Parameter anhand der
Position ihrer Werte erkannt.
Variablen, die per Name als 'max' und 'offs' angegeben
sind, werden von readv selbst 'ausgepackt':
readv o,nmax,iname
Selbstverständlich ist $o,$nmax,iname möglich.
Hier packt die Shell eben den Inhalt aus.
---
Eine Abmeldung -name löscht den Lesezeiger,
falls es sich um den aktiven iNamen handelt!
Eine Abmeldung - meldet alle iNamen ab
und löscht den Lesezeiger.
Eine Abmeldung = meldet alle oNamen ab.
Eine Abmeldung -= oder =- meldet alle Namen ab
und löscht den Lesezeiger.
---
Bei Aufruf von readv ohne Argumente wird gelesen
und geschrieben und der Lese-Offset dem Delimiter
entsprechend weitergesetzt.
Die Zielvariablen werden binär gesetzt.
Der Delimiter kann auf jeden Wert von 0..255
gesetzt werden, und zwar per Dezimalzahl oder durch
ein Zeichen ungleich '0'-'9'.
Bei delim='\n' wird '\r\n' automatisch berücksichtigt.
Durch einen Aufruf »readv« wird $. jeweils auf die
Offset-Schrittweite gesetzt, bei Exit==TRUE.
Dadurch ist ein Vorliegen von '\r\n' erkennbar.
Die Zielvariablen werden durch readv nicht vergrößert,
sie müssen vorher schon groß genug sein.
Die Größe der Zielvariablen (${#Z}) variiert je nach
aktuell darin enthaltener Datenmenge/Zeilenlänge.
Eine Veränderung der internen Länge (Claim) jedoch wird
bei bei readv angemeldeten Variablen blockiert.
(Normalerweise wird die Hälfte eines internen Restes
bei Bedarf genutzt.)
---
Wie bei readl erfolgt auch bei readv keine Ausgabe
des Zeilenvorschubs bzw. des Delimiters.
readv braucht keinen abschließenden Delimiter.
---
readv retourniert FALSE, sobald der Offset 'max'
erreicht hat, vor der Leseabsicht.
---
Es gelten folgende Wertegrenzen:
max <= iVariablenlänge
offset <= max
---
Es ist der Gültigkeitsbereich lokaler Variablen
zu beachten!
readv erfährt es nicht, wenn angemeldete Variablen
durch andere Kommandos gelöscht oder verändert werden!
Allerdings informiert der Variablen-Manager readv
bei Änderung von Basiszeigern durch realloc().
---
Vergleich readv <> readl:
-------------------------
readv: 3.52 real 3.46 user 0.00 sys
readl: 14.38 real 6.05 user 8.09 sys
(PIII/700)
Test-Script:
------------
set Z:.250
[ "$1" == readv ] && {
set F:.250000
catv =F <bsh.c #7700 Zeilen
readv 237747,F =Z
to 100 repeat
do
readv 0,,F
while readv
do
nop
done
done
}
[ "$1" == readl ] && {
to 100 repeat
do
<bsh.c
while readl Z
do
nop
done
><
done
}
Es ist zu beachten, daß Variablen 100 MegaByte groß
sein können!
Das Kommando catv in Zusammenarbeit mit conv könnte
letztlich auch die Aufgabe von readv erfüllen.
Jedoch das Lesen bis jeweils zum (angebbaren) Delimiter
hat den Ausschlag für readv gegeben.
catv kann die Daten von readv weitergeben:
catv Z /%r%n =o,,Ziel
let "o+=${#Z}+2"
.
|