rc-list - mailing list for the rc(1) shell
 help / color / mirror / Atom feed
From: Chris Siebenmann <cks@hawkwind.utcs.toronto.edu>
To: The rc user community <rc@archone.tamu.edu>
Subject: Re: A lighter read function
Date: Wed, 11 Dec 1991 13:28:23 -0600	[thread overview]
Message-ID: <91Dec11.142829est.2716@hawkwind.utcs.toronto.edu> (raw)
In-Reply-To: david's message of Wed, 11 Dec 91 07:28:26 -0500. <22832.692454506@golem.UUCP>

 This has come up before on the mailing list. One cannot use sed, awk,
or handgrown alternatives that use stdio when you are not reading from
a terminal, because their buffering will eat too much of the input
stream and then silently discard it when they exit. You can convince
yourself by defining read in terms of one of them and then doing:
	{echo A; echo B} | {read a; echo a $a; read b; echo b $b}
and noticing what comes out.

 line is safe, and trivial to write; I will happily mail my version
to anyone who wants it. It even comes with a manual page.

 Here is my current version of read along with a couple of functions
that it relies on:

# A real read function, as in 'read var var var'. Returns failure
# on EOF.  relies on the 'line' program.
nl='
'
fn read { _v=() _i=() {
	_v=`` $nl {line; echo $status}
	if (! ~ $_v(2) 0) return $_v(2);
	_v=`{echo $_v(1)}
	for (_i in $*) {
		$_i=$_v(1); sshift _v 1
	}
	$_i=($$_i $_v)
}; return 0; }

# 'supershift' function for rc.
# usage:
#	sshift varname
#	sshift varname number
# shifts the list varname by number (default 1) positions.
fn sshift { if (~ $#* 1 ) { _sshift $1 1 $$1 } else { _sshift $1 $2 $$1 } }

# this function does most of the work.
# _sshift NAME COUNT LISTELEMS
# shift LISTELEMS COUNT items left, and assign the result to NAME.
fn _sshift { _vn=() { _vn=$1; shift; shift $1; shift; $_vn=$* } }

	- cks


  reply	other threads:[~1991-12-11 19:29 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1991-12-11  4:32 DaviD W. Sanderson
1991-12-11 12:28 ` David J. Fiander
1991-12-11 19:28   ` Chris Siebenmann [this message]
1991-12-13  0:58     ` David J. Fiander
1991-12-13  1:37       ` Chris Siebenmann
1991-12-13  1:47       ` David Hogan
1991-12-11 21:48   ` Ronald S H Khoo
1991-12-12 12:16     ` David J. Fiander
  -- strict thread matches above, loose matches on Subject: below --
1991-12-11  3:53 David J. Fiander

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=91Dec11.142829est.2716@hawkwind.utcs.toronto.edu \
    --to=cks@hawkwind.utcs.toronto.edu \
    --cc=rc@archone.tamu.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).